|
|
|||||
Регистрация: Aug 2013
Сообщений: 7
|
Быстро перемешать символы в строке
Добрый день, столкнулся с задачей перемешивания символов в строчке размером в сотню мегабайт.
Привет -> рПвите Само собой при помощи цикла, строчек и getCharAt это все происходит _очень_ медленно (порядка 2 минут) и сжирает феерический объем оперативы. if (!(length % 2 == 1)) { while (i < length) { s += base64.charAt(i + 1) + base64.charAt(i); i+=2; } } else { while (i < length - 1) { s += base64.charAt(i + 1) + base64.charAt(i); i += 2; } s += base64.charAt(base64.length-1); } return s; var b_temp:ByteArray = new ByteArray(); var bytes:ByteArray = new ByteArray(); bytes.writeUTFBytes(base64); if (!(length % 2 == 1)) { for (i = 0; i < bytes.length-2; i+=4) { b_temp.writeByte(bytes[i + 2]); b_temp.writeByte(bytes[i + 3]); b_temp.writeByte(bytes[i]); b_temp.writeByte(bytes[i+1]); } } else { for (i = 0; i < bytes.length - 4; i += 4) { b_temp.writeByte(bytes[i + 2]); b_temp.writeByte(bytes[i + 3]); b_temp.writeByte(bytes[i]); b_temp.writeByte(bytes[i+1]); } b_temp.writeByte(bytes[bytes.length - 2]); b_temp.writeByte(bytes[bytes.length - 1]); } |
|
|||||
Регистрация: Aug 2013
Сообщений: 7
|
KumoKairo
Ссылка на .zip архив в котором лежит json, в поле bytearray которого лежит перемешанный по данному принципу base64. Если перемешать обратно и декодировать из base64, то получится .swf (в bytearray) Но можете любой длинный текст засунуть в base64 и оно ничем не будет принципиально отличаться от вышеназванного ужаса. http://sdrv.ms/17Ph50p Спасибо :-) Последний раз редактировалось flasher190; 15.08.2013 в 15:00. |
|
|||||
Modus ponens
|
Не вдаваясь в остальные подробности...
эквивалентно но за меньшее количество действий. Конкатенация строк в таких объемах - непрактично. Лучше один раз выделить память и потом в нее писать. Если вам нужно перемешать всю строку, то, ничего не поделаешь, вам ее всю прийдется поместить в память, но если можно предсказать распределение символов в строке, то можно было бы сделать блоками (и тогда одновременно памяти было бы задействовано меньше). Но, с точки зрения алоритмической сложности: никаких ускорений вам не светит. Скорость как была линейной, так и останется.
__________________
Hell is the possibility of sanity |
|
|||||
Регистрация: Aug 2013
Сообщений: 7
|
wvxvw
Понятно, спасибо. Вообще вроде сделать работу быстрее, тот же самый файл распаковывается средствами Flash из zip на порядок быстрее, чем выполняется такая простейшая операция. Из этого я сделал вывод, что можно сделать решение "не в лоб". А вот какое - знаний не хватает По поводу if'а согласен, но эта часть кода выполняется один раз и потому не критично. А до рефакторинга не добрался еще. |
|
|||||
Регистрация: Mar 2013
Сообщений: 290
|
flasher190, можно еще на stackoverflow спросить, правда там форум слишком отягощенный оформительскими извратами, и за неправильный формат поста могут заминусовать, и проигнорить.
|
|
|||||
Регистрация: Nov 2009
Адрес: СПб
Сообщений: 2,236
|
Цитата:
|
|
|||||
Регистрация: Aug 2013
Сообщений: 7
|
mikhailk,
у нас хитрый способ шифровки документов (все равно бесполезный, но ТЗ такое). Уже переформулировали задачу, решили сделать по другому. Теперь программа обрабатывает все за 5-10 секунд. Всем спасибо Но все равно обидно, что AVM2 работает в разы медленней Java, не говоря уже о нативном коде. |
|
|||||
Регистрация: Feb 2012
Сообщений: 1,540
|
Используйте воркеры (Workers).
|
|
|||||
listener
|
Цитата:
swf (bytes) -> original string (base64) -> shuffled string -> original string (base64) -> swf (bytes) А вообще, вот. UPD. опоздал с постом |
Часовой пояс GMT +4, время: 07:16. |
|
« Предыдущая тема | Следующая тема » |
|
|