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%)
This commit is contained in:
2019-04-28 12:48:17 +02:00
parent cedccefe92
commit ed703db277
2 changed files with 16 additions and 16 deletions

View File

@@ -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++;
}
}

View File

@@ -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++;
}
}