我正在爲我的項目使用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時,犀牛做字節碼會發生什麼變化?
在此先感謝。
嗨格雷格,感謝您的及時答覆。我正在使用java的viualvm工具來查看類加載來修復我的產品中的一個性能問題。在那裏,當我通過0/1作爲優化級別時(我認爲在編譯腳本的過程中,後端類在字節代碼生成過程中得到了創建),幾個類一次又一次地被創建並且被垃圾收集。但是當設置優化級別爲-1,我沒有看到任何額外的類加載發生在PermGen space.So與優化級別設置爲-1,我看到不同的編譯腳本的o/p相比,優化級別0 –
有什麼辦法,你可以實際上編譯腳本然後緩存它們(例如Trireme這樣做)?然後你將節省時間和記憶。 –
我在項目中做了緩存實現來提高性能。 但是,將優化級別從0更改爲-1或+1會給出不同的腳本結果。所以這不應該是這樣,我是否正確? 我的意思是不管優化級別如何,結果都應該是相同的。 –