■
あ?asm.js全然はやくない。
asm.jsの存在意義とはいったい…
function mod(stdlib, foreign, heap) { "use asm"; var FLOAT64 = new stdlib.Float64Array(heap); var INT32 = new stdlib.Float64Array(heap); function run(i0, i1, size) { i0 = i0 | 0; i1 = i1 | 0; size = size | 0; var i = 0; var v0 = 0.0; var v1 = 0.0; var idx0 = 0; var idx1 = 0; idx0 = 0; idx1 = 0; for (i=0; (i|0) <= (size|0); i=(i+1)|0) { v0 = +FLOAT64[((i*8|0+i0)|0)>>3]; v1 = +FLOAT64[((i*8|0+i1)|0)>>3]; FLOAT64[((i*8|0+i0)|0)>>3] = v0 * v1 + v1; } } function hoge() { var i = 0; var x = 0.0; var sz = 0; sz = 1000*128|0; for (i=0; (i|0) <= (sz|0); i=(i+1)|0) { run(0, 1000, 1000); } } return { hoge:hoge }; } var heap = new ArrayBuffer(4096*8); var foreign = new ArrayBuffer(4096*8); m = mod(window, foreign, heap); function jsrun(FLOAT64, i0, i1, size) { for (var i=0; i<size ; i++) { var v0 = FLOAT64[i0+i]; var v1 = FLOAT64[i1+i]; FLOAT64[i0+i] = v0*v1 + v1; } } function jshoge() { var FLOAT64 = new Float64Array(heap); for (var i=0; i<1000*128; i++) { jsrun(FLOAT64, 0, 1000, 1000); } } function vecadd() { console.time('js'); jshoge(); console.timeEnd('js'); console.time('asm'); m.hoge(); console.timeEnd('asm'); }
firefox nightly js: timer started js: 245.31ms asm: timer started asm: 276.43ms chrome js: 650.000ms asm: 921.000ms
Cで↓みたいに書いたら 216msec
#include <stdio.h> #include <windows.h> typedef double array_type; #define SIZE (4096*8) array_type FLOAT64[SIZE]; static array_type load(array_type *p, int idx) { if (idx < SIZE) { return p[idx]; } return 0; } static void store(array_type *p, int idx, array_type val) { if (idx < SIZE) { p[idx] = val; } } static __attribute__((noinline,noclone)) void run(array_type *FLOAT64, int start, int end, int size) { int i; for (i=0; i<size; i++) { store(FLOAT64, start+i, load(FLOAT64, start+i)*load(FLOAT64, end+i) + load(FLOAT64, start+i)); } } static __attribute__((noinline,noclone)) void hoge(array_type *FLOAT64) { int sz = 1000*128; int i; for (i=0; i<sz; i++) { run(FLOAT64, 0, 1000, 1000); } } int main() { int s, e; timeGetTime(); hoge(FLOAT64); s = timeGetTime(); hoge(FLOAT64); e = timeGetTime(); printf("%d\n", e-s); }
chrome は謎くて
function jsrun(FLOAT64, i0, i1, size) { for (var i=0; i<size ; i++) { var v0 = FLOAT64[i0+i]; var v1 = FLOAT64[i1+i]; // FLOAT64[i0+i] = v0*v1; // 224ms FLOAT64[i0+i] = v0*v1 + v1; // 658ms } }
まーこういう謎なことが起こらないことを保証してると思えばいいのか。