Details
-
Bug
-
Status: Closed
-
Major
-
Resolution: Fixed
-
None
-
None
-
Reviewed
Description
I noticed that in a profiler (sampler) run ScanQueryMatcher.setRow(...) showed up at all.
In turns out that the expensive part is iterating over the columns in ExcplicitColumnTracker.reset(). I did some microbenchmarks and found that
private ArrayList<X> l; ... for (int i=0; i<l.size(); i++) { X = l.get(i); ... }
Is twice as fast as:
private ArrayList<X> l; ... for (X : l) { ... }
The indexed version asymptotically approaches the iterator version, but even at 1m entries it is still faster.
In my tight loop scans this provides for a 5% performance improvement overall when the ExcplicitColumnTracker is used.
Edit:
private X[] l; ... for (int i=0; i<l.length; i++) { X = l[i]; ... }
Is even better. Apparently the JVM can even save the boundary check in each iteration.