Javascript-форум (https://javascript.ru/forum/)
-   Оффтопик (https://javascript.ru/forum/offtopic/)
-   -   ASM.JS невероятен (https://javascript.ru/forum/offtopic/59232-asm-js-neveroyaten.html)

Mаxmaxmаximus 02.11.2015 03:17

ASM.JS невероятен
 







Ну че пасоны, кто игрался, кто что думает? п.с. (Я вот буду на нем юиху писать теперь), там есть и работа с дом и виртуальная файловая система,и удобно шейдеры писать, и на канве рисовать, и можно в бинарник для node.js скомпилировать и.т.п.

А вы что думаете? Научить вас его запускать писать и компилить? Али сами)?

Mаxmaxmаximus 02.11.2015 05:00

Вот я добавил обьектов и цикл на 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 который код написаный внутри оставляет "как есть" и там я буду вызывать стандартные функции браузера.

Mаxmaxmаximus 02.11.2015 05:24

Цитата:

А тебе нафига быстрей?
Я пишу двигло для рендера. Использующее виртуал дом (виртуальные дом элементы) как в Реакт от фейсбука. Я работаю с виртуальным DOM деревом а оно, когда ему нужно, подрендеривает это в реальный браузерный дом, физически отображая элементы на экране. Иными словами я хочу список в миллион элементов нарисовать на экране. Но браузер зависнет уже при 10к. ПО этому я нарисую его в виртуальный дом, а тот отследит где щас камера по отношеню к сайту и какие элементы должны быть видны а какие нет, и нарисует из того миллиона только те, что на экране могут быть видны. А когда чел прокрутит камеру вниз, то фреймворк поймет это ибыстренько подрисует элементы снизу, а те что сверху скрылись за экраном удалит). таким образом чел может рисовать огроменное количество кнопок и элементов, а движок рендера будет рисовать только то что видно на экране.

Для этого нужно будет построить не только виртуал дом, но и виртуал стайлшит, но фреймворк предполагает что мы не будем добавлять новые css стили после инициализации приложения, но если добавим ни что не мешает вызвать что-то типа ui.update() и пересчитать виртуальный стайлшит.


Вообще, теоретически, имея такие мощности, можно написать браузер в браузере, и оптимизировать не оптимальные места в браузере заточив под нужды фреймворка. Например я уже парсю стайлшиты определяю приоритеты селекторов и определяю какие изменения добавляет тот или иной класс чтобы анимировано изменить width с auto на допустим 30em, если задан transition widtn. Хотя браузер это делает рывком. и.т.п.

Я могу расширить эту концепцию и добавить нууу, например можно будет не писать префиксы всякие в css, фреймворк их сам добавит. Или можно будет написать что-то вроде новых кастомных css свойств, ну как то что делают препроцессоры, тока тут будет какое нить свойство типа width: @parent - 10% и фреймворк начнет автоматически в виртуал дом брать ширину в 10% от родительской высчитывать. Или можно добавить новые единицы измерения например, типа "одна сотая ширины экрана". Но я пока не знаю можно ли получать доступ к сырым данным css файлов? Кто знает? Я имею ввиду если стайл уже загружен и я хочу посмотреть тупо его КОД. Как это сделать? Просто стайлшиты котрые генерит браузер, при парсинге игнорируют неизвестные им свойства и синтаксические ошибки. По этому мне нужны сырые стили. Чтобы не делать xhr запрашивая и парся их повторно.

Mаxmaxmаximus 02.11.2015 08:13

Увеличел количество итераций с обьектами в 10 раз

результаты поражают:

Mаxmaxmаximus 02.11.2015 08:39

Еще есть вот такая штука http://www.leaningtech.com/cheerp/, она генерирует не asm.js код а просто код на бинарных операторах. В отличии от emscripten она позволяет из С++ работать напрямую со всем браузерным api включая дом и прочее, даже позволяет фреймворки юзать типа jQuery. НО она работает где то на 20% медленнее asm, а где то млять БЫСТРЕЕ!! Чертовщина) и оверхед у неё аж 600 килобайт!!!! а у асма 140


вот сравнение производительности на миллионе элементов:



Кстати помнится мне кто-то тут кукарекал что бинарные операторы работают не быстрее чем обычные и типа все это миф)??? лалки

