【发布时间】: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<int> a(w*h); -
优化的问题(我试过-O2)显然它只是生成了一个什么都不做的程序(因为我猜它检测到这个程序没有做任何事情)。所以它立即运行。问题是当我在实际应用程序中实际使用这些数组时,它显然无法应用这些优化并立即运行。想法?
-
那么你必须构造一个真实的测试用例。显然,没有代码比来代码无限快,所以 C++ 比 Javascript 无限快:-)
-
@Viclib:所以您是说 JavaScript 更快,但前提是您告诉 C++ 非常非常慢?如果你设置和设置不相等,例如,将 Udain Bolt 左脚锁在一个巨大的金属球上并让他参加 100m 比赛,那么你不应该对意想不到的结果感到惊讶(尽管我预计 Udain 仍然会获胜)。跨度>
标签: javascript c++ arrays performance optimization