LINUX.ORG.RU
ФорумTalks

WebAssembly performance сосёт

 ,


0

5

Сейчас Dron перегоняет числодробилку для ресайза картинок на webassembly. Временно посмотреть можно тут: https://github.com/fedor-elizarov/convolve-wasm

То, что яваскрипт делает за 300мс, WA делает за 250мс.

Результат, мягко говоря, не впечатляет. Оказывается яваскриптовый JIT очень нефигово оптимизирует код. Еще конечно есть возможность оптимизировать работу с памятью, НО если копировать логику 1:1, то результат слабенький.

Вторая пичалька в том, что у WA пока нет поддержки SSE. А из v8 гугель внезапно выпилил SIMD https://bugs.chromium.org/p/v8/issues/detail?id=4124. Вроде они его выпилили в пользу будущего WA, но в итоге нигде нет.

Продолжаю наблюдать :)

UPD. Поставил Хром 57. В нем WA отрабатывает за 500мс против 300мс на яваскрипте.

★★★★★

Последнее исправление: Vit (всего исправлений: 2)

То, что яваскрипт делает за 300мс, WA делает за 250мс.

Это хороший результат. wa он для другого, для переноса из js 1 в 1 он не имеет смысла. чесногря в wa я вообще не шибко верю, думается с ним поиграются и останется он где-нить на игровых и т.п. задворках.

vtVitus ★★★★★
()
Последнее исправление: vtVitus (всего исправлений: 1)
Ответ на: комментарий от Vit

когда пистон делали, он на синтетике порою х2 таки давал, а вот на реальных задачах кое-как смог 10% выжать.

der_looser ★★
()
Ответ на: комментарий от Shadow

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

Vit ★★★★★
() автор топика
Ответ на: комментарий от der_looser

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

Тут простая задача, аллокатор при выполнении не нужен, все делается снаружи перед вызовом.

Vit ★★★★★
() автор топика

Перенос в лоб с яваскрипта на вебассембли дал прирост 15%. Но все равно он плохой. Где вы такой логикой затариваетесь?

andreyu ★★★★★
()
Ответ на: комментарий от Vit

Завязывай сталкивать технический тред в УГ

В каком месте это технически тред? Я вижу вопли веб-макаки.

andreyu ★★★★★
()
Ответ на: комментарий от RazrFalcon

Наверное потому что это не бенчмарк С :). Сравнение вполне прикладное - стоит ли заморачиваться с дополнительными сложностями ради скорости. Возможно, у тебя нет подходящих задач для браузера.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Quasar

Вполне очевидно, что WA сделан не для жабаскрипт-макак.

Как раз для них.

И зачем жабаскрипт-макаке нужен WA?

tailgunner ★★★★★
()
Ответ на: комментарий от Vit

Я хочу профит по скорости хотя бы 2 раза, иначе смысла нет заморачиваться с лишними сложностями.

Вся суть «веб-программистов».

leave ★★★★★
()
Ответ на: комментарий от leave

Просто грамотное планирование затрат.

Vit ★★★★★
() автор топика
Ответ на: комментарий от ekzotech

Врёшь, потребляет CSS+DOM, JS как раз не потребляет.

surefire ★★★
()

Не забывай, что хром еще компилирует JS и кеширует этот бинарь. Считай тот же васм получается при повторном заходе. А если туда asm.js впилить, то разницы и не будет. Нужно следующую версию васма ждать.

foror ★★★★★
()
Ответ на: комментарий от foror

Это как? Бенчмарк меряет уже после того как модуль прогружен и инициализирован. Там по-моему с виртуальной машиной траблы.

Vit ★★★★★
() автор топика

Емнип, wasm изобрели чтобы из «asm.js» выкинуть ".js". Потому что очень долго это всё грузилось, особенно на мобильных устройствах. С этим бы хоть справились, было бы уже хорошо.

shahid ★★★★★
()
Ответ на: комментарий от shahid

Я уже давно не вижу смысла в филосовских расмышлениях о судьбах wasm. Просто интересно, что из него можно выжать в числодробилках. С наскоку как-то не очень. Ну будем копать дальше.

Vit ★★★★★
() автор топика

То, что яваскрипт делает за 300мс, WA делает за 250мс.

И чем ты не доволен? WA не только позволяет не связываться с JS, но и работает в одной и самых ранних реализаций уже быстрее, чем JS (причём аж на 20%). Это как раз показывает, что он не сосёт. Нет, если тебе нравится JS, то ничто не мешает продолжать им пользоваться, но многие хотели бы его никогда не видеть, WA это позволяет.

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Ты путаешь цели. Я ничего не имею против тех, кому надо закнопелять со своего языка мимо жээс. Но у меня другой интерес - выжать из браузера то, что на JIT сделать невозможно.

