Форум Flasher.ru
Ближайшие курсы в Школе RealTime
Adobe FLASH | Базовый курс : [см.]  
  11 октября 2010
Adobe FLASH | Углубленное программирование : [см.]  
  20 сентября 2010
 
Регистрация Блоги Правила Справка Пользователи Календарь Поиск рулит! Сообщения за день Все разделы прочитаны



Вернуться   Форум Flasher.ru > Блоги > Идиотизмы

Даже в определениях идиотизма встречается идиотизм.
Цитата:
Идиотизм — устаревшее название идиомы
Идиома в программировании — понятие близкое к понятию шаблона проектирования. Идиомы представляют собой шаблоны проектирования, учитывающие специфику конкретного языка программирования и потому не универсальные. Это хорошие решения проектирования для конкретного языка или программной платформы.
Рейтинг: 5.00. Голосов: 4.

Тяжёлые алгоритмы на стероидах (MD5, Base64, CRC32, JPEG, PNG)

Запись от BlooDHounD размещена 11.06.2010 в 18:51
Обновил(-а) BlooDHounD 06.07.2010 в 15:10 (поменял вложения)
Реализовал парочку алгоритмов на замену аналогам из 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
исходник бенчмарка:
Код 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
Вложения
Тип файла: swf benchmark.swf (28.9 Кб, 155 просмотров)
Размещено в ActionScript , compiler , haXe
Комментарии 55 Отправить другу ссылку на эту запись
Всего комментариев 55

Комментарии

Старый 11.06.2010 19:54 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
А код можно пощупать? HaXe почти не знаю, однако результаты впечатляют =) Отличная работа.
Старый 11.06.2010 20:23 dimarik вне форума
dimarik
 
Аватар для dimarik
Браво, маэстро! С такими скоростями эта штука позволит мне реализовать старую задумку.
Старый 11.06.2010 20:25 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
у меня жпеги кодятся по разному
Код AS3:
const bmd:BitmapData = new BitmapData(320, 240, true, 0);
bmd.noise(0);
 
//const f:FileReference = new FileReference();
//f.save((new com.adobe.images.JPGEncoder(60)).encode(bmd), "qwe1.jpg");
//f.save(by.blooddy.crypto.image.JPEGEncoder.encode(bmd, 60), "qwe2.jpg");
 
trace((new com.adobe.images.JPGEncoder(60)).encode(bmd).length) // 75871
trace(by.blooddy.crypto.image.JPEGEncoder.encode(bmd, 60).length) // 38861
в файле от адоби видно картинку-шум
а файл от тебя не просматривается и при открытии пишет что "Bad or unrecognized image header"
тестирую последним плеером 10.1
Старый 11.06.2010 20:57 Котяра вне форума
Котяра
 
Аватар для Котяра
Знай наших! Респект и уважуха!
А что значит "пропущен через mxmlc"?
Можно подробности?
Обновил(-а) Котяра 11.06.2010 в 21:00
Старый 12.06.2010 17:17 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
перезалил swc с исправленным JPEGEncoder'ом.
Старый 12.06.2010 18:02 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
заработало
как насчет лицензии использования?
и сам как, используешь в своих проектах, или только намереваешься?
Старый 12.06.2010 20:15 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
kutuzov, ну рас я swc выложил, то наверно не для "подразниться" =) юзай конечно. использую в своих проектах по прямому назначению =)
Старый 13.06.2010 22:02 tonnon вне форума
tonnon
 
Аватар для tonnon
было бы классно, если гиф добавил.
спасибо.
Старый 14.06.2010 16:07 Psycho Tiger вне форума
Psycho Tiger
 
