﻿id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc
22106	[PATCH] Avoid allocations for point objects (Nodes) in QuadBuckets	taylor.smock	team	"{{{#!diff
diff --git a/src/org/openstreetmap/josm/data/osm/QuadBuckets.java b/src/org/openstreetmap/josm/data/osm/QuadBuckets.java
index 1f126bbb0b..916a1d048c 100644
--- a/src/org/openstreetmap/josm/data/osm/QuadBuckets.java
+++ b/src/org/openstreetmap/josm/data/osm/QuadBuckets.java
@@ -11,6 +11,7 @@ import java.util.NoSuchElementException;
 import java.util.stream.IntStream;
 
 import org.openstreetmap.josm.data.IQuadBucketType;
+import org.openstreetmap.josm.data.coor.ILatLon;
 import org.openstreetmap.josm.data.coor.LatLon;
 import org.openstreetmap.josm.data.coor.QuadTiling;
 import org.openstreetmap.josm.tools.Logging;
@@ -173,6 +174,10 @@ public class QuadBuckets<T extends IQuadBucketType> implements Collection<T> {
         }
 
         boolean matches(final T o, final BBox searchBbox) {
+            // Avoid allocations for point (AKA Node) objects
+            if (o instanceof ILatLon) {
+                return searchBbox.contains((ILatLon) o);
+            }
             return o.getBBox().intersects(searchBbox);
         }
 
}}}

This reduces the allocations for Nodes in QuadBuckets.QBLevel#matches by 80% (we're no longer creating a new `BBox` every time). The remaining cost is from `ArrayList#grow`.

Unfortunately, this isn't a major perf win (it is dwarfed by other things) but it does shave a percentage point or two off of the render path allocations."	defect	closed	normal	22.06	Core		fixed	performance	
