Index: trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java
===================================================================
--- trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 3653)
+++ trunk/src/org/openstreetmap/josm/gui/dialogs/SelectionListDialog.java	(revision 3654)
@@ -676,5 +676,10 @@
          */
         public void sort() {
-            Collections.sort(this.selection, new OsmPrimitiveComparator());
+            if (this.selection.size()>Main.pref.getInteger("selection.no_sort_above",100000)) return;
+            if (this.selection.size()>Main.pref.getInteger("selection.fast_sort_above",10000)) {
+                Collections.sort(this.selection, new OsmPrimitiveQuickComparator());
+            } else {
+                Collections.sort(this.selection, new OsmPrimitiveComparator());
+            }
         }
 
@@ -911,4 +916,5 @@
     }
 
+    /** Comparator, comparing by type and objects display names */
     static private class OsmPrimitiveComparator implements Comparator<OsmPrimitive> {
         final private HashMap<OsmPrimitive, String> cache= new HashMap<OsmPrimitive, String>();
@@ -940,6 +946,4 @@
         private int compareType(OsmPrimitive a, OsmPrimitive b) {
             // show ways before relations, then nodes
-            //
-            if (a.getType().equals(b.getType())) return 0;
             if (a.getType().equals(OsmPrimitiveType.WAY)) return -1;
             if (a.getType().equals(OsmPrimitiveType.NODE)) return 1;
@@ -949,4 +953,5 @@
             return -1;
         }
+
         public int compare(OsmPrimitive a, OsmPrimitive b) {
             if (a.getType().equals(b.getType()))
@@ -955,3 +960,32 @@
         }
     }
+
+    /** Quicker comparator, comparing just by type and ID's */
+    static private class OsmPrimitiveQuickComparator implements Comparator<OsmPrimitive> {
+
+        private int compareId(OsmPrimitive a, OsmPrimitive b) {
+            long id_a=a.getUniqueId();
+            long id_b=b.getUniqueId();
+            if (id_a<id_b) return -1;
+            if (id_a>id_b) return 1;
+            return 0;
+        }
+
+        private int compareType(OsmPrimitive a, OsmPrimitive b) {
+            // show ways before relations, then nodes
+            if (a.getType().equals(OsmPrimitiveType.WAY)) return -1;
+            if (a.getType().equals(OsmPrimitiveType.NODE)) return 1;
+            // a is a relation
+            if (b.getType().equals(OsmPrimitiveType.WAY)) return 1;
+            // b is a node
+            return -1;
+        }
+
+        public int compare(OsmPrimitive a, OsmPrimitive b) {
+            if (a.getType().equals(b.getType()))
+                return compareId(a, b);
+            return compareType(a, b);
+        }
+    }
+
 }
