我今天收到了一个代码评审评论,将这个匿名类提取到一个字段中,以避免一次又一次地分配它:
Collections.transform(new Function<Foo, Bar>(){
Bar apply(Foo foo) {
// do some simple local transform of foo into a Bar.
}
});
我回答说“没关系,JVM优化了它”。虽然我知道这种“优化”不会以任何方式影响性能,而且我认为让代码内联访问的附加价值是值得的,但我很好奇我是否对JVM优化是正确的。所以,我的问题是--提议的重构绝对是一个没有操作的,因为JVM无论如何都会优化它,还是这里有一些微乎其微的理论特权?
发布于 2011-05-24 19:33:21
我不会特别期望它能优化它,不。
它必须确保Collections.transform
从未隐藏Function
,并且该方法本身从未使this
可见等等。很明显,所有这些都是可行的--但在很少的情况下,为了相对较小的收益,这可能是相当多的工作。
现在,如果不仔细检查,就很难说出任何特定VM所做的事情--但我认为“它不会对性能产生显著影响”比“JVM优化它”更合理。
发布于 2011-05-24 19:38:45
是否将其提取到字段中应该取决于您调用它的频率和父类的持续时间。如果父类存在的时间和应用程序一样长,那么为什么还要为这样一个琐碎的操作保留一个实例呢?相反,如果您经常调用此对象,则可以将其保存在变量中,以避免创建多个对象所带来的麻烦。
我认为我自己的经验法则是,如果内部类的作用域在方法调用中,而您的方法不是性能关键且实现很小,那么就把它留在原来的位置。
发布于 2011-05-24 19:36:30
我不认为JVM会对其进行优化--很可能,性能损失不值得进行优化。然而,内联代码的巨大好处远远超过了它。
https://stackoverflow.com/questions/6115783
复制相似问题