Changeset 18502 in josm for trunk/src/org/openstreetmap


Ignore:
Timestamp:
2022-06-27T18:29:34+02:00 (2 years ago)
Author:
taylor.smock
Message:

Fix #22139: Significantly reduce allocations in NodeElement

This significantly reduces the cost for painting nodes.
In testing (Mesa County, Colorado, downloaded via overpass),
this reduces the cost for painting nodes (no paintstyle) by
66% (memory allocations) and ~17% (CPU allocations).

This comes out to about 7% of CPU cycles during map paint and
~20% of memory allocations during map paint.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/mappaint/styleelement/NodeElement.java

    r17744 r18502  
    88import java.util.Objects;
    99import java.util.Optional;
    10 import java.util.stream.IntStream;
    1110
    1211import org.openstreetmap.josm.data.osm.INode;
     
    351350    }
    352351
    353     private static int max(int... elements) {
    354         return IntStream.of(elements).max().orElseThrow(IllegalStateException::new);
     352    private static int max(int a, int b, int c, int d) {
     353        // Profile before switching to a stream/int[] array
     354        // This was 66% give or take for painting nodes in terms of memory allocations
     355        // and was ~17% of the CPU allocations. By not using a vararg method call, we avoid
     356        // the creation of an array. By avoiding both streams and arrays, the cost for this method is negligible.
     357        // This means that this saves about 7% of the CPU cycles during map paint, and about 20%
     358        // of the memory allocations during map paint.
     359        return Math.max(a, Math.max(b, Math.max(c, d)));
    355360    }
    356361
Note: See TracChangeset for help on using the changeset viewer.