我正在为我的项目使用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会给出不同的脚本结果。所以这不应该是这样,我是否正确? 我的意思是不管优化级别如何,结果都应该是相同的。 –