Java 在数组上调用.length与保存size变量在性能上是否存在差异?
我正在创建一个模拟程序,我希望代码得到非常优化。现在我有一个数组,可以循环很多次,在我使用的各种for循环中循环Java 在数组上调用.length与保存size变量在性能上是否存在差异?,java,arrays,performance,Java,Arrays,Performance,我正在创建一个模拟程序,我希望代码得到非常优化。现在我有一个数组,可以循环很多次,在我使用的各种for循环中循环 for(int i = 0; i<array.length; i++){ //do stuff with the array } for(int i=0;i访问数组上的length属性是最快的 您将看到有人建议您在进入循环之前保存一个数据结构大小,因为它意味着每次迭代都有一个方法 但这是一种很少有意义的微观优化。在有数据表明这是性能问题的原因之前,不要太担心
for(int i = 0; i<array.length; i++){
//do stuff with the array
}
for(int i=0;i访问数组上的length属性是最快的
您将看到有人建议您在进入循环之前保存一个数据结构大小,因为它意味着每次迭代都有一个方法
但这是一种很少有意义的微观优化。在有数据表明这是性能问题的原因之前,不要太担心这类事情
你应该花更多的时间考虑你在循环中嵌入的算法,可能的并行性,等等。这对你寻求优化的解决方案更有意义。这真的没关系,当你用[#]创建一个数组时,它存储那个数,然后返回那个数
如果您使用的是[]{object1,object2,object3},那么它将计算大小,在任何一种情况下,该值只计算一次并存储
length是一个变量,而不是一个方法,当您访问它时,它有一个值,它只是检索该值,而不是每次使用length属性时都要计算数组的长度。array.length并不慢,事实上,必须设置一个额外的变量实际上比仅使用length需要更多的时间
array.length速度更快,虽然只快了几分之一毫秒,但在循环中,如果循环处理1000000个项目(可能是0.1秒),则可以节省大量时间。这不太可能有什么不同
更广泛的问题是,您希望模拟运行得尽可能快。
这显示了如何使用正在运行的程序来告诉您要优化的内容,而不是像.length
这样的小事。
大多数最初编写的代码(小玩具程序除外)都有巨大的加速潜力,其方式可以避免被猜测
加速的最大机会通常是分散的,就像您选择的数据结构一样。
它们不局限于特定的例程,测量工具也没有指出它们。
该项目中演示的方法“随机暂停”确实可以识别它们。
您需要进行的更改可能不容易完成,但它们会带来加速。+在循环缓存时使用hotspot会缓存结构的大小,因此如果使用.length或.size(),实际上不会影响性能@爸爸,它不会缓存它,它证明了i
无法跨越长度,并且在展开循环时根本不会检查它,等等。