我對某些優化方法或通用字節碼設計很感興趣,與AST的解釋相比,這可能有助於加快使用VM的執行速度。如何使用字節碼來優化動態語言的執行時間?
回答
AST解釋與字節碼的主要勝利是操作調度成本,對於高度優化的解釋器,這開始成爲一個真正的問題。 「調度」是用於描述開始執行操作所需的開銷(例如算術,屬性訪問等)的術語。基於
還算正常AST解釋會是這個樣子:
class ASTNode {
virtual double execute() = 0;
}
class NumberNode {
virtual double execute() { return m_value; }
double m_value;
}
class AddNode {
virtual double execute() { return left->execute() + right->execute(); }
}
所以執行如1+1
一樣簡單的代碼需要3個虛擬電話。虛擬呼叫是非常昂貴的(在事物的宏偉計劃中),這是由於呼叫的多重間接,以及首先撥打電話的總成本。
在一個字節碼解釋你有不同的調度模型 - 而不是虛擬的電話你有一個執行循環,類似於:
while (1) {
switch (op.type) {
case op_add:
// Efficient interpreters use "registers" rather than
// a stack these days, but the example code would be more
// complicated
push(pop() + pop());
continue;
case op_end:
return pop();
}
}
這仍然具有相當昂貴的成本派遣VS本地代碼,但比虛擬調度快得多。您可以使用名爲「computed goto」的gcc擴展來進一步提高性能,從而允許您刪除交換機調度,從而將總調度成本降低到基本上單個間接分支。
除了提高分派成本基於字節碼的解釋器還有一些優於AST解釋器的優點,主要是由於字節碼能夠像真機一樣「直接」跳轉到其他位置,例如想象一個片段像這樣的代碼:
while (1) {
...statements...
if (a)
break;
else
continue;
}
爲了實現這個正確每次一個語句執行則需要指出的執行是否打算留在循環或停止,所以執行循環變得像:
while (condition->execute() == true) {
for (i = 0; i < statements->length(); i++) {
result = statements[i]->execute();
if (result.type == BREAK)
break;
if (result.type == CONTINUE)
i = 0;
}
}
隨着您添加更多形式的流量控制,此信號變得越來越昂貴。一旦添加了異常(例如可以在任何地方發生的流量控制),您甚至需要在基本算術中檢查這些事情,從而導致不斷增加的開銷。如果你想在現實世界中看到這一點,我鼓勵你看看ECMAScript規範,他們在這裏用AST解釋器來描述執行模型。
在字節碼解釋器中,這些問題基本消失了,因爲字節碼能夠直接表示控制流而不是通過信號間接表達,例如。 continue
只是簡單地轉換成跳轉指令,如果它實際被觸發,你只能得到這個成本。
最後定義的AST解釋是遞歸的,所以必須從溢出系統堆棧,這使多少你可以在你的代碼遞歸非常沉重的限制阻止,是這樣的:
1+(1+(1+(1+(1+(1+(1+(1+1)))))))
在翻譯中有8個遞歸層次(至少) - 這可能是一個非常重要的成本;老版本的Safari(SquirrelFish之前版本)使用AST解釋器,爲此,JS僅允許在現代瀏覽器中允許數百個遞歸級別與1000個遞歸級別相比。
也許你可以看看llvm「opt」工具提供的各種方法。這些是字節碼到字節碼的優化,而工具本身將提供應用特定優化的好處的分析。
- 1. 如何優化此代碼以節省執行時間?
- 2. 如何優化SQL查詢來實現最小執行時間
- 3. 用D語言測量執行時間
- 4. 優化ldap研究的執行時間
- 5. 優化PSQL查詢的執行時間
- 6. 動態生成的java字節碼是否需要優化?
- 7. 優化查詢,花費更多的時間來執行
- 8. Java字節碼優化
- 9. 優化Java字節碼?
- 10. 優化Cuda內核時間執行
- 11. Seaborn Heatmap繪圖執行時間優化
- 12. SQL查詢優化 - 執行時間
- 13. 如何動態使用優化
- 14. 動態語言運行時的文檔?
- 15. 何時使用各種語言編譯指示和優化?
- 16. 基於JVM的語言/運行時如何生成Java字節碼?
- 17. 優化python搜索代碼,減少執行時間
- 18. 在GAE中混合使用更快的語言進行優化
- 19. 這個查詢需要很多時間來執行,如何優化它?
- 20. 使用Javascript優化運行時間
- 21. 如何優化執行時間與pdo插入數據?
- 22. 優化LINQ查詢 - 如何提高執行時間?
- 23. 如何優化這個查詢,執行時間是40分鐘?
- 24. 如何優化SQL查詢執行時間
- 25. 如何優化此查詢,執行時間超過一分鐘
- 26. 在優化硬件時,編譯語言如何比解釋語言更好?
- 27. 如何獲得Java程序運行時執行的字節碼?
- 28. 彙編語言優化器
- 29. Sitecore URL優化和語言
- 30. 隨時間變化的代碼優化
謝謝,有道理:) – 2010-08-27 23:47:03