Mаxmaxmаximus 02.11.2015 09:56

Ну, короче че я думаю, я думаю я буду писать классы обертки для взаимодействия с DOM в браузере ;) для Emscripten.
Так как он все таки быстрее и кода меньше генерит. А потом предложу внедрить их в стандартную библиотеку Emscripten, я ж крутой

Mаxmaxmаximus 03.11.2015 02:47

о, оказуца стандартные яваскрипт классы могут наследовать от сишных) красавцы ребята

Mаxmaxmаximus 03.11.2015 08:00

оказуца взаимодействовать с рантайм окружением проще простого

#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"));
}



FINoM 03.11.2015 14:41

Mаxmaxmаximus, тема интересная. Взял бы свою энергию направил на бы созидание, а точнее, написал бы туториал. Сейчас, я не понимаю, для кого ты всё это пишешь.

Mаxmaxmаximus 03.11.2015 17:05

Цитата:

Сообщение от FINoM
написал бы туториал

ща

FINoM 03.11.2015 19:09

Mаxmaxmаximus, лично мне было бы интересно узнать, как использовать АСМ без компилятора и в каких задачах его можно применить. В циклах, типизированных массивах, типизированных переменных - ок. Но хорошо бы узнать, помогает ли асм при работе с объектами (обычными инстансами Object) и как оптимизировать вызов одной функции внутри другой (обе на АСМ).

Mаxmaxmаximus 04.11.2015 19:01

лайк репост https://youtrack.jetbrains.com/issue/CPP-4974#

webgame 29.11.2015 09:33

Я вот тоже попробовал вчера asm.js , пока что только настроил работу с ним через Emscripten в Visual Studio, могу теперь писать на с/c++ и сразу запускать html/js в браузере. Скорость выполнения такого JS приближается к нативной, и при этом работает в любом браузере! Согласен полностью, что код большой получается в .js, как то надо научиться компилировать без лишнего. Но вообще, я думаю намудрили они там... когда настраивал и разбирался с мануалом, напомнило мне это всё, как я разбирался с Marmalade, который позволял програмить один раз на одном языка, а потом портировать на все платформы, правда для этого надо изучить кучу нюансов работы с ним, переписанных ими функций, и тд, а инфы в инете очень мало, даже на английском! Портировать с++ в asm.js, настраивать Emscripten, изучать новый мануал и тп есть смысл только, если у вас много постоянно выполняемого JS кода. Если JS кода мало, то его и вручную можно написать в стиле asm.js, если выполнение JS кода это менее 10% от всей нагрузки, думаю смысла заморачиваться с ним нет. К примеру, если делать графику на WebGL/OpenGL ES, то там почти все сложные расчеты можно делать в шейдерах, что не имеют отношения к JS и быстрее выполняться не будут. А вот если у вас сложный ИИ написан на JS или какой-нить парсер, или идет интенсивная работа в DOM-ом, циклы всяких вычислений, и любые подобные вещи, которые жрут много процессорного времени при выполнении, то однозначно нужен asm.js или тп прокладки. У меня простые расчеты в цикле на asm.js выполняются в 1000 раз быстрее, чем на обычном js (с нетипизированными переменными).

Mаxmaxmаximus 30.11.2015 15:05

Цитата:

Сообщение от webgame
Если JS кода мало, то его и вручную можно написать в стиле asm.js

Нет не можно его вручную написать, ты мозг сломаешь когда банальное обращение к куче будешь описывать чтобы гребаный цикл for сделать

Цитата:

Сообщение от webgame
то там почти все сложные расчеты можно делать в шейдерах,

