Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Тяжёлые алгоритмы на стероидах (MD5, Base64, CRC32, JPEG, PNG)
Запись от BlooDHounD размещена 11.06.2010 в 18:51
Обновил(-а) BlooDHounD 06.07.2010 в 15:10 (поменял вложения)
Обновил(-а) BlooDHounD 06.07.2010 в 15:10 (поменял вложения)
Реализовал парочку алгоритмов на замену аналогам из as3corelib:
исходник бенчмарка:
некоторые особенности реализации:
скачать библиотеку можно тут: http://www.blooddy.by
- 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
Код AS3:
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 кэширует все промежуточные таблицы. то есть начиная со второй картинки алгоритм работает чуточку быстрее.
скачать библиотеку можно тут: http://www.blooddy.byВсего комментариев 55
Комментарии
|
|
|
А код можно пощупать? HaXe почти не знаю, однако результаты впечатляют =) Отличная работа.
|
|
|
|
Браво, маэстро! С такими скоростями эта штука позволит мне реализовать старую задумку.
|
|
|
|
Знай наших! Респект и уважуха!
А что значит "пропущен через mxmlc"? Можно подробности? |
|
|
Обновил(-а) Котяра 11.06.2010 в 21:00
|
|
|
|
перезалил swc с исправленным JPEGEncoder'ом.
|
|
|
|
заработало
как насчет лицензии использования? и сам как, используешь в своих проектах, или только намереваешься? |
|
|
|
kutuzov, ну рас я swc выложил, то наверно не для "подразниться" =) юзай конечно. использую в своих проектах по прямому назначению =)
|
|
|
|
было бы классно, если гиф добавил.
спасибо. |
|
|
|
kutuzov, предполагаемый размер можно вычислить только как это делаются остальные =) написали формулу основываясь на средних показателях и выдают. без запуска алгоритма я не умею.
|
|
|
|
Эм.
Такой вопрос: а CRC32 можно добавить метод из стринга для удобства сразу? ![]() А жаль исходников нет чистых, а то еще понадобился CRC64, который ничем не отличается почти. P.S. Спасибо ![]() |
|
|
Обновил(-а) Сайлас 19.06.2010 в 01:02
|
|
|
|
CRC32 используется в PNG. поэтому он есть в библиотеке.
|
|
|
|
большое спасибо, крайне полезно.
|
|
|
|
FSBmipt, чудес не бывает.
|
Последние записи от BlooDHounD
- Обновление blooddy_crypto.swc (06.07.2010)
- Идиотизмы: кэширование? да ну его! (02.07.2010)
- Идиотизмы: не ByteArray а мусорка (29.06.2010)
- Скрытый потенциал Error (27.06.2010)
- Идиотизмы: с чем готовить haXe для флэш-гурмана? (15.06.2010)