Аватар для Psycho Tiger
Кстати,
Цитата:
JPEGEncoder кэширует все промежуточные таблицы. то есть начиная со второй картинки алгоритм работает чуточку быстрее.
со второй аналогичной картинки или со второй картинки вообще? Если вообще - почему нельзя сразу вшить эти кешируемые значения в флешку?
Старый 14.06.2010 16:45 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
tonnon, а зачем гиф? и из чего делать гиф? из мувика?
Psycho Tiger, со второй вообще. вшить нельзя так как там куча таблиц вычисляемых.
есть 2 вида таблиц. одни зависят от конкретного сжатия, а вторые можно зашить, но там 20кб =) к тому генерация таблиц довольно быстрая операция. прирост совсем небольшой получается.
Старый 14.06.2010 16:54 kutuzov вне форума
kutuzov
 
Аватар для kutuzov
а можно вычислить предполагаемый размер картинки
то есть (битмапДата, качество):предполагаемыйРазмерКартинкиБайт
или (битмапДата, желаемыйРазмерБайт):качество
но без непосредственного сжатия

просто есть такая задача, заливать на сервер картинки размером не более 50 кб, и качество не ниже 50
сейчас это реализовано через массив качеств и обхода его до получения нужного размера
Старый 14.06.2010 17:10 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
kutuzov, предполагаемый размер можно вычислить только как это делаются остальные =) написали формулу основываясь на средних показателях и выдают. без запуска алгоритма я не умею.
Старый 19.06.2010 01:00 Сайлас вне форума
Сайлас
Эм.
Такой вопрос: а CRC32 можно добавить метод из стринга для удобства сразу?
А жаль исходников нет чистых, а то еще понадобился CRC64, который ничем не отличается почти.

P.S. Спасибо
Обновил(-а) Сайлас 19.06.2010 в 01:02
Старый 19.06.2010 01:35 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
CRC32 используется в PNG. поэтому он есть в библиотеке.
Старый 24.06.2010 13:21 mayakwd вне форума
mayakwd
 
Аватар для mayakwd
большое спасибо, крайне полезно.
Старый 29.06.2010 18:13 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
Забавная штука )
Использовали методы Base64 encode/decode и JPEGEncoder.encode размер флешки вырос с 336кб до 511кб, причем никаких лишних классов в декомпиляторе не появилось.
Чем это можно объяснить? Либа то полезная, но не такой ценой )
Старый 29.06.2010 18:27 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
FSBmipt, без понятия, что Вы туда напихали. вся либа целиком весит 25кб. и увеличить размер флэшки на 200кб она к сожалению не может. максиму, что мне удавалось, это увеличить размер на 25кб. и то это только в случаи с дебаговой версией.
Старый 29.06.2010 18:58 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
Ну справедливости ради надо сказать, что на демке действительно использование этих же методов увеличивает размер swf всего на 12 кб, но в игрвом проекте замена всего трех строк с as3corelib на эту либу приводит с увеличению флешки на 175кб. Самому удивительно, как 9 кб swc приводит к такому факту, но пока решил оставить на свободное время )
собираем антом, все либы, классы и параметры компиляции под учетом, так что ничего лишнего мы никуда не пихаем, наоборот все что можно эксклудим и грузим в рантайме.
Старый 29.06.2010 20:17 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
FSBmipt, чудес не бывает.
Старый 30.06.2010 10:20 FSBmipt вне форума
FSBmipt
 
Аватар для FSBmipt
С флешом все бывает, думаю, все заглядывали в жиру адоба ) BlooDHounD, сам ведь вчера писал про баг с мусором в ByteArray, разве это не чудеса плеера?

Пробовали на другом проекте, там использование JpegEncoder добавило 100кб к общему размеру, похоже добавленный размер пропорционален общему размеру swf и составляет 50-60% от размера swf.
 

Часовой пояс GMT +4, время: 06:20.


Copyright © 1999-2008 Flasher.ru. All rights reserved.
Работает на vBulletin®. Copyright ©2000 - 2010, Jelsoft Enterprises Ltd. Перевод: zCarot
Администрация сайта не несёт ответственности за любую предоставленную посетителями информацию. Подробнее см. Правила.