ага, особенно физику


Mаxmaxmаximus 30.11.2015 15:09

Цитата:

Сообщение от FINoM
как использовать АСМ без компилятора

никак) на ассемблере проще писать код или банирниками чем на асм руками)

> в каких задачах его можно применить
обычно оптимизируют только горячие куски кода, но вслучае асм нужно весь поджект псиать на асм, по этому только горячие проэкты пишутся на нем, например физические движки или что то, что служдит платформой для чего либо другого, и должно работать максимально быстро, напимер фреймворки какие-то и.т.п., а вот игрули же, использующие эти фреймворки, должны писаться на яваскрипте, что и идеологически верно, и не затормозит игрулину так как api фреймворка будет все выкрутасы делать а ты яваскриптом только рулить им будешь.

webgame 01.12.2015 11:42

Цитата:

Сообщение от Mаxmaxmаximus (Сообщение 398114)
ага, особенно физику

Я писал 3d движки на ассемблере с SSE еще 18 лет назад в школе , а щас могу писать на cuda даже расчеты по теории относительности Эйнштейна. А уж убогую игровую физику на GPU конвеер распаралелить как два пальца, даже на webgl :)

Вообще если человек пишет сложные физические расчеты, не используя мощь GPU , то это просто означает, что он не знает как это правильно делать:) мне кажется полным идиотизмом вычислять физику, трансформацию вершин, генерацию текстур, создание карт нормалей динамически создаваемых примитивов и тп в оперативке, используя CPU, а затем гонять эти данные по шине в GPU ...

webgame 01.12.2015 11:49

Цитата:

Сообщение от FINoM (Сообщение 394364)
лично мне было бы интересно узнать, как использовать АСМ без компилятора

Можно писать и без компилятора:
http://habrahabr.ru/post/193642/
http://asmjs.org/spec/latest/

FINoM 01.12.2015 13:37

Цитата:

Сообщение от webgame
Можно писать и без компилятора

Меня волнует только одно: strict mode генерирует ошибку, когда используешь какие-нибудь опасные штуки (with, дублирование свойства при определении объекта и пр.). Как сделать так, тоб АСМ тоже генерировал ошибку, если тип не определен?

Ага, нашел ответ в посте на Хабре.

FINoM 01.12.2015 13:54

function x() {"use asm"; y = 0;}
x()
Почему не генерируется исключение?

webgame 01.12.2015 20:10

Цитата:

Сообщение от FINoM (Сообщение 398223)
Почему не генерируется исключение?

Честно, не разбирался что там и как, единственное что взял с asmjs.org/spec/latest/ функцию GeometricMean , вставил ее, как есть, в html и запустил в firefox, браузер написал - "Successfully compiled asm.js code". чтобы понимать почему, что там и как - надо изучать вопрос, инфа и примеры в гугле найти не проблема.

webgame 01.12.2015 20:13

В дополнение к этому посту, вот инфа как еще в 5 раз ускорить выполнение JS вычислений:
http://www.cs.utexas.edu/users/ivan/pubs/simdjs.pdf
https://esdiscuss.org/notes/2014-07/simd-128-tc39.pdf

Mаxmaxmаximus 01.12.2015 22:46

Цитата:

Сообщение от FINoM
Почему не генерируется исключение?

Потому что в хроме нет поддержки асм, точнее она есть но не официальная и пока на стадии "ладно пасоны, мы поняли, это асм, мы используем все его штуки для оптимизации эвристики нашего V8, но пока, как там все прописано в стандартах конвертировать его в ассемблер и все такое не будем, просто будем юзать как подсказки для V8"

Mаxmaxmаximus 01.12.2015 22:47

Цитата:

Сообщение от webgame
А уж убогую игровую физику на GPU конвеер распаралелить как два пальца, даже на webgl



