emscripten代码缺乏巨大的性能

时间:2014-05-01 22:11:01

标签: javascript c++ emscripten

它在凌晨2点50分在忙碌的一天之后我发现了一些奇怪的东西。我会尽力给出问题的照片。

我在C++JavaScript中编写了这两段代码:

#include<stdio.h>
#include <time.h>

int main() {
    clock_t tStart = clock();

    int result = 0;
    for (int a = 0; a < 1000000000;a++) {
        result += a;
    }

    printf("Time taken: %.2fs\n", (double)(clock() - tStart)/CLOCKS_PER_SEC);

  return 1;
}

var start = new Date().getTime();

var result = 0;

for(var a = 0;a < 1000000000;a++) {
    result += a;
}

var end = new Date().getTime();
var time = end - start;
console.log('Time taken: ' + (time/1000) + 's');

他们两个都做同样的事情(我希望如此)

使用最新版本的emscripten生成./a.out.js后,我发现了一些奇怪的东西: the result of executing both codes

emscripten代码的执行时间实际上比手动编写的JavaScript代码慢。问题是什么?

2 个答案:

答案 0 :(得分:4)

node.js缺乏大多数真正的asm.js性能调整,这使得emscripten变得更快。不要尝试使用节点,而是在firefox或chrome中尝试。

问题是node.js往往落后于chrome的V8版本,因此进入Chrome的功能(或优化)可能需要很长时间才能进入V8版本。我实际上并不知道多长时间,但asm.js的优化是新的,当我上次在2014年4月初尝试它时,在使用node.js的命令行上比使用Chrome和Firefox的浏览器慢得多还是更快。

答案 1 :(得分:2)

我认为您的编译工具链中可能存在某个错误。确保它不会意外地包括系统库/标头而不是emscripten的选择。还要确保您没有意外地使用系统铿锵声。

如果你做了emcc -v test.cpp(假设test.cpp是你编译的文件),那么它应该告诉你它将依赖的头文件,llvm / clang和节点。下面你可以看到emcc默认编译实际上比开箱即用的clang本机c代码运行得更快(这可能看起来令人惊讶,但V8会进行运行时优化,C ++不会。)

slcmew-nmx2499:Downloads trevor.linton$ gcc test.cpp
slcmew-nmx2499:Downloads trevor.linton$ ./a.out
Time taken: 2.33s
slcmew-nmx2499:Downloads trevor.linton$ emcc test.cpp
slcmew-nmx2499:Downloads trevor.linton$ node a.out.js
Time taken: 1.17s
slcmew-nmx2499:Downloads trevor.linton$ 

最后确保您使用最新最好的./emsdk更新,然后./emsdk安装最新的64位。这是在MacOS X Mavericks上使用节点0.10.21和emscripten 1.16进行测试的。