为什么这个JavaScript程序要比C更快,所以可以填充大数组?

在开发一种可编译为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

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

解决方法:

试试这个版本

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版本不是直接等效的.

上一篇:我如何修复CA2100 Review SQL查询中的安全漏洞问题


下一篇:大家帮忙推荐一些非凸优化(Nonconvex optimization)的最新研究进展文献?