c++ - 简单算术运算(VBA 与 C++)之间运行时差异的主要原因是什么?

标签 c++ performance vba

这个 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/

相关文章:

javascript - 自动建议 20,000 个条目

python - 如何提高 Python 中 odeint 的速度?

javascript - 操作因 DOM 复杂性而降低?

excel - 如何使用 vba 突出显示小数或字符小于 3 且大于 6 的单元格?

c++ - 数组错误(不允许使用不完整的类型)

c++ - g++中的 undefined reference 错误

c++ - 稀疏矩阵乘积的特征求解器

c++ - reverse() 和学习指针

vba - 使excel文件使用带有vba的全局工作簿功能?

vba - 如何格式化从特定行到下的 Excel 列