Thanks for the reply.
Looks like you’re right, when I do the below benchmark, while the ‘final int size’ method is a little faster, when I profile the test code ArrayList.size() never comes up as an expensive method.
Here’s the results of the below test for me:
test 1, with ArrayList.size() first
ArrayList.size(), averageNanosElapsed == 10718391
final int size, averageNanosElapsed == 9684406
test 2, with ArrayList.size() second
final int size, averageNanosElapsed == 9456993
ArrayList.size(), averageNanosElapsed == 10827086
public static void main(String[] args){
int numObjects = 5000000;
ArrayList list = new ArrayList(numObjects);
for (int i = 0; i < numObjects; i++){
list.add(new Object());
}
// warm the JIT
{
int numTests = 10;
long averageNanosElapsed = 0;
for (int j = 0; j < numTests; j++){
long startNanos = System.nanoTime();
long count = -Long.MAX_VALUE;
for (int i = 0; i < list.size(); i++){
count += i;
}
long endNanos = System.nanoTime();
long nanosElapsed = endNanos - startNanos;
// System.out.println("ArrayList.size(), nanosElapsed == "+nanosElapsed);
averageNanosElapsed += nanosElapsed;
}
averageNanosElapsed /= numTests;
// System.out.println("ArrayList.size(), averageNanosElapsed == "+averageNanosElapsed);
averageNanosElapsed = 0;
for (int j = 0; j < numTests; j++){
long startNanos = System.nanoTime();
long count = -Long.MAX_VALUE;
final int size = list.size();
for (int i = 0; i < size; i++){
count += i;
}
long endNanos = System.nanoTime();
long nanosElapsed = endNanos - startNanos;
// System.out.println("final int size, nanosElapsed == "+nanosElapsed);
averageNanosElapsed += nanosElapsed;
}
averageNanosElapsed /= numTests;
// System.out.println("final int size, averageNanosElapsed == "+averageNanosElapsed);
}
// run the tests
System.out.println("test 1, with ArrayList.size() first");
{
int numTests = 100;
long averageNanosElapsed = 0;
for (int j = 0; j < numTests; j++){
long startNanos = System.nanoTime();
long count = -Long.MAX_VALUE;
for (int i = 0; i < list.size(); i++){
count += i;
}
long endNanos = System.nanoTime();
long nanosElapsed = endNanos - startNanos;
// System.out.println("ArrayList.size(), nanosElapsed == "+nanosElapsed);
averageNanosElapsed += nanosElapsed;
}
averageNanosElapsed /= numTests;
System.out.println("ArrayList.size(), averageNanosElapsed == "+averageNanosElapsed);
averageNanosElapsed = 0;
for (int j = 0; j < numTests; j++){
long startNanos = System.nanoTime();
long count = -Long.MAX_VALUE;
final int size = list.size();
for (int i = 0; i < size; i++){
count += i;
}
long endNanos = System.nanoTime();
long nanosElapsed = endNanos - startNanos;
// System.out.println("final int size, nanosElapsed == "+nanosElapsed);
averageNanosElapsed += nanosElapsed;
}
averageNanosElapsed /= numTests;
System.out.println("final int size, averageNanosElapsed == "+averageNanosElapsed);
}
System.out.println("test 2, with ArrayList.size() second");
{
int numTests = 100;
long averageNanosElapsed = 0;
for (int j = 0; j < numTests; j++){
long startNanos = System.nanoTime();
long count = -Long.MAX_VALUE;
final int size = list.size();
for (int i = 0; i < size; i++){
count += i;
}
long endNanos = System.nanoTime();
long nanosElapsed = endNanos - startNanos;
// System.out.println("final int size, nanosElapsed == "+nanosElapsed);
averageNanosElapsed += nanosElapsed;
}
averageNanosElapsed /= numTests;
System.out.println("final int size, averageNanosElapsed == "+averageNanosElapsed);
averageNanosElapsed = 0;
for (int j = 0; j < numTests; j++){
long startNanos = System.nanoTime();
long count = -Long.MAX_VALUE;
for (int i = 0; i < list.size(); i++){
count += i;
}
long endNanos = System.nanoTime();
long nanosElapsed = endNanos - startNanos;
// System.out.println("ArrayList.size(), nanosElapsed == "+nanosElapsed);
averageNanosElapsed += nanosElapsed;
}
averageNanosElapsed /= numTests;
System.out.println("ArrayList.size(), averageNanosElapsed == "+averageNanosElapsed);
}
}