|
ASM.JS невероятен
![]() ![]() ![]() Ну че пасоны, кто игрался, кто что думает? п.с. (Я вот буду на нем юиху писать теперь), там есть и работа с дом и виртуальная файловая система,и удобно шейдеры писать, и на канве рисовать, и можно в бинарник для node.js скомпилировать и.т.п. А вы что думаете? Научить вас его запускать писать и компилить? Али сами)? |
Вот я добавил обьектов и цикл на 10 миллионов итераций, примерно столько я хочу иметь в юишке за кадр.
javascript код:
function Cat(newAge) {
this.age = newAge
}
Cat.prototype.say = function () {
return this.age;
}
console.time('javascript time');
var q = 0
for (var i = 0; i < 10000000; ++i) {
var cat = new Cat(4)
q += cat.say()
if (q === 12) q = 0
}
console.timeEnd('javascript time');
console.log('javascript q=' + q);
его эквивалент на С++:
class Cat {
private:
int age;
public:
Cat(int newAge) {
age = newAge;
}
int say() {
return age;
}
};
int main() {
EM_ASM(console.time('asm time'));
int q = 0;
for (int i = 0; i < 10000000; ++i) {
Cat cat(4);
q += cat.say();
if (q == 12) q = 0;
}
EM_ASM(console.timeEnd('asm time'));
printf("asm: q=%d", q);
return 0;
}
![]() То есть asm показывает минимальное проседание fps в 52 кадра в секунду Яваскрипт же выдает 5.4 кадра в секунду Иными словами чем сложнее данные и чем больше операций, тем выгодней asm js Использовать его в юишке было отличной идеей. Осталось только как то выкинуть тучу лишнего кода который прикрепляется в выходному файлу, убрать всякую егалду для работы с файлами и прочие штуки для совместимости с сишными программами. Мне по сути очень не хочется в фреймворк тащить тучу лишнего кода увеличивая вес на 100кб. То есть по сути мне просто нужно получить кучу и все, все внешние вызовы я буду делать через темплейт EM_ASM который код написаный внутри оставляет "как есть" и там я буду вызывать стандартные функции браузера. |
Цитата:
Для этого нужно будет построить не только виртуал дом, но и виртуал стайлшит, но фреймворк предполагает что мы не будем добавлять новые css стили после инициализации приложения, но если добавим ни что не мешает вызвать что-то типа ui.update() и пересчитать виртуальный стайлшит. Вообще, теоретически, имея такие мощности, можно написать браузер в браузере, и оптимизировать не оптимальные места в браузере заточив под нужды фреймворка. Например я уже парсю стайлшиты определяю приоритеты селекторов и определяю какие изменения добавляет тот или иной класс чтобы анимировано изменить width с auto на допустим 30em, если задан transition widtn. Хотя браузер это делает рывком. и.т.п. Я могу расширить эту концепцию и добавить нууу, например можно будет не писать префиксы всякие в css, фреймворк их сам добавит. Или можно будет написать что-то вроде новых кастомных css свойств, ну как то что делают препроцессоры, тока тут будет какое нить свойство типа width: @parent - 10% и фреймворк начнет автоматически в виртуал дом брать ширину в 10% от родительской высчитывать. Или можно добавить новые единицы измерения например, типа "одна сотая ширины экрана". Но я пока не знаю можно ли получать доступ к сырым данным css файлов? Кто знает? Я имею ввиду если стайл уже загружен и я хочу посмотреть тупо его КОД. Как это сделать? Просто стайлшиты котрые генерит браузер, при парсинге игнорируют неизвестные им свойства и синтаксические ошибки. По этому мне нужны сырые стили. Чтобы не делать xhr запрашивая и парся их повторно. |
Увеличел количество итераций с обьектами в 10 раз
результаты поражают: ![]() |
Еще есть вот такая штука http://www.leaningtech.com/cheerp/, она генерирует не asm.js код а просто код на бинарных операторах. В отличии от emscripten она позволяет из С++ работать напрямую со всем браузерным api включая дом и прочее, даже позволяет фреймворки юзать типа jQuery. НО она работает где то на 20% медленнее asm, а где то млять БЫСТРЕЕ!! Чертовщина) и оверхед у неё аж 600 килобайт!!!! а у асма 140
вот сравнение производительности на миллионе элементов: ![]() Кстати помнится мне кто-то тут кукарекал что бинарные операторы работают не быстрее чем обычные и типа все это миф)??? лалки |
Ну, короче че я думаю, я думаю я буду писать классы обертки для взаимодействия с DOM в браузере ;) для Emscripten.
Так как он все таки быстрее и кода меньше генерит. А потом предложу внедрить их в стандартную библиотеку Emscripten, я ж крутой |
о, оказуца стандартные яваскрипт классы могут наследовать от сишных) красавцы ребята
|
оказуца взаимодействовать с рантайм окружением проще простого
#include <emscripten.h>
#include <emscripten/val.h>
using namespace emscripten;
int main() {
val document = val::global("document");
val body = document["body"];
body.set("innerHTML", val("ololo"));
body.call<void>("setAttribute", val("name"), val("i winner"));
}
![]() |
Mаxmaxmаximus, тема интересная. Взял бы свою энергию направил на бы созидание, а точнее, написал бы туториал. Сейчас, я не понимаю, для кого ты всё это пишешь.
|
Цитата:
|
| Часовой пояс GMT +3, время: 07:33. |
|