Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Тяжёлые алгоритмы на стероидах (MD5, Base64, CRC32, JPEG, PNG)
Запись от BlooDHounD размещена 11.06.2010 в 19:51
Обновил(-а) BlooDHounD 11.04.2016 в 22:18 (поменял вложения)
Обновил(-а) BlooDHounD 11.04.2016 в 22:18 (поменял вложения)
Реализовал парочку алгоритмов на замену аналогам из as3corelib:
- MD5
- Base64
- JPEG
- PNG
Код:
by.blooddy.crypto.MD5.hashBytes: 40 com.adobe.crypto.MD5.hashBytes: 4483 by.blooddy.crypto.Base64.encode: 115 mx.utils.Base64Encoder: 1635 by.blooddy.crypto.Base64.decode: 141 mx.utils.Base64Decoder: 2762 by.blooddy.crypto.image.JPEGEncoder.encode: 447 com.adobe.images.JPGEncoder: 3496 by.blooddy.crypto.image.PNG24Encoder.encode: 538 com.adobe.images.PNGEncoder.encode: 1423
package { import by.blooddy.crypto.Base64; import by.blooddy.crypto.MD5; import by.blooddy.crypto.image.JPEGEncoder; import by.blooddy.crypto.image.PNG24Encoder; import com.adobe.crypto.MD5; import com.adobe.images.JPGEncoder; import com.adobe.images.PNGEncoder; import flash.display.BitmapData; import flash.display.Sprite; import flash.text.TextField; import flash.utils.ByteArray; import flash.utils.getTimer; import mx.utils.Base64Decoder; import mx.utils.Base64Encoder; [SWF( scriptTimeLimit="255" )] public class test extends Sprite { /** * Constructor */ public function test() { super(); var text:String = ''; var t:Number; // BitmapData для тестов var bmp:BitmapData = new BitmapData( 1024, 1024, true, 0xFFFF0000 ); bmp.noise( int( Math.random() * int.MAX_VALUE ), 0, 0xFF, 7, false ); // генерируем шум // ByteArray для тестов var bytes:ByteArray = bmp.getPixels( bmp.rect ); // тест MD5 t = getTimer(); by.blooddy.crypto.MD5.hashBytes( bytes ); text += '\nby.blooddy.crypto.MD5.hashBytes: ' + ( getTimer() - t ); // 40 t = getTimer(); com.adobe.crypto.MD5.hashBytes( bytes ); text += '\ncom.adobe.crypto.MD5.hashBytes: ' + ( getTimer() - t ); // 4483 // тест Base64 encode t = getTimer(); var s1:String = by.blooddy.crypto.Base64.encode( bytes, true ); text += '\nby.blooddy.crypto.Base64.encode: ' + ( getTimer() - t ); // 115 t = getTimer(); var e:Base64Encoder = new Base64Encoder(); e.encodeBytes( bytes ); var s2:String = e.flush(); text += '\nmx.utils.Base64Encoder: ' + ( getTimer() - t ); // 1635 // тест Base64 decode t = getTimer(); by.blooddy.crypto.Base64.decode( s1 ); text += '\nby.blooddy.crypto.Base64.decode: ' + ( getTimer() - t ); // 141 t = getTimer(); var d:Base64Decoder = new Base64Decoder(); d.decode( s2 ); d.flush(); text += '\nmx.utils.Base64Decoder: ' + ( getTimer() - t ); // 2762 // тест JPEG t = getTimer(); by.blooddy.crypto.image.JPEGEncoder.encode( bmp, 60 ); text += '\nby.blooddy.crypto.image.JPEGEncoder.encode: ' + ( getTimer() - t ); // 447 t = getTimer(); ( new com.adobe.images.JPGEncoder( 60 ) ).encode( bmp ); text += '\ncom.adobe.images.JPGEncoder: ' + ( getTimer() - t ); // 3496 // тест PNG t = getTimer(); by.blooddy.crypto.image.PNG24Encoder.encode( bmp ); text += '\nby.blooddy.crypto.image.PNG24Encoder.encode: ' + ( getTimer() - t ); // 538 t = getTimer(); com.adobe.images.PNGEncoder.encode( bmp ); text += '\ncom.adobe.images.PNGEncoder.encode: ' + ( getTimer() - t ); // 1423 var tf:TextField = new TextField(); tf.autoSize = 'left'; tf.text = text; super.addChild( tf ); } } }
- всё это дело написано при помощи haXe, после чего пропущено через mxmlc, что бы убрать мусор, которым haXe всё засоряет
- все классы на полную катушку используют скрытые операторы для работы с памятью
- JPEGEncoder кэширует все промежуточные таблицы. то есть начиная со второй картинки алгоритм работает чуточку быстрее.
---------------
Всего комментариев 63
Комментарии
![]() ![]() |
|
А код можно пощупать? HaXe почти не знаю, однако результаты впечатляют =) Отличная работа.
|
![]() ![]() |
|
Браво, маэстро! С такими скоростями эта штука позволит мне реализовать старую задумку.
|
![]() ![]() |
|
Знай наших! Респект и уважуха!
А что значит "пропущен через mxmlc"? Можно подробности? |
|
Обновил(-а) Котяра 11.06.2010 в 22:00
|
![]() ![]() |
|
перезалил swc с исправленным JPEGEncoder'ом.
|
![]() ![]() |
|
заработало
как насчет лицензии использования? и сам как, используешь в своих проектах, или только намереваешься? |
![]() ![]() |
|
kutuzov, ну рас я swc выложил, то наверно не для "подразниться" =) юзай конечно. использую в своих проектах по прямому назначению =)
|
![]() ![]() |
|
было бы классно, если гиф добавил.
спасибо. |
![]() ![]() |
|
kutuzov, предполагаемый размер можно вычислить только как это делаются остальные =) написали формулу основываясь на средних показателях и выдают. без запуска алгоритма я не умею.
|
![]() ![]() |
|
Эм.
Такой вопрос: а CRC32 можно добавить метод из стринга для удобства сразу? ![]() А жаль исходников нет чистых, а то еще понадобился CRC64, который ничем не отличается почти. P.S. Спасибо ![]() |
|
Обновил(-а) Сайлас 19.06.2010 в 02:02
|
![]() ![]() |
|
CRC32 используется в PNG. поэтому он есть в библиотеке.
|
![]() ![]() |
|
большое спасибо, крайне полезно.
|
![]() ![]() |
|
FSBmipt, чудес не бывает.
|
![]() ![]() |
|
FSBmipt, да быть такого не может -) может Вы optimize убираете вместе с добавлением либы?
|
![]() ![]() |
|
Да я сам глазам не верю )
Либы у нас лежат в двух папках libs и external, в первой прописываются в compiler.library-path: <compiler.library-path dir="${swc.lib.dir}" append="true"> <include name="*.swc" /> </compiler.library-path> Вторые в external: <compiler.external-library-path dir="${swc.lib.external.dir}" append="true"> <include name="*.swc" /> </compiler.external-library-path> В коде есть строка: Base64.decode("234"); Если положить blooddy_crypto.swc в папку libs swf весит 657 кб Если положить в папку external: swf весит 346 кб Если удалить строку Base64.decode("234"), swf в обоих случаях весит 346 кб. И это факт ) Такое поведение наблюдается на всех проектах, собираем SDK 3.4.1 и SDK 3.2.0, другие параметры сборки: debug="false" target-player="10.0.0" flex-config.xml дефолтный из sdk. |
|
Обновил(-а) FSBmipt 30.06.2010 в 15:37
|
![]() ![]() |
|
ну что я вам могу сказать ... у меня as3corelib весит 250кб. моя библиотека весит 25кб.
генерируейте отчёт о компиляции и смотри сколько у вас что весит. |
![]() ![]() |
|
>Вы бы СДК какой-нибудь по-новее попробовали.
Пробовали и в 3.4.1 я писал выше, такой же результат ( >в общем повторюсь: ищите косяк у себя. декомпилятором откройте в конце концов. Это делали в первую очередь, кроме упомянутых классов ничего нет. Так же тестили на _чистом_ Flex проекте с строкой Base64.encode("awsd"), размер вырастает так же на ~150кб. Кстати это не только у меня, но и у всех наших разработчиков наблюдается. |
|
Обновил(-а) FSBmipt 30.06.2010 в 16:40
|
![]() ![]() |
|
Наверное нужен доктор Хаус. У моего подопытного симптомы те-же.
Можно потестить создав пустой Flex проект с единственным xml файлом: <?xml version="1.0" encoding="utf-8"?> <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute" creationComplete="init()"> <mx:Script> <![CDATA[ import by.blooddy.crypto.Base64; public function init():void{ var ba:ByteArray = Base64.decode("qwerty"); } ]]> </mx:Script> </mx:Application> Коментим 2 строчки с Base64 получаем релиз 177 кб. |
|
Обновил(-а) Diestro 30.06.2010 в 16:47
|
![]() ![]() |
|
создал пустой Flex 4 проект. вставил код. увеличение размера файла на фоне 1 мб даже не заметил. что-то около 2 кб. что я сделал не так?
|
![]() ![]() |
|
>создал пустой Flex 4 проект
Речь идет о Flex 3 проекте ![]() UPD. На Flex SDK 4.0 такой баги нет, мы проверили. |
![]() ![]() |
|
Я ж вроде от 3го Flex`a код показал
![]() |
![]() ![]() |
|
Diestro, ну я вообще флексом не пользуюсь. у меня всё и так в шоколаде )
|
![]() ![]() |
|
А у всех кто пользуется FlexSDK 3.x и вашей либой все не так шоколадно.
И вообще, отнеситесь к этому не как к критике, а как к баг-репорту ![]() |
![]() ![]() |
|
А какая разница кто чем код редактирует? Я естественно имел ввиду флэксовый фреймворк 3й версии. Версии SDK тоже пробовал разные и 3.2, и 3.4.1.10084 - результат тот же.
|
![]() ![]() |
|
Diestro, а кто где говорил про редакторы?
|
![]() ![]() |
|
Цитата:
просто оно как-то вызывается присутствием моей либы
![]() А... если имелся ввиду флэксовый фреймворк, то в данном примере он как раз позволяет нагнать кучу кода в пару строчек, чтобы увеличить размер флэшки на выходе. При использовании либы флэшка растет независимо от использования флэксовых классов. |
|
Обновил(-а) Diestro 30.06.2010 в 18:10
|
![]() ![]() |
|
Diestro, а вы другие либы подключали?
|
![]() ![]() |
|
Ага, при использовании аналогов из as3corelib размер растет как положено по килобайтикам. Я ж говорю, симптомы те же.
|
![]() ![]() |
|
Diestro, то есть независимо от того флексовый это проект или нет, он у вас всё равно на 150кб больше?
|
![]() ![]() |
|
http://bugs.adobe.com/jira/browse/SDK-26814
Вот такие вот пироги с котятами. |
![]() ![]() |
|
Цитата:
Diestro, то есть независимо от того флексовый это проект или нет, он у вас всё равно на 150кб больше?
Цитата:
При использовании либы флэшка растет независимо от использования флэксовых классов.
Цитата:
Вот такие вот пироги с котятами.
|
|
Обновил(-а) Diestro 01.07.2010 в 01:14
|
![]() ![]() |
|
Цитата:
При использовании либы флэшка растет независимо от использования флэксовых классов.
Из минусов - необходимо будет асинхронно проинициализировать либу (лоадер для swf-ки синхронно работать не умеет) где-нть при старте приложения, зато с размером приложения, использующего эту либу будет все ОК. |
|
Обновил(-а) expl 15.08.2010 в 20:56
|
![]() ![]() |
|
expl, а можно просто взять компилятор поновее.
|
![]() ![]() |
|
Ктож спорит, лучше, но многие до сих пор на 3-м flex-фремворке работают.
|
![]() ![]() |
|
а кто мешает работать с новым компилятором но со старым фрэймворком?
|
Последние записи от BlooDHounD
- Обновление blooddy_crypto.swc до версии 0.5.1 (31.03.2016)
- Кто не успел - тот опоздал (19.04.2011)
- Обновление blooddy_crypto.swc до версии 0.3.1 (29.11.2010)
- blooddy_crypto.swc теперь умеет JSON (13.10.2010)
- Загадочный CommaExpression (06.09.2010)