Java:关于for循环中方法调用的问题
我有一个for循环,其中包含以下行:Java:关于for循环中方法调用的问题,java,Java,我有一个for循环,其中包含以下行: method1(similarities.instance(i)); method2(similarities.instance(i)); method3(similarities.instance(i)); 如果我将a=complications.instance(I)存储到一个变量中,并且我将for循环更改为: method1(a); method2(a); method3(a) ) 我有更好的表现吗?因为我没有在每次迭代时调用该方法?这是我应该经常
method1(similarities.instance(i));
method2(similarities.instance(i));
method3(similarities.instance(i));
如果我将a=complications.instance(I)存储到一个变量中,并且我将for循环更改为:
method1(a);
method2(a);
method3(a)
)
我有更好的表现吗?因为我没有在每次迭代时调用该方法?这是我应该经常做的事情吗?这主要取决于
中的相似之处。instance()
。下面我假设这3个调用完全相同
如果它是一个简单的getter,您很可能不会注意到任何性能差异。如果资源很重,你可以。尽管如此,我相信JIT可以很容易地优化掉3个不同的方法调用,将结果存储在一个临时文件中。底线是,你不应该担心微观优化
因此,在大多数情况下,唯一的区别是可读性(这本身就足够重要)。从这个角度来看,我更喜欢选项2。这主要取决于
相似性的内部内容。instance()
。下面我假设这3个调用完全相同
如果它是一个简单的getter,您很可能不会注意到任何性能差异。如果资源很重,你可以。尽管如此,我相信JIT可以很容易地优化掉3个不同的方法调用,将结果存储在一个临时文件中。底线是,你不应该担心微观优化
因此,在大多数情况下,唯一的区别是可读性(这本身就足够重要)。从这个角度来看,我更喜欢选项2。我认为您应该存储它,这将确保没有价值的性能,如果
相似,也不会失败。instacnce()
有副作用,您不想重复它。我认为您应该存储它,这将确保没有价值的性能,如果相似,也不会失败。instacnce()
有副作用,如果相似,您不想重复。实例(i)等于相似。实例(i)对于所有调用,您的第二种方法都是合适的,是的,您将获得更好的性能
更新(基于评论):
此外,如果相似性。实例(i)等于相似性。实例(i)对于所有调用,您的第二种方法都是合适的,是的,您将获得更好的性能 更新(基于评论):
此外,结果不能被任何消费者方法修改,就像它所依赖的许多事情一样。如果调用similations.instance(i)的代价很高,那么将其存储在变量中并重用它将提高性能 然而,这确实不是一个可以从总体上回答的问题。您需要分析/测试性能上的差异,看看是否会产生差异。我想说,在大多数情况下,你不应该担心它,除非方法调用正在做一些缓慢的事情,比如访问数据库或网络
也就是说,无论如何我都会将其更改为变量,以减少重复。就像它所依赖的许多事情一样。如果调用similations.instance(i)的代价很高,那么将其存储在变量中并重用它将提高性能 然而,这确实不是一个可以从总体上回答的问题。您需要分析/测试性能上的差异,看看是否会产生差异。我想说,在大多数情况下,你不应该担心它,除非方法调用正在做一些缓慢的事情,比如访问数据库或网络
也就是说,我无论如何都会将其更改为变量,以减少重复。如果以下两个条件都成立,则这样做是安全的:
如果以下两项均为真,则可以安全地执行此操作:
通过将该实例分配给变量,可以将该实例的物理地址作为指针存储在内存中 通过每次访问从相似性对象传递的实例,您每次都通过
相似性
对象的内存地址到达它,该内存地址以某种方式存储在内存结构中您想要到达的实例的地址
因此,是的,它确实提高了性能,尽管我不能100%确定JVM本身是否进行了一些优化。但是我想说不。通过将该实例分配给变量,可以将该实例的物理地址作为指针存储在内存中 通过每次访问从相似性对象传递的实例,您每次都通过
相似性
对象的内存地址到达它,该内存地址以某种方式存储在内存结构中您想要到达的实例的地址
因此,是的,它确实提高了性能,尽管我不能100%确定JVM本身是否进行了一些优化。但是我会说不。过早优化是万恶之源”(c)Donald Knuth
这段代码真的很难理解吗?您是否进行了分析或一些测试来确定这一点
在一般情况下,我只看到存储方法调用值的一个原因——更好的可读性。原因值必须是永久性的,并且独立于调用时间。
我的意思是:
int a = someObj.getSomething();
method1( a );
method2( a );
method3( a );
这个代码不好:
int length = someObj.getLength();
for( int i = 0; i < length; i++ )
{
...
}
int length=someObj.getLength();
for(int i=0;i
有时行为可能与你的期望相反。过早优化是万恶之源(c)Donald Knuth
这段代码真的很难理解吗?您是否进行了分析或一些测试来确定这一点
在一般情况下,我只看到存储方法调用值的一个原因——更好的可读性。原因价值