Пасоны, вы читаете то же что и я или мне показалось что он сказал что может физический движок на WebGL написать?
Даже я в самом начале своей карьеры такой ахинеи не нес. Ты бы еще сказал что на шейдерах физику писать собрался ляля).

Анука пример кода определающего входит ли точка в круг на webGL или звездабол диванный.

Mаxmaxmаximus 01.12.2015 22:50

Цитата:

Сообщение от FINoM
Ага, нашел ответ в посте на Хабре.

Ну, ответ разумеется никак. я бы сделал какой то плагин на сборщик проджекта чтобы делать вставки на каком то языке который бы инлайнился в асм.


типа делать вставки на С++ и он бы конверитл их в асм инлайн. тогда удобно было бы писать горячие куски кода на асме.

повторюсь что руками на асме писать невозможно физически. у кого есть обратные данные напишите мне банально функцию которая складывает 2 строки "hello" и "world" и выводит результат как return функции. а то раскудахтались тут что руками они писать собрались лол. если отец говорит вам чт это невозможно значит отец фигни не посоветует и батю надо слушать понятно?

НИ какие возражения по этому пункту не принимаются если это не КОД! Все остальное автоматически воспринимается как отмаза на которую я даже отвечать не буду!

FINoM 01.12.2015 22:53

Цитата:

Сообщение от Mаxmaxmаximus
Потому что в хроме нет поддержки асм

В лисе тоже нет ошибки.

Mаxmaxmаximus 01.12.2015 22:55

> https://esdiscuss.org/notes/2014-07/simd-128-tc39.pdf

кто-то мне помнится тут говорил что ко ко ко бинарные операторы не быстрее работают и что это миф, а я вам эту либу хотел привести но тупо забыл название. ну выходит я в сотнетысячный раз оказался прав, но я привык)

webgame 02.12.2015 04:10

Цитата:

Сообщение от Mаxmaxmаximus (Сообщение 398334)

Пасоны, вы читаете то же что и я или мне показалось что он сказал что может физический движок на WebGL написать?
Даже я в самом начале своей карьеры такой ахинеи не нес. Ты бы еще сказал что на шейдерах физику писать собрался ляля).

Анука пример кода определающего входит ли точка в круг на webGL или звездабол диванный.

Код писать не буду, ибо он зависит от более точных условий задачи, скажу только, что он делается на шейдерах точно также как и в обычной проге, но чтобы это имело смысл физический движок должен быть построен по принципу параллельной обработки большого количесва однотипных вычислений, вкрадце: фрагментный шейдер получает x,y очередной точки из VBO буфера, далее делает сравнение (x-x0)^2+(y-y0)^2 < R^2 , и в зависимости от результата пишет в FBO буфер нужные данные, а что далее с полученными результатами попадания точек в круг делать, это уже второй вопрос. Еще раз повторю, webgl вполне подходит под большинство расчетов, другое дело, что люди не знают, как физический движок правильно создавать, что различные типы расчетов надо приводить к общим универсальным, а не понимают этого потому что тупо не знают физические законы и их математические модели, большинство не знает даже что мировая линия луча света и любого свободно падаюшего с любой скоростью массивного тела описывается геодезической в 4D одной и той же кривизны на равном удалении от основного центра масс, поэтому и все гравитационные расчеты и все приличные расчеты освещения можно выполнять одним и тем же уравнением, вне зависимости от скорости, силы гравитации, массы и тд. Ну а уникальные единичные расчеты конечно в шейдере считать нет смысла, но при правильных алгоритмах, на их долю приходится тратить не так много вычислительных мощностей.

P.s. грубить не надо, вы меня не знаете, чтобы делать выводы, чего я могу, а чего нет, но одно я знаю точно, если вы чего та не умеете, это не значит что никто этого не умеет и не знает.

Mаxmaxmаximus 02.12.2015 11:53

Цитата:

Сообщение от webgame
Код писать не буду

Цитата:

Сообщение от webgame
если вы чего та не умеете, это не значит что никто этого не умеет и не знает.

