2012-12-12 61 views
1

該C++程序從20至25秒至我的相對慢的計算機上運行時:簡單算術運算之間運行時差異的主要原因是什麼 - VBA與C++?

#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++我使用的代碼::塊與GCC

對於VBA我用Excel 2010中

代碼:: Blocks的它有一個內置的定時器,在它的控制檯。

爲Excel我用了一個iPhone秒錶(沒感覺就像使用CHighResTimer http://www.ozgrid.com/forum/showthread.php?t=56900

+0

你是如何計時的?你是單獨計算操作的時間,還是計劃整個過程的運行? – Void

+3

顯然,這是因爲循環的VBA運行900000001次迭代,而C++的for循環只做900000000. –

+0

@Void我定時整個程序運行時間。另請參閱信息中添加的信息: – Stepan1010

回答

4

您的基準已關閉,保證金應該更大。例如,在我的電腦上,C++代碼需要7.46s(編譯時沒有進行優化,使用Unix time工具定時);相比之下VBA代碼花費了46s。這是一個更現實的餘地(但我不會對更大的一個感到驚訝 - 傳統的非優化解釋者通常至少是十倍慢)。

首先,VBA首先必須讀取代碼並逐行解釋或將其轉換爲中間表示形式。儘管如此,這個中間代碼表示仍然是,解釋爲,不是由CPU直接運行(或者你是否計算了C++中的編譯時間?)。

此外,VB(A)做了很多的冗餘的東西,在這個碼是在C++中不存在:例如,每一個整數加法(這是在For環路的遞增隱含在代碼變量)被防止溢出。本質上,這VB代碼

i = i + 1 

被變換爲下面的僞中間代碼:

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

...爲整數操作。這消耗了相當多的運行時間。數組(或在此:單元)訪問操作也是如此。


認爲 VBA使用的中間表示稱爲通過線代碼解釋P碼而非線。

+0

我也覺得保證金應該更高。我很想知道其他人提出的利潤率是多少。 – Stepan1010

+0

@ Stepan1010見第二段的更新。 –

+0

使用「發佈」構建目標而不是「調試」將其編譯爲約15秒。 – Stepan1010

1

不同的是常見的,最大的區別是,C++編譯。我很驚訝,差別不是數量級更大。大多數性能基準測試顯示C/C++比腳本語言快10倍以上。你如何編譯C++代碼?我敢打賭,如果在最佳優化級別進行編譯,它會在5-10秒內運行。如果你還沒有,你應該編譯一個-O3標誌並記下它的時間。

我不太瞭解VBA,但是如果您正在編譯C++並進行完全優化,我認爲VBA更有可能通過即時編譯器運行,然後執行與VB.NET相同的CLR 。你展現的性能更像VC++ vs. VB.NET,而不是VC++與任何腳本語言。

+0

如果他使用現代編譯器並打開優化,我敢打賭,循環會下降到僅僅幾微秒,因爲編譯器會檢測到它可以預先計算最終結果並完全優化循環。 – phonetagger

+1

最後一段有趣的假設。我最後一次參與VBA時沒有CLR的端口,但那是大約7年前的事情,從那以後可能會發生很多事情。 –

+0

@KonradRudolph是的,我希望我能找到更多關於它的信息......必須有一些事情發生,我個人無法相信腳本語言是用C++ 1:2運行的。這些數字看起來更像你從Jython,IronPython或JRuby中獲得的東西。 – evanmcdonnal

1

我不相信VBA中的代碼行被一遍又一遍地解釋,必須有一些緩存,否則這個因子會比1:2大得多。

可以有很多差異。自然地,不同語言之間從高級語言到CPU語法的轉換是不同的。 C++編譯器針對性能進行了優化,以滿足各種應用程序的需求,這在Office產品中可能不那麼重要。

0

我想付諸通俗地說想象VB是如何構建的,它下面是攻以前用C語言開發的東西++。所以,無論你如何切它有一個隱藏的C++「中間人」一切之下VB並在大多數情況下,讓某些東西被在本質上做兩次,如內置的錯誤保障,interps等

我還發現VBA作爲一個標準項目或與使用AutoCAD VBA的進程DLL中內置的相同功能的差異,但沒有計算性能差異,但我可以看到進程內運行速度更快,因爲在VBA中運行速度也會更快比從外部VB連接到AutoCAD。看來在VBA中爲你分配了可用的內存,而VB正在使用它自己的進程,我不知道,但它是查找速度提高的地方。