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

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

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

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

Запись от BlooDHounD размещена 11.06.2010 в 19:51
Обновил(-а) 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
исходник бенчмарка:
Код 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 кэширует все промежуточные таблицы. то есть начиная со второй картинки алгоритм работает чуточку быстрее.

---------------
Вложения
Тип файла: swf benchmark.swf (28.9 Кб, 711 просмотров)
Размещено в ActionScript , compiler , haXe
Комментарии 63 Отправить другу ссылку на эту запись
Всего комментариев 63

Комментарии

Старый 01.09.2010 18:57 Хемуль вне форума
Хемуль
 
Аватар для Хемуль
Спасибо огромное. Пользуюсь библиотекой уже в нескольких проектах. В основном для JPEG-кодирования. Клиенты тоже довольны, хоть им и не "посчастливилось" увидеть проект, когда в нём работал as3corelib, поскольку заменил его на ваше решение ещё до самой первой демонстрации - так бы они вообще в экстазе были. Потому что я потом ещё пару дней был в шоке от контраста скоростей.
Старый 01.09.2010 19:50 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
велкам. кстати почти прикрутил gif. надо только дошлифовать
Старый 02.09.2010 01:19 Котяра на форуме
Котяра
 
Аватар для Котяра
Может и H.264 сделаешь? С разделением расчёта по тикам плеера? Ну или что-нибудь посвободнее. Тут правда еще и декодер нужен для приёма..
Старый 02.09.2010 03:39 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
нафига? %) чисто по фану? я конечно люблю извращения, но это уж слишком )
Старый 03.09.2010 22:34 dimarik вне форума
dimarik
 
Аватар для dimarik
Ну пожалууууйста )
Старый 27.11.2010 16:19 Партизан вне форума
Партизан
 
Аватар для Партизан
Какая-то нереальная вещь Очень круто!
Старый 05.02.2011 01:50 alexg вне форума
alexg
Хорошая библиотека. Но не могли бы вы добавить метод hashBytes для SHA1, возвращающий непосредственно ByteArray, а не String. Мне необходимо работать с хэшем дальше, дополнительные преобразования нежелательны.
Старый 05.02.2011 04:01 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
alexg, где-то через месяц выйдет новая версия. болея быстрая и в ней появится RSA. там же будут методы sha-bin и md5-bin. на данный момент можете резать строку по 8 символов и делать parseInt, после чего производить записывать в ByteArray.
Старый 05.02.2011 12:00 alexg вне форума
alexg
BlooDHounD, спасибо, буду ждать.
Старый 07.04.2011 15:47 justin_g вне форума
justin_g
 
Аватар для justin_g
Нубский вопрос: все методы и свойства аналогичны as3corelib (я про синтаксис)? Конкретно интересует JSON
Обновил(-а) justin_g 07.04.2011 в 15:57
Старый 07.04.2011 17:52 BlooDHounD вне форума
BlooDHounD
 
Аватар для BlooDHounD
понятия не имею.
Старый 07.04.2011 22:12 etc вне форума
etc
 
Аватар для etc
justin_g, если имеется ввиду com.serialization, то нет.
Старый 02.12.2011 15:36 zuxul вне форума
zuxul

bug

Обнаружил неприятный баг в Вашей чудесной библиотеке.
В общих словах: JSON не может распарсить строку длинее 1021 символа, если строка упакована одна.
Написал небольшой пример для обнаружения ошибки.
Код AS3:
private function testJSON():void {
	var bigString:String = "";
	try {
		while (bigString.length < 10000) {
			// это валидная json строка
			var jsonString:String = JSON.encode(bigString);
			// декодируем ее
			var obj:* = JSON.decode(jsonString);
			bigString += "*";
		}
	} catch (error:*){
		trace("Не могу распарсить строку, длиннее " + String(bigString.length) + " символов");
	}
}
 

 


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


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