这个 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;
}
这个 excel vba 宏在我相对较慢的计算机上运行需要 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++,我使用 Code::Blocks 和 GCC
对于 VBA,我使用 Excel 2010。
对于 Code::Blocks,它的控制台中有一个内置计时器。
对于 excel,我使用了 iPhone 秒表(不喜欢使用 CHighResTimer http://www.ozgrid.com/forum/showthread.php?t=56900)
最佳答案
您的基准已关闭,利润率应该大得多。
例如,在我的电脑上,C++ 代码需要 7.46 秒(未经优化编译,使用 Unix time
工具计时);相比之下,VBA 代码用了 46 秒。这是一个更现实的差距(但我不会对更大的差距感到惊讶——传统的、非优化的解释器通常至少慢十倍)。
一方面,VBA 首先必须读入代码并逐行解释它或将其转换为中间表示。尽管如此,这个中间代码表示仍然是解释,而不是直接由 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 代码 的中间表示而不是逐行代码解释。
关于c++ - 简单算术运算(VBA 与 C++)之间运行时差异的主要原因是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13849795/