Java: Тестирование Алгоритмов Сжатия – 16 Файлов, 5 Типов

Привет «ХабраСообщество»! Публикую краткий обзор и результаты тестирования основных алгоритмов сжатия с помощью Java. Для интересующихся прошу скидку; для тех, кто нет, просьба не минусовать и говорить, что тема не достойна хабра - помещу ее в черновики.

Так:

  • SteriaLZH — это реализация алгоритма lzh, который на данный момент актуален в проекте, над которым работает компания, и из-за чего возникла задача найти лучшую альтернативу.

  • Не все найденные алгоритмы (реализации сжатия файлов и данных) были протестированы.

    Например JZip от JCraft и еще несколько, все что я тестировал можно увидеть в табличке.

  • Тестировалось только сжатие, декомпрессия не тестировалась.

  • В ходе тестирования рассчитывались 5 параметров: степень сжатия, минимальное время [мс], среднее время [мс], медианное время [мс], максимальное время [мс].

  • хорошие компрессоры прогоняли файлы 1000 раз, а не 10. Ниже табличка что, сколько и для чего.

  • поток — реализация (алгоритмы): принимаем имя файла, затем соответственно читаем файл в InputStream и создаем (сохраняем) с помощью OutputStream.
  • блок — реализация (алгоритмы): мы принимаем файл как байт[], сжимаем его и получаем обратно сжатый байт[].

  • При потоковом сжатии сжатые файлы удалялись перед повторным созданием.

  • протестировано на Lenovo thinkpad T420 (Intel Core i5-2540M, процессор 2,6 ГГц, 4 ГБ ОЗУ), WinXP: SP3.


Таблица, показывающая, что запускалось и сколько раз:
Стерия.

ЛЖ 100 java.util.zip.GZIP(поток) 1000 java.util.zip.Deflater.BEST_COMPRESSION (блок) 1000 java.util.zip.Deflater.BEST_SPEED (блок) 1000 java.util.zip.Deflater.HUFFMAN_ONLY (блок) 1000 apache.commons.compress.BZIP2 (поток) 10 apache.commons.compress.GZIP (поток) 1000 apache.commons.compress.XZ (поток) 10 com.ning.LZF (блок) 1000 com.ning.LZF (поток) 10 QuickLZ (блок) 1000 org.xerial.snappy.Snappy (блок) 1000

Вот так были сделаны замеры.

Код — мое творение, у каждого свой стиль.

Так что прошу вас не слишком обсуждать ПРАВИЛЬНОСТЬ.



время: для каждого отдельного алгоритма (реализации) был создан класс с публичной функцией, которую я вызываю, передавая ее в качестве аргумента или пути к файлу или байту[].

  
  
  
   

start = System.nanoTime(); byte[] compressedArray = compressor.compressing(arrayToCompress); end = System.nanoTime(); resultTime = end - start; start = System.nanoTime(); compressor.compressing(fileToCompress); end = System.nanoTime(); resultTime = end - start;



Измерение минимального времени [мс], среднего времени [мс], медианного времени [мс], максимального времени [мс]: все измеренные значения времени конкретного файла были получены в ArrayList.


private void minMaxMedianAverCalculation(int element) { ResultsSaver resultsSaver = (ResultsSaver) compressorsResults.get(activeTest); ArrayList<Long> elementsList = new ArrayList<Long>(); for (int i = 0; i < TEST_COUNT; i++) { long timeElement = resultsSaver.getNanoSecondsTime(i, element); elementsList.add(timeElement); } Collections.sort(elementsList); this.min = (elementsList.get(0)) / 1000000; this.max = (elementsList.get(elementsList.size() - 1)) / 1000000; int elementsListLength = elementsList.size(); if (elementsListLength % 2 == 0) { int m1 = (elementsListLength - 1) / 2; int m2 = m1 + 1; this.median = ((elementsList.get(m1) + elementsList.get(m2)) / 2) / 1000000; } else { int m = elementsListLength / 2; this.median = elementsList.get(m) / 1000000; } long totalTime = 0; for (int i = 0; i < elementsListLength; i++) { totalTime += elementsList.get(i); } this.average = (totalTime / TEST_COUNT)/1000000; }



Измерение степени сжатия потока:


private void setStreamCompressionRatio(String toCompressFileName, String compressedFileName) { ResultsSaver resultsSaver = (ResultsSaver) compressorsResults.get(activeTest); File fileToCompress = new File(toCompressFileName); long fileToCompressSize = fileToCompress.length(); File compressedFile = new File(compressedFileName); long compressedFileSize = compressedFile.length(); double compressPercent = Math.round(((double) compressedFileSize * 100) / fileToCompressSize * 100) / 100.0d; resultsSaver.setCompressionRatio(compressPercent); }



Измерение степени сжатия блока:


private void setBlockCompressionRatio(byte[] arrayToCompress, byte[] compressedArray) { ResultsSaver resultsSaver = (ResultsSaver) compressorsResults.get(activeTest); long arrayToCompressSize = arrayToCompress.length; long compressedArraySize = compressedArray.length; double compressPercent = Math.round(((double) compressedArraySize * 100) / arrayToCompressSize * 100) / 100.0d; resultsSaver.setCompressionRatio(compressPercent); }



Что было сжато:
TextDat_1Kb.txt – простой текст какой-нибудь статьи из Википедии (на английском языке).

TextDat_100Kb.txt — простой текст некоторых статей из Википедии (англ.

).

TextDat_1000Kb.txt — простой текст некоторых статей из Википедии (английский, немецкий, испанский.

).

PdfDat_200Kb.pdf – то же, что *.

doc, только преобразованный и скорректированный по размеру.

PdfDat_1000Kb.pdf – то же, что *.

doc, только преобразованный и скорректированный по размеру.

PdfDat_2000Kb.pdf – то же, что *.

doc, только преобразованный и скорректированный по размеру.

HtmlDat_10Kb.htm – текст какой-то документации без картинок с тегами, то есть в формате html. HtmlDat_100Kb.htm – текст какой-то документации без картинок с тегами, то есть в формате html. HtmlDat_1000Kb.htm – текст какой-то документации без картинок с тегами, то есть в формате html. ExcelDat_200Kb.xls – заполняется случайными числами от 0 до 1 с помощью функции Excel random().

ExcelDat_1000Kb.xls – заполняется случайными числами от 0 до 1 с помощью функции Excel random().

ExcelDat_2000Kb.xls – заполняется случайными числами от 0 до 1 с помощью функции Excel random().

DocDat_500Kb.doc - тексты статей из Википедии с несколькими картинками (английский, немецкий, испанский.

).

DocDat_1000Kb.doc - тексты статей из Википедии с несколькими картинками (английский, немецкий, испанский.

).

DocDat_2000Kb.doc - тексты статей из Википедии с несколькими картинками (английский, немецкий, испанский.

).

HtmDat_30000Kb.htm – форматированный текст и таблицы с цифрами.



Иииии, результаты: habrastorage.org - он выдал следующие картинки, полный размер 1800*615, может кто знает как увеличить по клику?


Java: Тестирование алгоритмов сжатия – 16 файлов, 5 типов



Java: Тестирование алгоритмов сжатия – 16 файлов, 5 типов



Java: Тестирование алгоритмов сжатия – 16 файлов, 5 типов



Java: Тестирование алгоритмов сжатия – 16 файлов, 5 типов



Java: Тестирование алгоритмов сжатия – 16 файлов, 5 типов

… Я сделал это правильно, не правильно, надеюсь, я сделал это правильно, но я сделал это! Любой, у кого есть мысли, готов к критике! Выкладываю - может кому-то будет полезно.

Некоторые результаты мне кажутся странными, но цифры, которые получились в итоге, — это то, что я занес в таблицу.

Не знаю, можно ли аккуратно вставлять таблицы Excel, поэтому кидаю картинки.

Если кому нужен excel файл, выложу без проблем.

P.S. Спасибо за внимание, рад, что вы дочитали до конца.

:) Теги: #java #Алгоритмы #тестирование #сжатие данных #тестирование ИТ-систем #java #Алгоритмы

Вместе с данным постом часто просматривают:

Автор Статьи


Зарегистрирован: 2019-12-10 15:07:06
Баллов опыта: 0
Всего постов на сайте: 0
Всего комментарий на сайте: 0
Dima Manisha

Dima Manisha

Эксперт Wmlog. Профессиональный веб-мастер, SEO-специалист, дизайнер, маркетолог и интернет-предприниматель.