2013-04-29 65 views
0

Fortran中OOP功能的標準行是它們對可讀性和重用性都很好,但對執行時間不利。當我測試時,我得到了不同的結果。程序功能與子程序的速度

我寫了一個簡單的虛擬程序,通過在派生類型中添加兩​​個大數組來測試這個程序。我發現call c%eqPlus(a,b)與添加標準數組一樣快。然而,這似乎不如只寫c%array = a%array+b%array明確。不幸的是,c=a+b對於1M以上的數組而言速度要慢兩倍左右。 (對於小於500K的數組,值爲c=a+b的速度一樣快,但這可能取決於特定的計算機。)

OOP風格的真正問題是將所有函數都寫成函數而不是子例程?有沒有辦法得到c=a+b,這對大型數組沒有這種開銷?

+0

它會受處理器的影響很大。你是否也嘗試直接調用該函數?現在,編譯器編寫者專注於如何實現這些功能以可靠地工作,而不是速度。理論上它應該能夠對相同的機器代碼進行優化,但這不是我們現在擁有的。 – 2013-04-29 16:56:59

+0

是的,我試過了,並且有一些不健康的其他變體 - 相同因素變慢。不過,我不會抱怨可靠性。 – weymouth 2013-04-30 06:53:40

回答

0

如果你想想看,使用功能將是慢了很多,因爲

1)內存已被分配的返回值 2)當函數返回時,數據必須被複制到接收變量 3)臨時內存必須被丟棄。

當調用子程序時,您只需將結果直接寫入輸出變量。

OOP風格不是關於在函數中編寫所有內容:這只是爲了方便,以便讀取代碼的人可以更容易地理解它。 OOP更多的是擁有數據的對象,並負責管理他們自己的數據。

+0

編譯器通常可以優化這種差異。 – 2013-05-15 21:24:00

+0

我對編譯器優化有懷疑,特別是返回巨大數組或結構的函數,因爲您在C++,C#,Java和Delphi中會遇到完全相同的性能問題。 – cup 2013-05-17 22:56:57