я думаю ты не умеешь не потому что Я не умею, я думаю ты не умеешь потому что ты не привел пример кода, будем считать это что ты слился как дошло до дела

Цитата:

Сообщение от webgame
Код писать не буду, ибо он зависит от более точных условий задачи

Приведи пример кода при любых условиях задачи.

Почитай мне на webGL 2+4 и покажи код, звездун.

Цитата:

Сообщение от webgame
вы меня не знаете

вначале я тебе не грубил и мы с тобой нормально общались пока ты не начал откровенно мне звиздеть, что оскорбляет меня будто я дурак какой то.

А я не дурак я профессор между прочим

webgame 02.12.2015 20:06

Цитата:

Сообщение от Mаxmaxmаximus (Сообщение 398385)
А я не дурак я профессор между прочим

Профессор) Ха-ха) я уже почитал в других топиках как ты общаешься с людьми, поверь - ты даже близко не гений, как себя считаешь! У меня создалось ощущение что ты просто школота с завышенным самомнением.

Дальнейшее общение считаю бессмысленным. Adiós

Mаxmaxmаximus 02.12.2015 21:04

webgame,

> Поcчитай мне на webGL 2+4 и покажи код.
> Профессор) Ха-ха) я уже почитал в других топиках как ты общаешься с людьми, поверь - ты даже близко не гений, как себя считаешь! У меня создалось ощущение что ты просто школота с завышенным самомнением. Дальнейшее общение считаю бессмысленным. Adiós

https://ru.wikipedia.org/wiki/Ad_hominem



хахаха, разоблачили звездабола

webgame 03.12.2015 09:44

Цитата:

Сообщение от Mаxmaxmаximus (Сообщение 398458)
Поcчитай мне на webGL 2+4 и покажи код.

Да на хер ты кому нужен, время еще на тебя тратить, чета тебе доказывая! учить тебя складывать я не собираюсь:)

alex.vv 03.12.2015 10:24

Цитата:

Сообщение от Mаxmaxmаximus (Сообщение 394105)
Увеличел количество итераций с обьектами в 10 раз

результаты поражают:

Мне одному кажется странным, что при десятикратном увеличении количества итераций время asm time не поменялось ни на йоту? Я не знаю, как плюсы работают в таких случаях с объектами, но возможно имеет место внутренняя оптимизация вычислений (shortcut'ы, garbage collector работает эффективнее и т. п.), которая может быть менее эффективна в более сложных случаях.

Mаxmaxmаximus 03.12.2015 10:35

Цитата:

Сообщение от webgame
Да на хер ты кому нужен, время еще на тебя тратить, чета тебе доказывая! учить тебя складывать я не собираюсь

ХАААА))))))) СЛИИИЛСЯ, КТО БЫ МОГ ПОДУМАТЬ, ЭТО БЫЛО ТАК НЕОЖИДАНО ЩАС, А Я УЖ ВЕЕЕРИЛ ЧТО КОД ПОЛУЧУ, НУ ВДРУГ ТАМ ЧЕТО НАИЗОБРЕТАЛИ ЛЮДИ, А ТУТ ОКАЗУЦА ОЧЕРЕДНОЙ ФАНТАЗЕР). Сразу представил ученого: пасоны яизобрел новый полимер но я вам его не покажу вы не достойны, но вы знайте что я изобрел. Ох лол))) СЛИЛ ОДНИМ БАНАЛЬНЫМ ВОПРОСОМ ЛАЛКУ)) ИЛИ ТЫ ЧЕ, ДУМАЛ ТЕБЕ ТУТ ВОПРОС ЭТОТ НЕ ЗАДАДУТ И ПРИМЕР НЕ ПОПРОСЯТ ПРВИЕСТИ??? НЕ ПРОКАТИЛО ДА?)) ИДИ В ШКОЛЕ У СЕБЯ РАЗВОДИ ОДНКЛАССНКИОВ ЗВЕЗДУН МАМКИН))) ФИЗИКУ он млять собрался на webGL считать))))))))))))))))))))))))))))))) ... а потом проснулся и пошел в школу, физик мамин.

