Ticket #19898: 19898.patch

File 19898.patch, 3.4 KB (added by GerdP, 4 years ago)

avoid to materialise unneeded copies of SubclassFilteredCollection

  • src/org/openstreetmap/josm/data/osm/DataSetMerger.java

     
    424424            progressMonitor.beginTask(tr("Merging data..."), sourceDataSet.allPrimitives().size());
    425425        }
    426426        targetDataSet.update(() -> {
    427             List<? extends OsmPrimitive> candidates = new ArrayList<>(targetDataSet.getNodes());
     427            List<? extends OsmPrimitive> candidates = null;
    428428            for (Node node: sourceDataSet.getNodes()) {
     429                // lazy initialisation to improve performance, see #19898
     430                if (node.isNew() && candidates == null) {
     431                    candidates = new ArrayList<>(targetDataSet.getNodes());
     432                }
    429433                mergePrimitive(node, candidates);
    430434                if (progressMonitor != null) {
    431435                    progressMonitor.worked(1);
    432436                }
    433437            }
    434             candidates.clear();
    435             candidates = new ArrayList<>(targetDataSet.getWays());
     438            candidates = null;
    436439            for (Way way: sourceDataSet.getWays()) {
     440                // lazy initialisation to improve performance
     441                if (way.isNew() && candidates == null) {
     442                    candidates = new ArrayList<>(targetDataSet.getWays());
     443                }
    437444                mergePrimitive(way, candidates);
    438445                if (progressMonitor != null) {
    439446                    progressMonitor.worked(1);
    440447                }
    441448            }
    442             candidates.clear();
    443             candidates = new ArrayList<>(targetDataSet.getRelations());
     449            candidates = null;
    444450            for (Relation relation: sourceDataSet.getRelations()) {
     451                // lazy initialisation to improve performance
     452                if (relation.isNew() && candidates == null) {
     453                    candidates = new ArrayList<>(targetDataSet.getRelations());
     454                }
    445455                mergePrimitive(relation, candidates);
    446456                if (progressMonitor != null) {
    447457                    progressMonitor.worked(1);
    448458                }
    449459            }
    450             candidates.clear();
     460            candidates = null;
    451461            fixReferences();
    452462
    453463            Area a = targetDataSet.getDataSourceArea();
  • src/org/openstreetmap/josm/io/OsmServerBackreferenceReader.java

     
    214214    protected DataSet readIncompletePrimitives(DataSet ds, ProgressMonitor progressMonitor) throws OsmTransferException {
    215215        progressMonitor.beginTask(null, 2);
    216216        try {
    217             Collection<Way> waysToCheck = new ArrayList<>(ds.getWays());
    218217            if (isReadFull() || (primitiveType == OsmPrimitiveType.NODE && !isAllowIncompleteParentWays())) {
     218                Collection<Way> waysToCheck = new ArrayList<>(ds.getWays());
    219219                for (Way way: waysToCheck) {
    220220                    if (!way.isNew() && way.hasIncompleteNodes()) {
    221221                        OsmServerObjectReader reader = new OsmServerObjectReader(way.getId(), OsmPrimitiveType.from(way), true /* read full */);