И пока c wasm профит получился жиденький. Ради него я бы заморачиваться с переписыванием текущего кода не стал. Но мне действительно интересно сделать его быстрее в разы, и я ищу для этого способы. Пока варианты еще есть, по результатам отпишусь.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Единственная задача веба - это статические странички. Всё остальное - миф.

RazrFalcon ★★★★★
()
Ответ на: комментарий от Psych218

работает в одной и самых ранних реализаций уже быстрее, чем JS

С какого оно работает быстрее? Проверил на двух компах, везде JS на этом тесте в 2-2.5 раза быстрее. Может дело конечно в бенче, но даже на гитхабе тот же результат бенча выложили.

foror ★★★★★
()
Ответ на: комментарий от shahid

Потому что очень долго это всё грузилось, особенно на мобильных устройствах

На ООП оно во-первых не всё может, а во-вторых генерирует массу кода https://mbebenita.github.io/WasmExplorer/ (открой virtual в examples). Пока это бесполезное поделие против asm.js

foror ★★★★★
()
Ответ на: комментарий от foror

Бенч без -O3 собран. Если сильно надо - возьми из моего форка, он там всего один. Цифры, которые я даю в первом посте - уже с учетом -O3.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Кстати, если запустить бенч повторно на уже отработанном бенче, не обновляя страницу, то васм на секунду быстрее отрабатывает, в не зависимости от перформанса процессора (запускал на двух разных процессорах).

foror ★★★★★
()
Ответ на: комментарий от foror

Ну я по-всякому пробовал, и написал лучшие результаты. У меня разницы между запусками на FF и Хроме не наблюдается.

Vit ★★★★★
() автор топика
Ответ на: комментарий от foror

С какого оно работает быстрее? Проверил на двух компах, везде JS на этом тесте в 2-2.5 раза быстрее.

Я не проверял, я сужу лишь по стартовому посту. Там написано в сабже, что сосёт, а потом, что оказывается быстрее.

Psych218 ★★★★★
()
Ответ на: комментарий от Vit

Ты путаешь цели.

А ты путаешь смысл существования WA в какой-то степени. Перфоманс не единственная и не основная цель его существования. Но даже в нём по твоим же тестам прогресс уже есть. Да, ради прироста в 20% нет смысла переписывать что-то, что уже и так работает (и то иногда бывает что есть), но если писать что-то новое, вопрос стоит уже иначе.

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

Будет интересно посмотреть.

Psych218 ★★★★★
()
Последнее исправление: Psych218 (всего исправлений: 2)
Ответ на: комментарий от Psych218

Я нигде не писал про смысл существования wasm. Подобные холивары не несут ничего полезного. Мне просто интересно покрутить wasm на предмет performance. Вполне любыпытная задача, не хуже многих других.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Не спорю. Просто изначально заголовок был «WebAssembly сосёт», и я как-то ожидал, что внутри будет что-то более разоблачительное, а если и по производительности, то например, если бы он не «слишком мало выигрывал» у JS, а проигрывал ему, а так что-то выходит, что вовсе даже и не сосёт. Новый заголовок уже не столь вызывающий, впрочем.

Psych218 ★★★★★
()
Ответ на: комментарий от Psych218

Если тебе нужна драма - на хроме таки wasm пока проигрывает в полтора-два раза :). Сам пост я тоже обновил.

Vit ★★★★★
() автор топика

Результат, мягко говоря, не впечатляет.

думаю, если компилировать из C в wa — результат еще долго будет не впечатлять, или вообще никогда. потому что вся работа с памятью в wa эмулируется и тормозит. чтобы обойти эту проблему — нужно будет или доделывать vm, или писать сишный код особым образом, чтобы он в быстрый wasm компилировался, да и компиляторы наверное далеки от совершенства. в том виде в каком оно есть — оно не сильно отличается от обычного emscripten->js.

waker ★★★★★
()
Ответ на: комментарий от waker

потому что вся работа с памятью в wa эмулируется и тормозит

Откуда инфа? Там принципиальная разница в том, что нет аллокатора и память надо выделять одним куском, прокидывая снаружи. Других принципиальных проблем не наблюдаю.

Я смотрел сгенереный wast, все вполне по делу там.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Ты не то меряешь, работу с большими массивами (на тысячу и более символов) измерь, особенно массивы с двух-четырех байтными числами, четырехбайтными флоатами и может быть даже восьми байтными (ну чисто так, для полноты кавртины);

