2015-10-20 125 views
0

我正在爲我的項目使用Rhino 1.7R4。 通過設置Rhino的優化級別從0到-1(因爲我不需要額外的類文件生成),我得到意想不到的結果。犀牛的優化級別

在Rhino代碼中,在Codegen類下,根據優化級別設置進行一些額外的處理。

if (optLevel > 0) { 
     /* 
     * Collect all of the contained functions into a hashtable 
     * so that the call optimizer can access the class name & parameter 
     * count for any call it encounters 
     */ 
     if (tree.getType() == Token.SCRIPT) { 
      int functionCount = tree.getFunctionCount(); 
      for (int i = 0; i != functionCount; ++i) { 
       OptFunctionNode ofn = OptFunctionNode.get(tree, i); 
       if (ofn.fnode.getFunctionType() 
        == FunctionNode.FUNCTION_STATEMENT) 
       { 
        String name = ofn.fnode.getName(); 
        if (name.length() != 0) { 
         if (possibleDirectCalls == null) { 
          possibleDirectCalls = new HashMap<String,OptFunctionNode>(); 
         } 
         possibleDirectCalls.put(name, ofn); 
        } 
       } 
      } 
     } 
    } 

這是唯一的額外的代碼,我可以找到犀牛這將一些額外的字節代碼優化,如果選擇級別> 0 但我改變我的使用情況優化級別從0到-1以使用Rhino的解釋器模式

所以我的問題是,當優化級別從0更改爲-1時,犀牛做字節碼會發生什麼變化?

在此先感謝。

回答

1

此文檔仍然是最新在什麼不同的優化水平犀牛做:

https://developer.mozilla.org/en-US/docs/Mozilla/Projects/Rhino/Optimization

實際上,當你設置的優化級別爲-1,然後切換到犀牛解釋模式,這意味着它執行代碼的路徑不同於編譯模式。解釋模式當然比編譯模式慢得多。我們在Rhino有一個體面的測試套件,並且不會經常看到兩者之間的差異,但當然可能存在我們需要修復的錯誤。

當你說「我不需要額外的類文件來生成」時,你是什麼意思?當你在非解釋模式下運行Rhino時,它確實會生成字節碼,然後執行它,但是它不會生成或保存「類文件」,除非您明確這麼做 - 但運行速度更快。

最後,1.7R4是一些舊版本,許多bug已經修復。我會鼓勵你去嘗試一個較新的版本:

https://github.com/mozilla/rhino

+0

嗨格雷格,感謝您的及時答覆。我正在使用java的viualvm工具來查看類加載來修復我的產品中的一個性能問題。在那裏,當我通過0/1作爲優化級別時(我認爲在編譯腳本的過程中,後端類在字節代碼生成過程中得到了創建),幾個類一次又一次地被創建並且被垃圾收集。但是當設置優化級別爲-1,我沒有看到任何額外的類加載發生在PermGen space.So與優化級別設置爲-1,我看到不同的編譯腳本的o/p相比,優化級別0 –

+0

有什麼辦法,你可以實際上編譯腳本然後緩存它們(例如Trireme這樣做)?然後你將節省時間和記憶。 –

+0

我在項目中做了緩存實現來提高性能。 但是,將優化級別從0更改爲-1或+1會給出不同的腳本結果。所以這不應該是這樣,我是否正確? 我的意思是不管優化級別如何,結果都應該是相同的。 –