Changeset 17801 in josm for trunk/src


Ignore:
Timestamp:
2021-04-19T21:45:13+02:00 (4 years ago)
Author:
simon04
Message:

see #20745 - Avoid heap allocations in MapCSS MatchingReferrerFinder due to lambda expression

4.66% of MapCSSTagCheckerPerformanceTest#testCity amount to java.lang.invoke.Invokers$Holder.linkToTargetMethod

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/org/openstreetmap/josm/gui/mappaint/mapcss/Selector.java

    r17800 r17801  
    2626import org.openstreetmap.josm.data.osm.IRelationMember;
    2727import org.openstreetmap.josm.data.osm.IWay;
     28import org.openstreetmap.josm.data.osm.OsmPrimitive;
    2829import org.openstreetmap.josm.data.osm.OsmPrimitiveType;
    2930import org.openstreetmap.josm.data.osm.OsmUtils;
     
    208209            }
    209210
    210             private <T extends IPrimitive> void doVisit(T parent, IntSupplier counter, IntFunction<IPrimitive> getter) {
     211            private void doVisit(IPrimitive parent) {
    211212                // If e.parent is already set to the first matching referrer.
    212213                // We skip any following referrer injected into the visitor.
     
    215216                if (!left.matches(e.withPrimitive(parent)))
    216217                    return;
    217                 int count = counter.getAsInt();
     218                int count = parent instanceof IWay<?>
     219                        ? ((IWay<?>) parent).getNodesCount()
     220                        : ((IRelation<?>) parent).getMembersCount();
    218221                if (link.getConditions().isEmpty()) {
    219222                    // index is not needed, we can avoid the sequential search below
     
    225228                int step = firstAndLastOnly() ? count - 1 : 1;
    226229                for (int i = 0; i < count; i += step) {
    227                     if (getter.apply(i).equals(e.osm)
     230                    IPrimitive o = parent instanceof IWay<?>
     231                            ? ((IWay<?>) parent).getNode(i)
     232                            : ((IRelation<?>) parent).getMember(i).getMember();
     233                    if (Objects.equals(o, e.osm)
    228234                            && link.matches(e.withParentAndIndexAndLinkContext(parent, i, count))) {
    229235                        e.parent = parent;
     
    241247            @Override
    242248            public void visit(IWay<?> w) {
    243                 doVisit(w, w::getNodesCount, w::getNode);
     249                doVisit(w);
    244250            }
    245251
    246252            @Override
    247253            public void visit(IRelation<?> r) {
    248                 doVisit(r, r::getMembersCount, i -> r.getMember(i).getMember());
     254                doVisit(r);
    249255            }
    250256        }
Note: See TracChangeset for help on using the changeset viewer.