Java 是否使用list.size()或变量进行多次使用?(局部优化)

Java 是否使用list.size()或变量进行多次使用?(局部优化),java,list,optimization,size,Java,List,Optimization,Size,我有一个简单的函数叫做很多 在这个函数中,我有许多对列表大小的调用(包含大约10个元素): 对我来说,使用临时变量只获取一次大小是否更快,或者每次调用size()方法是否更快 更新:它是一个数组列表 注意:我知道我在做什么,我不是在找一个关于优化的讲座,以及它应该或不应该如何做。我只是在寻找答案。这完全取决于实现。您没有指定列表的类型——我假定它是一个列表或某个具体实现 在一些实现中,比如ArrayList它非常便宜——基本上是一种字段访问。不可否认,它只是以恒定时间的形式记录下来的: 大小、空

我有一个简单的函数叫做很多

在这个函数中,我有许多对列表大小的调用(包含大约10个元素):

对我来说,使用临时变量只获取一次大小是否更快,或者每次调用
size()
方法是否更快

更新:它是一个
数组列表


注意:我知道我在做什么,我不是在找一个关于优化的讲座,以及它应该或不应该如何做。我只是在寻找答案。

这完全取决于实现。您没有指定
列表的类型
——我假定它是一个
列表
或某个具体实现

在一些实现中,比如
ArrayList
它非常便宜——基本上是一种字段访问。不可否认,它只是以恒定时间的形式记录下来的:

大小
获取
设置
迭代器
列表迭代器
操作以恒定时间运行

在其他国家,这可能是昂贵的。接口不提供任何保证。我希望它在大多数实现中是便宜的(固定时间),但您永远无法确定……

请查看(从
ArrayList
LinkedList
)中):


调用
list.size()
与调用一个方法并将一个值放入堆栈一样有效:(几乎)可以忽略不计。当然,使用局部(
final
)变量会快一点。如果这是应用程序上下文中的一项重要改进,您可能需要进行测量。

这取决于
列表的实现
查看
ArrayList
的源代码

/**
  225        * Returns the number of elements in this list.
  226        *
  227        * @return the number of elements in this list
  228        */
  229       public int size() {
  230           return size;
  231       }
  232   

因此,无论方法调用的速度有多快,
size()。引入一个变量来携带方法的结果是一个很好的做法,如果该方法在一个代码块内被多次调用,假设该方法没有改变任何东西。

你能对该函数进行基准测试吗?@Asaf:这对我来说真的不实用,我已经为其他事情做过了,但是这里有太多的业务逻辑,考虑到许多人可能已经知道这个答案(看看答案,似乎是这样的),即使在一个带有tirivla循环的微基准测试中,你也很难分辨出区别,如果存在“太多的业务逻辑”,你可以肯定
size()
如果有任何区别的话,也不会产生太大影响。您确定该方法在运行时已编译吗?这可能会产生10倍的差异。+1:供参考。您是否也可以包括
LinkedList.size()
?我相信是O(N)左右。嗨,我已经更新了我的问题,它确实是一个ArrayList,我应该直接说,谢谢你提供这个代码@Rekin在@Matthieu中使用了相同的实现:在这种情况下,它很便宜。我不同意。在增强的for循环无法工作的情况下,我非常乐意为(inti=0;Ifor。我认为这比提取局部变量更为可读,而在更多情况下,可读性比性能更重要,IMO。我也认为可读性更重要,而不是优化几乎可以忽略的开销。毕竟,Java-5Foreach循环也有编译器生成的代码带来的轻微开销,但比手动管理迭代器可读性好得多。。。
/**
 * Returns the number of elements in this list.
 *
 * @return the number of elements in this list
 */
public int size() {
return size;
}
/**
  225        * Returns the number of elements in this list.
  226        *
  227        * @return the number of elements in this list
  228        */
  229       public int size() {
  230           return size;
  231       }
  232