2010-07-26 88 views
4

考慮像Python或JavaScript,允許被嵌套這樣的功能語言:嵌套影響效率嗎?

print(vector(a * b),(a * c),(b * c))) 

或平板這樣的:

i = (a * b) 
j = (a * c) 
k = (b * c) 
V = vector(i,j,k) 
print(V) 

多少不同的格式會影響性能?是否可以進行有效的概括,或者語言是否有很大差異?

我期望優化編譯器能夠爲兩者執行內聯和輸出大致相同的機器代碼。所以這可能只是解釋語言的一個問題?

+0

是什麼讓你認爲嵌套效果的表現呢? – 2010-07-26 18:39:37

+3

您是在談論函數調用的嵌套還是函數定義的嵌套?例如。 '(+(*( - 1 2)3)4)'< - invocations。或者'function()outer {function inner(){alert('hi'); }}' – 2010-07-26 18:42:23

+1

是否可讀性受到威脅? – 2010-07-26 18:50:52

回答

3

任何函數調用都會添加少量的機器指令,包括更多的參數,與內嵌相同的代碼相比,或編譯將函數視爲內聯。

但是,它是非常少量的機器指令。因此,在大多數情況下,通過選擇和實現更高效的算法,您可以輕鬆地將任何非平凡大小的輸入返回。如果你真的處於性能的熾熱邊緣(很可能你不是,除非你在設備驅動程序上工作),那麼你可以開始內聯函數或切換到組裝。

但無論如何,請先寫清楚最清晰的代碼,然後在開始擔心性能之前進行測量。通過這樣做,你的bug就會減少,因此有更多的時間來優化你的正確工作代碼。

編輯:如果你指的是諸如匿名函數之類的東西,它們會導致性能下降,但與往常一樣,先測量,然後再優化。

+7

...如果你在性能的突飛猛進的前沿,你可能對這個問題足夠了解,而不必首先提出這個問題。 – 2010-07-26 19:09:26

+0

函數調用次數如何不同? – 2010-07-26 19:35:27

+0

@Bryan Oakley。那些剛剛接觸熾熱領域的人對這個問題不夠了解 - 因此他們會提出問題。 – phkahler 2010-07-26 20:05:14

2

在帕斯卡實現我所看到的,其中一個嵌套函數被允許訪問的變量在外部函數的範圍,編譯器必須保持每個嵌套級的額外的幀指針,解除引用它的任何時間嵌套函數從外部範圍訪問某些東西。我只希望這會是一個問題,如果嵌套函數在緊密循環中使用外部函數的變量。在這種情況下,性能可能會受到額外解引導操作的影響;將變量複製到循環外部的內部作用域可以避免額外的開銷。