Size: a a a

WebAssembly — русскоговорящее сообщество

2021 October 02

M

MaxGraey in WebAssembly — русскоговорящее сообщество
источник

PP

Petr Penzin in WebAssembly — русскоговорящее сообщество
Cheerp кстати имеет свой собственный пропозал
источник

К

Константин in WebAssembly — русскоговорящее сообщество
На счёт чего?
источник

でゲソ in WebAssembly — русскоговорящее сообщество
сделать cheerp great again
источник

PP

Petr Penzin in WebAssembly — русскоговорящее сообщество
Branch hints, влияет на порядок блоков в сгенерированном коде
источник

К

Константин in WebAssembly — русскоговорящее сообщество
А, ну потому что у них x86 JIT и им это имеет место быть
источник

PP

Petr Penzin in WebAssembly — русскоговорящее сообщество
Да, иначе в исходном один порядок, а генерированном совсем другой
источник
2021 October 05

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
Wasmer, похоже, того
источник

MV

Mikhail Voronov in WebAssembly — русскоговорящее сообщество
источник
2021 October 07

Б

Богдан in WebAssembly — русскоговорящее сообщество
Народ, меня тут интересует один аспект реализации кложур - а именно насколько очевидно для разработчика где будет peformance penalty. Обычный разработчик обычно знает что создание функций-замыканий связано с аллокацией объекта в хипе и некоторых дополнительных затрат и он будет учитывать это при написании горячих циклов.
Но рассмотрим такой пример
function someFunc(){
 let a = 0;
 if (...){
   arr.push(() => a += 1))
   anotherArr.push(() => a))
 }
 a = ...
}
for(/*горячий цикл*/){
 someFunc();
}
где внутри горячего цикла вызывается функция которая и создает замыкание но под условием. Разработчик подумает что если условие при котором создается замыкание выполняется очень редко (или может вообще не выполниться) то эта функция должна работать так же быстро как и без этого замыкания. Но насколько я понял из обсуждений в этом треде https://github.com/AssemblyScript/assemblyscript/issues/798 предлагается заранее создавать некий объект окружения в котором будет хранится переменная "а" до того как выполнится условие в результате чего разработчик будет обманут в ожиданиях потому что даже если условие не сработает такая функция будет выполняться намного медленнее. Или я неправильно понял?
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Если мы говорим про захват и мутацию переменной «a» в () => a += 1. То скорее всего она будет завернута в обхект на кучи (boxed) в любом случае. так как у нас AOT. Если бы это был JIT, то тут могли бы быть еще варианты
источник

Б

Богдан in WebAssembly — русскоговорящее сообщество
это понятно что будет боксинг но вопрос когда это произойдет - после того как сработает условие (внутри которого создается замыкание) или до него? Если до него (в момент инициализаци) то получаем неочевидный для разработчика момент падения производительности - замыкания еще не было создано (оно под условием которое может и не выполниться) а мы уже получаем тормоза (как минимум из-за чтения-записи boxed-переменной в памяти вместо локальной переменной в регистрах)
источник

К

Константин in WebAssembly — русскоговорящее сообщество
АОТ, думаю сразу
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Тот же LLVM это вспе превратит в очень страшное стагетти

https://godbolt.org/z/Gzfe19eGq
источник

M

MaxGraey in WebAssembly — русскоговорящее сообщество
Возможно без std::function будет лучше, но я не помню как правильно объявить сигнвтуру замыкаания =)
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Никак
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Без него будет лучше
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Ну только через шаблоны
источник

D

Danya in WebAssembly — русскоговорящее сообщество
Если С++20, то можно void foo(std::invocable auto bar) {}

bar — callable без параметров
источник