раунд!


FINoM 03.12.2015 15:23

Mаxmaxmаximus, webgame, товарищи школьники, не засоряйте эту интересную тему своим срачем. Вы можете продолжить вашу бесконечно интересную беседу в личке.

Mаxmaxmаximus 03.12.2015 15:55

Цитата:

Сообщение от FINoM
Вы можете продолжить вашу бесконечно интересную беседу в личке.

НУ а тебе не интересно как человек на webGL собрался физические расчеты вычислять? ОН вон физические движки с 17 лет пишет) научимся новому хоть) шо я не то спросил то у него?

webgame 04.12.2015 00:49

Цитата:

Сообщение от FINoM (Сообщение 398557)
Mаxmaxmаximus, webgame, товарищи школьники, не засоряйте эту интересную тему своим срачем. Вы можете продолжить вашу бесконечно интересную беседу в личке.

Ты абсолютно прав, я тоже предлагаю по делу обсуждать тему. Просто как то никто ничего не спрашивает, не пишет, ощущение что эта тема новая для всех, причем и на других форумах рунета где я обсуждал ее тоже самое примерно.

Сорри за разборки, просто не могу сдержаться, когда меня засыпают в личку матом, а тут постят тупые картинки, и берут на слабо. Любому человеку, знающему хотя бы основы opengl будет достаточно моего описания алгоритма, более того даже такого тупого вопроса не возникнет, поскольку генерация ланшафта, динамики волн водной поверхности, скелетная анимация и тп вещи генерируемые фрагментным шейдеров в FBO/R2VO это основы, зачем человек не знающий этого и вообще основ работы шейдеров, спорит со мной, мне не понятно...

MallSerg 04.12.2015 01:39

Цитата:

Сообщение от Mаxmaxmаximus
webGL собрался физические расчеты вычислять?

По секрету именно на GPU и делаются сейчас физические движки даже библиотека(готовый движек) для этого есть https://ru.wikipedia.org/wiki/PhysX

Mаxmaxmаximus 04.12.2015 03:54

По пунктам
1) Я естственно знаю про физикс хавок и все такое прочее
2) На ГПУ не делаются физические движки
3) физикс это двигло от нвидии обрадающее аппаратным усоркнием, при чем тут то что школьник говорит что на webGL собрался физику считать??
4) при чем тут аппаратное ускорение физики от nvidia и webGL карл?

У Тебя нуливые знания в этой сфере и в пунктах выше я это доказал. Так что понял свою неправоту и мою правоту?

Mаxmaxmаximus 04.12.2015 03:55

webgame, ну давай, звездун, вот банально, нам нужно посчитать пересекаются ли aabb двух фигур. Как ты это сделаешь на webGL? Пришли код. Нет ни одной причины не прислать код кроме того что ты ЗВЕЗДАбол.

Я уже читаю отмазы несколько сраниц)

ТЫ АВТОМАТИЧЕСКИ ИМЕЕШЬ СТАТУС ЗВЕЗДАБОЛА пока не пришлешь код где доказываешь свои фантазии.

А по скольку ты не то что НЕ ХОЧЕШЬ, а именно НЕ МОЖЕШЬ этого сделать, то конечно же ты этого НЕ ПРИШЛЕШЬ, иждать это бессмысленно по этому я просто официально нарекаю тебя ЗВЕЗДАболом и прекращаю разговор.

Я доказал что я прав и что ты не прав.

webgame 04.12.2015 04:30

Цитата:

Сообщение от Mаxmaxmаximus (Сообщение 398629)
Я доказал что я прав и что ты не прав.

Да я уж понял, что ты тут местный дурачек
Только это ты и доказал в очередной раз :lol:


Часовой пояс GMT +3, время: 04:04.