【问题标题】:Why this JavaScript program is faster than C++ to fill a big array?为什么这个 JavaScript 程序比 C++ 更快地填充一个大数组?
【发布时间】:2013-11-17 12:08:39
【问题描述】:

在开发可编译为 JavaScript 的语言时,我也在考虑以 C++ 为目标,以便在需要时生成更快的程序。我的计划是使用 std::vectors 来保存我的语言的动态数组。重复填充一个大数组将是一个正常的操作(双缓冲),所以我测试了一下:

#include <iostream>
#include <vector>
std::vector<int> gen(int w,int h){
    std::vector<int> a;
    a.resize(w*h);
    for (int i=0; i<w*h; ++i)
        a[i]=i;
    return a;
};  
int main(){
    for (int i=0; i<100; ++i)
        std::vector<int> a = gen(1000,1000);
};

奇怪的是,这个程序并不比等效的 JavaScript 快:

gen = function(w,h){
    var a = new Float32Array(w*h);
    for (var i=0; i<w*h; ++i)
        a[i]=i;
    return a;
};
for (var i=0; i<100; ++i)
    gen(1000,1000);

令人惊讶的是,JS 版本的运行速度提高了 3 倍。

clang++ my_program.cpp -o my_program
time ./my_program
real    0m1.393s
user    0m1.379s
sys     0m0.005s

time node my_program.js
real    0m0.458s
user    0m0.320s
sys 0m0.132s

为什么会这样?我应该重新考虑吗?

【问题讨论】:

  • 您是否编译了启用优化的 C++ 程序?
  • 你编译过优化吗?此外,无需致电resize()。只需像这样实例化向量:std::vector&lt;int&gt; a(w*h);
  • 优化的问题(我试过-O2)显然它只是生成了一个什么都不做的程序(因为我猜它检测到这个程序没有做任何事情)。所以它立即运行。问题是当我在实际应用程序中实际使用这些数组时,它显然无法应用这些优化并立即运行。想法?
  • 那么你必须构造一个真实的测试用例。显然,没有代码比来代码无限快,所以 C++ 比 Javascript 无限快:-)
  • @Viclib:所以您是说 JavaScript 更快,但前提是您告诉 C++ 非常非常慢?如果你设置和设置不相等,例如,将 Udain Bolt 左脚锁在一个巨大的金属球上并让他参加 100m 比赛,那么你不应该对意想不到的结果感到惊讶(尽管我预计 Udain 仍然会获胜)。跨度>

标签: javascript c++ arrays performance optimization


【解决方案1】:

试试这个版本

void gen(int w,int h,std::vector<int>& a){
    a.resize(w*h);
    for (int i=0; i<w*h; ++i)
        a[i]=i;
}

int main(){
    for (int i=0; i<100; ++i) {
        std::vector<int> a;
        gen(1000,1000,a);
    }
};

您的版本的问题是它在返回值时复制了向量。因此,它并不直接等同于 JS 版本。

【讨论】:

  • 我本以为复制省略会出现在这里。当然,不能保证,但还是……
猜你喜欢
  • 1970-01-01
  • 2019-09-29
  • 1970-01-01
  • 2014-05-19
  • 2014-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-01-22
相关资源
最近更新 更多