1

このC++プログラムは、私の比較的遅いコンピューターで実行するのに20〜25秒かかります。

#include <iostream>

int main()
{
int i;
double test = 456;

for (i = 0; i < 900000000; i++) {
    test = (test / 0.99999999);
}
    std::cout << "The value of test is " << test <<".\n";
    return 0;
}

このexcelvbaマクロは、比較的遅いコンピューターで実行するのに37〜40秒かかります。

Sub Macro1()
Dim i As Long
Dim test As Double
test = 456

For i = 0 To 900000000
    test = (test / 0.99999999)
Next i

Cells(1, 1).Value = test
End Sub

この違いは(C ++と非コンパイル言語の)典型的なものですか?この時間の違いに寄与する主な要因は何ですか?C ++がコンパイルされているという事実が最も重要な要素ですか?ありがとう。

情報:

C ++の場合、GCCでCode::Blocksを使用しました

VBAにはExcel2010を使用しました。

Code :: Blocksの場合、コンソールにタイマーが組み込まれています。

エクセルのために私はiPhoneストップウォッチを使用しました(CHighResTimer http://www.ozgrid.com/forum/showthread.php?t=56900を使用する気がしませんでした)

4

4 に答える 4

4

あなたのベンチマークはオフです。マージンはもっと大きくなるはずです。

たとえば、私のコンピューターでは、C++ コードの実行に 7.46 秒かかります (最適化なしでコンパイルし、Unixtimeツールで時間を計った場合)。対照的に、VBA コードは 46 秒かかりました。これははるかに現実的なマージンです (しかし、それ以上の差があっても驚かないでしょう。従来の最適化を行わないインタープリターは通常、少なくとも 10 倍遅くなります)。

1 つには、VBA は最初にコードを読み込み、1 行ずつ解釈するか、中間表現に変換する必要があります。それにもかかわらず、この中間コード表現は依然として解釈され、CPU によって直接実行されません (または、C++ でコンパイル時間を数えましたか?)。1

さらに、VB(A) はこのコードで、C++ にはない多くの冗長な処理を行います。たとえば、すべての整数加算 (Forループ変数のインクリメントでコード内で暗黙的に行われます) は、オーバーフローから保護されます。基本的に、この VB コードは

i = i + 1

次の疑似中間コードに変換されます。

if i + 1 overflows then
    raise an overflow error
end if
i = i + 1

すべての整数演算に対して。これはかなりの実行時間を消費します。同じことが配列 (またはここではセル) アクセス操作にも当てはまります。


1 VBA は、行ごとのコード解釈ではなく、P コードと呼ばれる中間表現を使用していると思います。

于 2012-12-12T22:39:15.977 に答える
1

違いは一般的であり、最大の違いはC++がコンパイルされることです。違いが桁違いに大きくないことに驚いています。ほとんどのパフォーマンスベンチマークは、C /C++がスクリプト言語よりも10倍以上高速であることを示しています。C ++コードをどのようにコンパイルしていますか?最高レベルの最適化でコンパイルした場合、5〜10秒で実行されるに違いありません。まだ行っていない場合は、-O3フラグを付けてコンパイルし、時間を計る必要があります。

VBAについてはよくわかりませんが、完全な最適化を使用してC ++をコンパイルしている場合は、VBAがジャストインタイムコンパイラで実行され、CLRでVB.NETと同じように実行されている可能性が高いと思います。そこに示されているパフォーマンスは、VC ++と他のスクリプト言語よりも、VC++とVB.NETに似ています。

于 2012-12-12T22:34:54.860 に答える
1

VBAのコード行が1つずつ何度も解釈されるとは思いません。キャッシュが必要です。そうでない場合、係数は1:2よりはるかに大きくなります。

多くの違いがあります。当然、高級言語からCPU命令への移行は、言語によって異なります。C ++コンパイラは、さまざまなアプリケーションに対応できるようにパフォーマンスが最適化されていますが、Office製品ではそれほど重要ではありません。

于 2012-12-12T22:35:54.837 に答える