From ed703db2774434034fd574f326d8dc375c8c3498 Mon Sep 17 00:00:00 2001 From: Andreas Huber Date: Sun, 28 Apr 2019 12:48:17 +0200 Subject: [PATCH] speed improvement for intersectionSorted() Using the unsafe versions of add/get to improve performance. Here are some numbers for 2^15 intersections of two random sorted lists with 16k elements. The numbers were gathered with perf stat -d -d -d --delay 2000 java -ea -cp bin/test:bin/main org.lucares.collections.Test 16000 15 (the test class is not committed) Duration: 9059ms -> 7293ms (80.5%) Cycles: 26.084.812.051 -> 21.616.608.207 (82.9%) Instructions: 68.045.848.666 -> 52.306.000.150 (76.9%) Instructions per Cycle: 2,61 -> 2.42 Branches: 15.007.093.940 -> 9.839.481.658 (65.6%) Branch Misses: 2.285.461 -> 1.551.906 Cycles per element: 24.87 -> 20.61 (82.9%) --- .../java/org/lucares/collections/IntList.java | 16 ++++++++-------- .../java/org/lucares/collections/LongList.java | 16 ++++++++-------- 2 files changed, 16 insertions(+), 16 deletions(-) diff --git a/primitiveCollections/src/main/java/org/lucares/collections/IntList.java b/primitiveCollections/src/main/java/org/lucares/collections/IntList.java index 767c2cb..8af241a 100644 --- a/primitiveCollections/src/main/java/org/lucares/collections/IntList.java +++ b/primitiveCollections/src/main/java/org/lucares/collections/IntList.java @@ -1025,21 +1025,21 @@ public final class IntList implements Serializable, Cloneable { while (l < aSize && r < bSize) { - final int lv = a.get(l); - final int rv = b.get(r); + final int lv = a.getUnsafe(l); + final int rv = b.getUnsafe(r); if (lv < rv) { l++; } else if (lv > rv) { r++; } else { - result.add(lv); + result.addUnsafe(lv); do { l++; - } while (l < aSize && lv == a.get(l)); + } while (l < aSize && lv == a.getUnsafe(l)); do { r++; - } while (r < bSize && rv == b.get(r)); + } while (r < bSize && rv == b.getUnsafe(r)); } } return result; @@ -1062,13 +1062,13 @@ public final class IntList implements Serializable, Cloneable { result = new IntList(Math.min(aSize, bSize)); for (int l = 0; l < aSize; l++) { - final int lv = a.get(l); + final int lv = a.getUnsafe(l); if (b.indexOf(lv) >= 0) { - result.add(lv); + result.addUnsafe(lv); } - while (l + 1 < aSize && lv == a.get(l + 1)) { + while (l + 1 < aSize && lv == a.getUnsafe(l + 1)) { l++; } } diff --git a/primitiveCollections/src/main/java/org/lucares/collections/LongList.java b/primitiveCollections/src/main/java/org/lucares/collections/LongList.java index a7ad2fd..87b2125 100644 --- a/primitiveCollections/src/main/java/org/lucares/collections/LongList.java +++ b/primitiveCollections/src/main/java/org/lucares/collections/LongList.java @@ -1024,21 +1024,21 @@ public final class LongList implements Serializable, Cloneable { while (l < aSize && r < bSize) { - final long lv = a.get(l); - final long rv = b.get(r); + final long lv = a.getUnsafe(l); + final long rv = b.getUnsafe(r); if (lv < rv) { l++; } else if (lv > rv) { r++; } else { - result.add(lv); + result.addUnsafe(lv); do { l++; - } while (l < aSize && lv == a.get(l)); + } while (l < aSize && lv == a.getUnsafe(l)); do { r++; - } while (r < bSize && rv == b.get(r)); + } while (r < bSize && rv == b.getUnsafe(r)); } } return result; @@ -1061,13 +1061,13 @@ public final class LongList implements Serializable, Cloneable { result = new LongList(Math.min(aSize, bSize)); for (int l = 0; l < aSize; l++) { - final long lv = a.get(l); + final long lv = a.getUnsafe(l); if (b.indexOf(lv) >= 0) { - result.add(lv); + result.addUnsafe(lv); } - while (l + 1 < aSize && lv == a.get(l + 1)) { + while (l + 1 < aSize && lv == a.getUnsafe(l + 1)) { l++; } }