Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/455.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript emscripten代码中的巨大性能缺陷_Javascript_C++_Emscripten - Fatal编程技术网

Javascript emscripten代码中的巨大性能缺陷

Javascript emscripten代码中的巨大性能缺陷,javascript,c++,emscripten,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;

现在是凌晨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;
}
#包括
#包括
int main(){
时钟启动=时钟();
int结果=0;
对于(int a=0;a<100000000;a++){
结果+=a;
}
printf(“所用时间:%.2fs\n”,(双精度)(clock()-tStart)/CLOCKS\u/SEC);
返回1;
}
以及:

var start=new Date().getTime();
var结果=0;
对于(var a=0;a<100000000;a++){
结果+=a;
}
var end=new Date().getTime();
var时间=结束-开始;
log('Time take:'+(Time/1000)+'s');
他们两人做同样的事情(我希望如此)

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


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

node.js缺少大多数真正的asm.js性能调整,这些调整使emscripten变得快速。在firefox或chrome中尝试,而不是在node中尝试


问题是node.js往往落后于chrome的V8版本,因此进入chrome的功能(或优化)可能需要相当长的时间才能进入V8。我不知道到底需要多长时间,但是asm.js的优化已经足够新了,当我在2014年4月初最后一次尝试它时,node.js在命令行上的速度明显慢于Chrome浏览器,Firefox的速度更快。

我想你的编译工具链中可能有一个bug。确保它不会意外地包含系统库/头,而不是emscripten的选择。还要确保你没有意外地使用你的系统

如果您使用emcc-vetest.cpp(假设test.cpp是您编译的文件),它应该确切地告诉您它将依赖哪些头、llvm/clang和节点。下面可以看到,EMCCC默认编译实际上比框外CLANG C代码运行得快(这可能看起来令人惊讶,但V8运行时优化,C++没有)。
最后,确保您使用的是最新和最好的。/emsdk更新,然后。/emsdk安装最新版本-64位。这是在MacOS X Mavericks上用node 0.10.21和emscripten 1.16测试的。

你试过看emscripten生成的javascript吗?@SimpleJ没有,我确实认为它有点没用。我对emscripten了解不多,但是我假设你会通过比较输出的JavaScript到手工的JavaScript,然后通过比较你手工制作的JavaScript和C++来得到更多的答案。你也应该尝试向EnScript讨论谷歌集团,他们非常有反应性V8比天真的C++做了更多的优化。不确定asm编译器有多好…这意味着在这种情况下是NodeJ的问题?或多或少,可能是这样。我在GradeCam为我们的技术构建做了一个基准测试,在node.js中用了122秒,在Firefox中用了24秒。我对此表示怀疑,使用emscripten 1.16默认编译(例如,没有优化开关,没有头包含等)比本机编译(node 0.10.21,emscripten 1.16)运行得更快。这似乎更可能是使用的工具链中的一个bug,请参阅我下面的帖子。@Trevor这一切都取决于你在做什么。我们的工具链设置正确,但我们所做的需要大量的编译器优化,而这在asm.js中是不可能的。相信我,我已经花了很多时间测试不同的工具链选项,以确保这是真的。此外,Firefox团队告诉我,他们希望在理想情况下,asm.js的速度“仅”是本机的2倍。在正常情况下,复杂的C应用程序在emscripten中永远不会比在本机代码中更快。在某些简单的应用程序中可能会出现这种情况,但大多数情况下不会。甚至Firefox团队也表示了这一点。emscripten中有很多编译优化是不可能的。我怀疑节点版本越新,也会得到更好的结果。
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');
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$