2015-09-07 79 views
2

在JavaScript中,像C++一樣,在未來的ECMAScript標準和/或任何grunt/gulp模塊中是否有能力創建內聯函數(或某些地方的內聯普通函數調用)?JavaScript內聯函數就像在C++中

這裏簡單的方法的例子不是使載體

Vector.dot = function (u, v) { 
    return u.x * v.x + u.y * v.y + u.z * v.z; 
}; 

每次的點積當我'寫somethink像

Vector.dot(v1, v2) 

我想要確保的JavaScript只是做這個計算在線而不是使功能調用

+0

你是什麼意思?像這樣:'(function(){alert('Hello');})()'? – TechJS

+0

我可以考慮5個爲什麼它不會影響JS代碼的原因,因爲它會影響C++代碼。 –

+1

引擎很可能會對內聯內容做出明智的決定。我認爲可以寫一個預處理器來做到這一點,但我懷疑它是否會產生任何有意義的性能影響。 – 2015-09-07 11:03:11

回答

0

鑑於OP要求的性能,我會盡力提供一個答案。

如果您正在爲V8引擎進行優化,您可以查看以下文章以查看哪些函數被內聯,以及優化如何影響您的代碼。

http://floitsch.blogspot.com/2012/03/optimizing-for-v8-inlining.html

例如,如果你想看看Vector.dot被內聯,請使用以下命令行,其中script.js同時包含您定義和調用代碼:

d8 --trace-inlining script.js 

優化算法從發動機的不同到引擎,但內聯概念應該幾乎相同。如果您想了解其他引擎,請修改問題以包含確切的引擎,以便從JS引擎專家那裏獲得一些見解。

+0

謝謝深度參考。是時候弄髒手了 –

0

現代JS引擎已經內聯函數,當他們確定這是可能的和有用的。

請參閱http://ariya.ofilabs.com/2013/04/automatic-inlining-in-javascript-engines.html。報價:

如果你總是擔心手動函數內聯,這是重溫這個想法的好時機。只需編寫代碼即可,即使這意味着將代碼分解爲多個小函數!在很多情況下,我們可以信任現代JavaScript引擎來自動內聯這些功能。

我想你可以寫一個預處理器來處理inline關鍵字,並做必要的源代碼重寫(然後它綁定到一飲而盡或咕嚕如果你堅持),但這似乎是相當複雜,坦率地說,最有可能不值得的麻煩。