сжимающий) алгоритм
А ещё лучше в pure pascal
А ещё лучше одним *.pas файлом
?
так слёту только paszlib если прикручивать
ZLib который(-ая?) в TCompressionStream И Deflate, который как правило в ZIP Это одно и тоже или нет?
Ага, судя по информации в интернете - что Zip(как правило с алго deflate), что ZLib - это одно и тоже
Зачем тебе такое старье? Штатного zlib за глаза. В дельфе юзается сишный обьектник, в лазаре там да, там тормозная реализация- поэтому у себя в fwzip для лазаря тож обьектники сгенерил
Какая разница по скорости примерно? x2 есть?
По скорости сравнивать с чем?
LZ4 - вроде как не сильно в степени компрессии проигрывает, зато выигрывает по времени значительно Zstd - не старьё По скорости - по сравнению с лазаревской реализацией vs твоя
Есть LZW на чистом паскале. Прикрути его к Stream, он уже там есть.
А смысл в "чистом" паскале?
бывает что есть смысл, когда нужно что-то править. мы правили для себя
T7zStream из https://github.com/geoffsmith82/d7zip
Иии, вопрос кторый я задавал как то Розычу, по его FWZip - А он сам жмёт?
черным по зеленому написано "wrapper around 7z.dll"
нет, там же объектники, как он ответил чуть выше
FWZip это реализация ZIP контейнера, чем жать - ему пофиг. Конкретно щас он жмет zlib-ом, но легко можно подключить любую другую реализацию
Где такое написано?
Если для сжатия передаваемых данных, то достаточно обычного deflate из zip. Он быстрый и потоковый. А если надо максимум компрессии и времени не жалко, то тут надо к разным видам данных разный подход применять. Для текстов, звуков и картинок есть свои лучшие алгоритмы. Или жать все LZMA из 7zip, он очень долгий, но универсальный.
для сжатия и быстро TCompressionStream из FPC/Lazarus не так уж и быстр на хорошо сжимаемых данных - он быстр, на плохосжимаемых 350мегов жмёт 9сек плохосжимаемые: for i:=0 to size-1 do if random(5)=0 then buf[i]:=random(255);
Там вроде есть уровни компрессии, можно с ними поэкспериментировать. Вроде первый уровень быстрее копировния, но при этом даже жмет
я итак на fastest тесчу )
а дельфевый сколько жмет по времени?
Один из самых быстрых - google snappy, но нативной реализации под Паскаль нету. Есть только распаковка, причем которую пилил я давным давно. И есть биндинги к либе, ещё в сети можно нагуглить вариант с смешными объектниками для дельфей, но это старый сишный порт оригинала
#Lazarus #FPC -O4 TCompressionStream (size = 350.00Mb, random_k = 1) time:12.20, Size: 350.11 Mb TCompressionStream (size = 350.00Mb, random_k = 2) time:13.43, Size: 255.88 Mb TCompressionStream (size = 350.00Mb, random_k = 3) time:11.45, Size: 200.83 Mb TCompressionStream (size = 350.00Mb, random_k = 4) time:10.00, Size: 167.88 Mb TCompressionStream (size = 350.00Mb, random_k = 8) time:6.60, Size: 106.68 Mb TCompressionStream (size = 350.00Mb, random_k = 16) time:4.25, Size: 65.28 Mb TCompressionStream (size = 350.00Mb, random_k = 32) time:2.83, Size: 38.45 Mb TCompressionStream (size = 350.00Mb, random_k = 64) time:2.05, Size: 22.10 Mb TCompressionStream (size = 350.00Mb, random_k = 128) time:1.68, Size: 12.69 Mb TCompressionStream (size = 350.00Mb, random_k = 256) time:1.50, Size: 7.50 Mb #Delphi 11 CE x64 Release TCompressionStream (size = 350.00Mb, random_k = 1) time:8.49, Size: 350.11 Mb TCompressionStream (size = 350.00Mb, random_k = 2) time:9.20, Size: 255.90 Mb TCompressionStream (size = 350.00Mb, random_k = 3) time:7.71, Size: 200.84 Mb TCompressionStream (size = 350.00Mb, random_k = 4) time:6.59, Size: 167.90 Mb TCompressionStream (size = 350.00Mb, random_k = 8) time:4.31, Size: 106.68 Mb TCompressionStream (size = 350.00Mb, random_k = 16) time:2.70, Size: 65.28 Mb TCompressionStream (size = 350.00Mb, random_k = 32) time:1.76, Size: 38.46 Mb TCompressionStream (size = 350.00Mb, random_k = 64) time:1.23, Size: 22.08 Mb TCompressionStream (size = 350.00Mb, random_k = 128) time:0.97, Size: 12.69 Mb TCompressionStream (size = 350.00Mb, random_k = 256) time:0.85, Size: 7.50 Mb program Project1; {$mode objfpc}{$h+} // FPC {$APPTYPE CONSOLE} // Delphi uses SysUtils,classes ,System.ZLib // Delphi //,zstream // FPC ; const size = 1024*1024*350; procedure TestTCompressionStream(size, random_koef: integer); var i:integer; mem_source: pbyte; ms,cs:tstream; t:Double; begin getmem(mem_source, size); FillChar(mem_source^, size, 0); for i:=size-1 downto 0 do if random(random_koef)=0 then mem_source[i]:=Random(255); ms := TMemoryStream.Create; cs := TCompressionStream.Create(clfastest, ms); t:=Now; cs.Write(mem_source^, size); cs.Free; WriteLn('TCompressionStream (size = ', size/1024/1024:0:2,'Mb', ', random_k = ',random_koef, ') time:',(Now-t)*SecsPerDay:0:2, ', Size: ',ms.Size/1024/1024:0:2,' Mb' ); ms.Free; Freemem(mem_source); end; begin TestTCompressionStream(size, 1); TestTCompressionStream(size, 2); TestTCompressionStream(size, 3); TestTCompressionStream(size, 4); TestTCompressionStream(size, 8); TestTCompressionStream(size, 16); TestTCompressionStream(size, 32); TestTCompressionStream(size, 64); TestTCompressionStream(size, 128); TestTCompressionStream(size, 256); WriteLn('Done...'); ReadLn; end.
ну возьми вот этот стрим и проверь https://github.com/AlexanderBagel/FWZip/blob/master/FWZipZLib.pas
там объектники у тебя, я хотел на pure pascal Да ладно уже, пуст как будет - так и будет
т.е. обьектники в дельфи тебя не смущают? :)))))))
неа ) они без делфи не существуют отдельно, есть делфи - есть объектники я люблю когда либо из коробки, либо файлов мало, внешних зависимостей
А, коробочное - понятно. Удачи :)
это религиозное что-то :)
Макаронный монстр
Я тебе просто по своему опыту скажу что коробочное что в дельфе что в лазаре мало что юзабельно на дистанции, соответственно именно поэтому я почти на все аналоги написал которые работают правильно
Вот это я понимаю! TZstdAlgoCompression (size = 350.00Mb, random_k = 1) time:0.16, Size: 350.01 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 2) time:1.08, Size: 224.57 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 3) time:1.27, Size: 176.09 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 4) time:1.34, Size: 148.10 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 8) time:1.27, Size: 93.22 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 16) time:1.00, Size: 54.52 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 32) time:0.65, Size: 30.34 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 64) time:0.39, Size: 16.51 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 128) time:0.24, Size: 8.90 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 256) time:0.16, Size: 4.82 Mb
1 секунда на что угодно )
ну и живи с zipper.pp или как там его ) а я буду с Zstd Ещё и жмёт лучше! И это на самом минимальном уровне компрессии
зиппер из коробки, хоть он мне и не нравится. и трахаться с объектниками Сишными я не люблю. и длл дополнительную не хочется
ну я по началу тоже так хотел но на одном из случаев я сдался, не хочу ждать, если можно небольшим усилием всё ускорить в 10 раз
распаковывает теперь ок, упаковка мне, к счастью, некритична. Значит, могу пользоваться
Ну вот к примеру на уровне компрессии = 9 (предыдущий результат был при уровне = 1 (минимальный)) TZstdAlgoCompression (size = 350.00Mb, random_k = 1) time:0.43, Size: 350.01 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 2) time:11.35, Size: 242.81 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 3) time:12.89, Size: 184.74 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 4) time:12.80, Size: 149.63 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 8) time:10.05, Size: 87.46 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 16) time:6.77, Size: 49.91 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 32) time:4.32, Size: 27.89 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 64) time:2.82, Size: 15.17 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 128) time:1.88, Size: 7.96 Mb TZstdAlgoCompression (size = 350.00Mb, random_k = 256) time:1.18, Size: 4.08 Mb Похоже на правду? Что интересно выйгрыша по компрессии особого нету, зато по времени просадка значительная
А по каким признакам ты определяешь?
ну архиватор ты написал - теперь пиши разархиватор
Compression speed can vary by a factor of 20 or more between the fastest and slowest levels, while decompression is uniformly fast, varying by less than 20% between the fastest and slowest levels.
Заполнение Random'ом занимает больше времени, чем упаковка 😄 кратно
@Awkward_im В общем дело-то возможно даже было не в TCompressionStream 😁 А в том, что я VTV заполняю нодами поштучно - это вызывает каждый раз перевыделение памяти А нод у меня о-ё-ёй! ) Так-что тут ты прав ) Надо или сохранять количество детей в ноде и выделять память разом, или + перейти на ленивую загрузку (но это сложнее)
Ваще vtv заточена на такое, там даже тест есть на скорость создания ляма узлов (только зачем такое в гуе, лям узлов???)
в профайлере - дерево у меня, они есть, но отображаются-то не все юзвер ходит и смотрит где больше кол-во выделений или объём
Да уж, было не просто... пришлось делать самолепный индекс нод для возможности нормального ленивого чтения дерева
Неймспейсы рулят, у меня ленивое через низ сделано
никогда раньше такого не делал ) думал да чего там какое-то дерево сериализовать и потом читать в ленивом режиме, оказалось не всё так просто как на первый взгляд 😄 А неймспейсы - это как? ключевые слова для гугления
Виртуальная файловая система
Обсуждают сегодня