最適化をオンにして簡単なテストを行ったところ、古代AMD 64 X2プロセッサでは約150ミリ秒、合理的に最近のインテルi7プロセッサでは約90ミリ秒の結果が得られました。
次に、C++を使いたい理由があることを少し考えました。私はこれを取得するには、ループの4回の繰り返しをアンロール:
#include <stdio.h>
#include <ctime>
int main() {
double a = 3.1415926, b = 2.718;
double c = 0.0, d=0.0, e=0.0;
int i, j;
clock_t start, end;
for(j=0; j<10; j++) {
start = clock();
for(i=0; i<100000000; i+=4) {
a += b;
c += b;
d += b;
e += b;
}
a += c + d + e;
end = clock();
printf("Time Cost: %fms\n", (1000.0 * (end - start))/CLOCKS_PER_SEC);
}
printf("a = %lf\n", a);
return 0;
}
このAMDにおよそ44msで実行するC++コードは(インテルのこのバージョンを実行するのを忘れて)みましょう。その後、私はコンパイラの自動ベクトル化(VC++の-Qpar)を有効にしました。これにより、AMDでは約40ミリ秒、インテルでは約30ミリ秒まで、少しでも時間が短縮されました。
要点:C++を使いたい場合は、実際にコンパイラの使い方を学ぶ必要があります。本当に良い結果を得たい場合は、より良いコードを書く方法を学びたいと思うかもしれません。
私は次を追加する必要があります:ループをアンロールしてJavascriptでバージョンをテストしようとしませんでした。そうすることで、JSにも同様の(あるいは少なくともいくらか)速度改善がもたらされるかもしれません。個人的には、コードを高速化するのは、JavascriptをC++と比較するよりも面白いと思います。
このようなコードを高速で実行したい場合は、ループをアンロールします(少なくともC++では)。
並列計算の主題が発生して以来、OpenMPを使用して別のバージョンを追加すると思いました。私がそれをしている間、私はコードを少しきれいにしたので、何が起こっているのかを把握することができました。また、内部ループの実行ごとに時間の代わりに全体の時間を表示するために、タイミングコードを少し変更しました。結果のコードは、このように見えた:
#include <stdio.h>
#include <ctime>
int main() {
double total = 0.0;
double inc = 2.718;
int i, j;
clock_t start, end;
start = clock();
#pragma omp parallel for reduction(+:total) firstprivate(inc)
for(j=0; j<10; j++) {
double a=0.0, b=0.0, c=0.0, d=0.0;
for(i=0; i<100000000; i+=4) {
a += inc;
b += inc;
c += inc;
d += inc;
}
total += a + b + c + d;
}
end = clock();
printf("Time Cost: %fms\n", (1000.0 * (end - start))/CLOCKS_PER_SEC);
printf("a = %lf\n", total);
return 0;
}
プライマリここでさらに、以下の(明らかに多少難解)ラインである:これは、複数のスレッドで外部ループを実行するようにコンパイラに指示
#pragma omp parallel for reduction(+:total) firstprivate(inc)
を用いて、スレッドごとにinc
の別個のコピーを作成し、パラレルセクションの後に個々の値total
を一緒に追加します。
結果は、おそらくあなたが期待するものです。コンパイラの-openmp
フラグでOpenMPを有効にしないと、報告された時間は以前に実行したときの約10倍です(AMDの場合は409 ms、Intelの場合は323 MS)。 OpenMPをオンにすると、AMDの場合は217ミリ秒、インテルの場合は100ミリ秒になります。
インテルでは、元のバージョンは外側のループの1回の反復で90msかかりました。このバージョンでは、外側ループの10回の反復すべてでわずかに長くなり(100ms)、速度は約9:1向上します。より多くのコアを持つマシンでは、さらに多くの改善が期待できます(必要に応じて、手動でスレッド数を調整することはできますが、OpenMPは通常、すべてのコアを自動的に利用します)。
http://benchmarksgame.alioth.debian.org/
ベンチマークに言語のすべての種類:1が見てもよう
いいえ、私はg ++ xxx.cppコマンドを使用します。それを最適化するために使用するパラメータは何ですか?私はcppには慣れていません。 – streaver91
'-O3 -ffast-math'を追加して、C++タイミングがどうなるかを見てください。 –
* "長い間、私はいつもC++がJavaScriptより速くなければならないと思っています" * Javascriptエンジンは通常C++で実装されていることを理解しています – jamylak