在开发编译为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
为什么会这样?我应该重新考虑一下吗?
答案 0 :(得分:3)
试试这个版本
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版本的直接等价物。