Не прошло и дня, как Николя Канасье добавил в язык haXe поддержку API виртуальной памяти. Помогли ему ценные комментарии к Alchemy-посту в его блоге (см. предыдущую запись).
Николя удалось заставить недокументированные опкоды (opcodes) AVM2 работать в haXe. Также он обернул их в haXe API, называемое flash.VMem.
flash.VMem
С помощью этого API можно создавать быструю виртуальную память из массивов байтов (минимум 1024) и методом select() выбирать ее как текущую виртуальную память.
select()
Николя пишет, что это позволяет ускорить операции по чтению и записи в память на 40 и 30 процентов соответствеенно (относительно самого быстрого в FP10 класса Vector).
Vector
Пишет Flop: Демка работает только под Flash Player 10, а под 9-кой интересная ошибка: [ #1033: Cpool entry 397 is wrong type. ], в гугле не находится. В md5 адобовском берет хэш от строки, а не от байтаррэя, поэтому не сходится (не написали они от байтаррэя)).
Полагаю что можно такую-же апишку (swc) сделать и для AS3 (заюзать эти нефокументированные фунцыкли AVM2) и получить этот - же прирост. Кто возьмется?
Flop не выйдет, вызовы функций из swc съедят весь выигрыш. В swc придется пихать целые алгоритмы, а для этого alchemy по сути и сделали.
а динамическое выделение памяти как происходит? изменять значение length выбранного экземпляра ByteArray?
Вообще, смысл тут не в выделении памяти, а в том, что можно взять ByteArray, который нужно обработать, положить его на "разделочную доску" и быстро-быстро обсчитать. Затем, если нужно обработать другой массив - сделать текущим уже его.
Если нужно работать сразу с двумя массивами, то или из как-то склеивать, или к одному обращаться быстро и алхимично, а к другому - стандартными способами.
Макс: что-то я сомневаюсь.... может быть я не прав, но насколько я понял всю эту штуку:
1) Алхимия - конвертируер код С/С++ в байткод AVM2 Я алхимию сам не пробывал, но пробовал то-что после нее получается (swc либу) Тобиш любые файлы С/С++ можно завернуть в swc которая будет работать быстрее чем если тоже самое написать на AS и завернуть в либу. Это я уже проверил и убедился - взял из их примеров готовую swc и заюзал: проверил скорость выполнения - реально быстрее (может Рост выложит демку). 2) Николас задался вопросом: А откуда этот прирост который реально виден, если по сути тот-же AVM2 байткод? И нашел 12 недокументированных AVM2 инструкций которые получаются после Алхимии, но не получаются при компиляции AS3. 3) Николас, с помощью francis bourre разобрался в этих инструкциях (по сути это прямой доступ в виртуальную память, который и дает этот прирост в производительности) и сделал класс VMem - который доступен из haXe и понимается его компилятором, компилится в байткод AVM2 УЖЕ С ЭТИМИ ХИТРЫМИ ИНСТРУКЦИЯМИ. - кстати все декомпилеры спотыкаются на этих инструкциях (пока)))) 4) Так почему бы не сделать те-же самые функции на С (выделение, запись, чтение в виртуальую память) и конвертнуть их с помощью Алхимии в swc в такого-же рода класс VMem ??? зачем целые алгоритмы? если из инх получается тот-же! байткод за исключением вот этого доступа к памяти?
--- сам я СИ неумею, линукса у меня нету, пойду попинаю знакомых пока выходные, может ктонить мне поможет по этому поводу
ну наконец-то можно нормально работать .... :)
прикольная вещь, реально работает.
По поводу Cpool entry - в 10-й версии действительно добавили какой-то новый тип данных в пул констант с идентификатором 29. Знаю это потому, что старый abcdump на нём спотыкался. Обновился из тамариновского репозитория - заработало.
Хмммм.
... Calc MD5 with Alchemy 74ab891e3bf169d399fd679c7d45bb08 ... time =711 ms. ... Calc MD5 with as3Crypto (Hurlant) 74ab891e3bf169d399fd679c7d45bb08 ... time =3 ms. ... Calc MD5 with as3Crypto (Adobe) 8b1a9953c4611296a827abf8c47804d7 ... time =4 ms.
Dan, у меня вообще со второго раза идут 0ли.
Flop, в haXe байткод по идее при компиляции просто подставится в нужное место, у тебя же в as3 останется обычный вызов твоей функции, тело которой хотя и будет работать быстро, но сам вызов тоже займёт некое время.
В AVM1, помнится, можно было напрямую вызывать методы Flash Player API через директивы ASNative. Нет ли подобных директив в AVM2? Если есть, то их можно использовать для вызова opcodes.
... Calc MD5 with Alchemy 1dbb54f9416d88cc06ca73c5a0bb0012 ... time =281 ms. ... Calc MD5 with as3Crypto (Hurlant) 1dbb54f9416d88cc06ca73c5a0bb0012 ... time =2 ms. ... Calc MD5 with as3Crypto (Adobe) 2065bae1f71b5fe7e8530e968f8d0a7d ... time =0 ms.
странный прирост какой-то
Я понял. Там при первом запуске происходит что-то очень медленное (загрузка и компиляция каких-то классов или ещё что-то) поэтому при первом старте всегда медленно. При втором уже более реальные цифры. Однако Hurlant всё равно получается быстрее. Может быть вариант для Alchemy недостаточно заоптимизирован.
у меня вообще со второго раза идут 0ли.
Накидай побольше данных. Килобайт 20-30.
ну вот 8 Kb и задом наперёд
... Calc MD5 with as3Crypto (Adobe) 3d8badffebe0875685e3625a1bcbf437 ... time =10 ms. ... Calc MD5 with as3Crypto (Hurlant) 4bcccc24c36c3088b1541418a84fc153 ... time =3 ms. ... Calc MD5 with Alchemy 4bcccc24c36c3088b1541418a84fc153 ... time =281 ms.
Оставляйте пожалуйста информацию о системе и браузере, флэш плеер по разному работает в разном окружении.
Mac OS X, Safari 3.1, Flash Player 10, 45056 Bytes:
... Calc MD5 with Alchemy 709c02e6f5d9423260dfe91795db76a9 ... time =26 ms. ... Calc MD5 with as3Crypto (Hurlant) 709c02e6f5d9423260dfe91795db76a9 ... time =48 ms. ... Calc MD5 with as3Crypto (Adobe) 9fd17473b1fb79e9c6a2b0475b5153c3 ... time =90 ms.
... Calc MD5 with Alchemy fa5b994318dfe41c8031da1c0ba3f705 ... time =35 ms. ... Calc MD5 with as3Crypto (Hurlant) fa5b994318dfe41c8031da1c0ba3f705 ... time =61 ms. ... Calc MD5 with as3Crypto (Adobe) c23c65c6185f8b3ec19e341a70b3e5f3 ... time =110 ms. ... Calc SHA1 with Alchemy 11edf711b98ea1b52ebbd685828ce46a101b11b7 ... time =90 ms. ... Calc SHA1 with as3Crypto (Hurlant) 11edf711b98ea1b52ebbd685828ce46a101b11b7 ... time =187 ms. ... Calc SHA1 with as3Crypto (Adobe) 11edf711b98ea1b52ebbd685828ce46a101b11b7 ... time =166 ms. ... Calc SHA256 with Alchemy ca9e58e384d5531cee025a31cab8790f017aa5d12d02f6f6529029f12170ed94 ... time =224 ms. ... Calc SHA256 with as3Crypto (Hurlant) ca9e58e384d5531cee025a31cab8790f017aa5d12d02f6f6529029f12170ed94 ... time =234 ms. ... Calc SHA256 with as3Crypto (Adobe) ca9e58e384d5531cee025a31cab8790f017aa5d12d02f6f6529029f12170ed94 ... time =262 ms.
15360 bytes, PC/XP SP2, IE7/FP10:
... Calc MD5 with Alchemy 7a4edfd77dda05055e268204a74849e7 ... time =313 ms. ... Calc MD5 with as3Crypto (Hurlant) 7a4edfd77dda05055e268204a74849e7 ... time =16 ms. ... Calc MD5 with as3Crypto (Adobe) e24e6b5684fc21f418ad80e32dea63c2 ... time =31 ms. ... Calc MD5 with Alchemy 7a4edfd77dda05055e268204a74849e7 ... time =0 ms. ... Calc MD5 with as3Crypto (Hurlant) 7a4edfd77dda05055e268204a74849e7 ... time =16 ms. ... Calc MD5 with as3Crypto (Adobe) e24e6b5684fc21f418ad80e32dea63c2 ... time =15 ms.
где то явно бага.
Первый запуск како-го нить метода алхимии тут всегда тормозит. из-за враперва в АС3. там такое дело, что он весь онован на статических методах, и при вызове любого, если не создан сам объект который считает эти хэши, он его создает и инициализирует (вроде синглтона), так-что первый не считается ))
Не все нормально Alchemy работает быстрее. Запускала 10 раз, на инпут ложил 13 кило, браузер Chrome, ОС WindowsXP, Flash 10 Вот резалты (чаще показывало 1ms): ... Calc MD5 with Alchemy 79cfa5edf928ac46c38eb5baca8ca69d ... time =3 ms. ... Calc MD5 with as3Crypto (Hurlant) 79cfa5edf928ac46c38eb5baca8ca69d ... time =8 ms. ... Calc MD5 with as3Crypto (Adobe) ac7677cc7f977d3f7045da717b26f09e ... time =25 ms.
20kb, ff3, vista32
... Calc MD5 with Alchemy c6edca01bb71ca0473a0fad846acd585 ... time =1 ms. ... Calc MD5 with as3Crypto (Hurlant) c6edca01bb71ca0473a0fad846acd585 ... time =6 ms. ... Calc MD5 with as3Crypto (Adobe) a2c4bd883512b7127f66ad528cc07833 ... time =23 ms.
Предыдущий пост
Следующий пост