Валерий Кузьмин, СКБ Контур
FrontTalks, сентябрь 2017
Kontur.Recognition
Как?
Бизнес-логика на JS
Бизнес-логика на JS
OMG, тут все тормозит!
Как?
Бизнес-логика на JS
Бизнес-логика на JS
Шустрый код на C
WebAssembly - это...
"asm.js на стероидах"
WebAssembly - это не...
* Вообще неправда, уже есть компиляторы
Применение WASM
Рендеринг PDF
Работа с изображениями
Криптография
Обработка видео
Сериализация и
десериализация xml, json
Использование готовых игровых движков
Запуск других языков
Браузер в браузере
Математика, переборы,
сортировки
Базы данных на клиенте
Работа с архивами
Machine Learning
На пальцах
#0f0
#f00
#770
A
B
C
D
E
E = (A + B + C + D) / 4
JPEG
Canvas
JPEG
Canvas
canvas.width
Canvas
canvas.height
ctx.toDataURL
ctx.drawImage
JPEG
RGB
JPEG
RGB
libjpeg.decode
libjpeg.encode
stb resize
Wasm
Original
Chrome - canvas + sq=high
FF, IE - canvas
Wasm - laczos3
(и как это повторить у себя в проекте)
jpegasm (JS)
libjpeg-9a (C)
stb_resize_image (C++)
libjpegasm.js
emscripten
libjpegasm.wasm
Модули
var encode_jpeg = Module.cwrap('encode_jpeg',
'number', ['number', 'number', 'number',
...]);
int encode_jpeg(
unsigned char* rgb_buffer,
unsigned int rgb_width,
unsigned int rgb_height,
...);
C из JS (cwrap)
EMSCRIPTEN_BINDINGS() {
function("stbir_resize_uint8_generic",
optional_override(...) {
...магия с маршалингом...
}
}));
}
int stbir_resize_uint8(
const unsigned char *input_pixels ,
int input_w , int input_h , ...)
C++ из JS (embind)
#include <emscripten.h>
...
float coef = stbir__filter_info_table[filter]
.kernel((float)(out_last_pixel + 1)
+ 0.5f - out_center_of_in, scale_ratio);
EM_ASM_({console.log('coef', $0)}, coef)
...
JS из C (EM_ASM)
Резюме
Вместо заключения
Полезности
malcoriel@gmail.com
malcoriel
http://bit.ly/wasm-ft