А это ты говно какое то принес а не бенчмарк, циклы и арефметика галимая с этим и жаваскрипт справляется прекрасно.

uin ★★★
()
Ответ на: комментарий от Vit

Откуда инфа?

с работы. у нас есть бэкенд для сборки под webgl, по сути C# компилируется в IL, потом оный в C++, а из него через emscripten в JS (и в WA то же самое). разработчики этого конвейера (и не только они, но и другие авторитетные люди) говорят что вся работа с памятью эмулируется. т.е., грубо говоря, вместо стандартных строк из JS (которые реализованы на C) идет побайтовая работа через байтовый буфер, со всеми вытекающими. и это не только со строками.

Я смотрел сгенереный wast, все вполне по делу там.

ну я твой конкретный случай не смотрел, я отвечал в общем.

waker ★★★★★
()
Ответ на: комментарий от waker

Ты WA и asm.js не смешивай. Последний действительно очень кастрированный, и фик знает во что оно потом на самом деле преобразуется. Тот же хром asm.js как-то отдельно вообще не поддерживает.

А в wasm вполне полноценный набор команд, смахивающий на llvm, и человеческие типы для чисел. Правда не знаю, на каком уровне сейчас трансляторы. Хромовский, судя по бенчмаркам, конкретно козлит.

Vit ★★★★★
() автор топика
Ответ на: комментарий от uin

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

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

Эти человеческие команды все равно загоняются в рамки сэндбокса, и оптимизируются совсем не так, как можно было бы ожидать. Смотреть надо не wasm, в котором все вполне может быть и по делу, а в дизассемблер сгенерированного машинного кода

waker ★★★★★
()
Ответ на: комментарий от waker

https://mbebenita.github.io/WasmExplorer/

Закинь туда этот код и посмотри во что преобразуются выделенные строки: https://github.com/puzrin/convolve-wasm/blob/master/convolve.c#L25-L33

 0x0000b2:                              ; 0x0000b2 from: [0x00010f]
  add r14d, 1                           ; 0x0000b2 41 83 c6 01
  movsx r12d, word ptr [r15 + rdx]      ; 0x0000b6 45 0f bf 24 17
  movsx ecx, word ptr [r15 + r8]        ; 0x0000bb 43 0f bf 0c 07
  imul r12d, ecx                        ; 0x0000c0 44 0f af e1
  add r9d, r12d                         ; 0x0000c4 45 03 cc
  mov r12d, edx                         ; 0x0000c7 44 8b e2
  add r12d, 6                           ; 0x0000ca 41 83 c4 06
  movsx r12d, word ptr [r15 + r12]      ; 0x0000ce 47 0f bf 24 27
  imul r12d, ecx                        ; 0x0000d3 44 0f af e1
  add r13d, r12d                        ; 0x0000d7 45 03 ec
  mov r12d, edx                         ; 0x0000da 44 8b e2
  add r12d, 4                           ; 0x0000dd 41 83 c4 04
  movsx r12d, word ptr [r15 + r12]      ; 0x0000e1 47 0f bf 24 27
  imul r12d, ecx                        ; 0x0000e6 44 0f af e1
  add eax, r12d                         ; 0x0000ea 41 03 c4
  mov r12d, edx                         ; 0x0000ed 44 8b e2
  add r12d, 2                           ; 0x0000f0 41 83 c4 02
  movsx r12d, word ptr [r15 + r12]      ; 0x0000f4 47 0f bf 24 27
  imul r12d, ecx                        ; 0x0000f9 44 0f af e1
  add edi, r12d                         ; 0x0000fd 41 03 fc
  add r8d, 2                            ; 0x000100 41 83 c0 02
  add edx, 8                            ; 0x000104 83 c2 08
  add r10d, -1                          ; 0x000107 41 83 c2 ff
  cmp r10d, 1                           ; 0x00010b 41 83 fa 01
  jg 0xb2


По-моему ничего лишнего.

Vit ★★★★★
() автор топика
Ответ на: комментарий от waker

Естественно. Я ж не бенчмарки ради бенчмарков делаю, а хочу конкретную прикладную задачу решить. Мне надо ресайзилку картинок ускорить.

Vit ★★★★★
() автор топика
Ответ на: комментарий от Vit

я это изначально и так понимаю, просто то что я писал в первом посте — было не о твоем коде конкретно, а вообще о WA в целом.

waker ★★★★★
()
Ответ на: комментарий от waker

Хотелось бы ближе к практике. Если я не закозлил с ключами, то сишный код через wasm до ассемблера вроде доходит во вполне годном виде. По крайней мере в фаерфоксе.

Vit ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.