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