Java:关于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) ) 我有更好的表现吗?因为我没有在每次迭代时调用该方法?这是我应该经常

我有一个for循环,其中包含以下行:

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)的代价很高,那么将其存储在变量中并重用它将提高性能

然而,这确实不是一个可以从总体上回答的问题。您需要分析/测试性能上的差异,看看是否会产生差异。我想说,在大多数情况下,你不应该担心它,除非方法调用正在做一些缓慢的事情,比如访问数据库或网络


也就是说,我无论如何都会将其更改为变量,以减少重复。

如果以下两个条件都成立,则这样做是安全的:

  • instance()是一个纯函数
  • method1、method2、method3使用其参数只读

  • 如果以下两项均为真,则可以安全地执行此操作:

  • instance()是一个纯函数
  • method1、method2、method3使用其参数只读

  • 通过将该实例分配给变量,可以将该实例的物理地址作为指针存储在内存中

    通过每次访问从相似性对象传递的实例,您每次都通过
    相似性
    对象的内存地址到达它,该内存地址以某种方式存储在内存结构中您想要到达的实例的地址


    因此,是的,它确实提高了性能,尽管我不能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

    这段代码真的很难理解吗?您是否进行了分析或一些测试来确定这一点

    在一般情况下,我只看到存储方法调用值的一个原因——更好的可读性。原因价值