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:
@@ -1025,21 +1025,21 @@ public final class IntList implements Serializable, Cloneable {
|
|||||||
|
|
||||||
while (l < aSize && r < bSize) {
|
while (l < aSize && r < bSize) {
|
||||||
|
|
||||||
final int lv = a.get(l);
|
final int lv = a.getUnsafe(l);
|
||||||
final int rv = b.get(r);
|
final int rv = b.getUnsafe(r);
|
||||||
|
|
||||||
if (lv < rv) {
|
if (lv < rv) {
|
||||||
l++;
|
l++;
|
||||||
} else if (lv > rv) {
|
} else if (lv > rv) {
|
||||||
r++;
|
r++;
|
||||||
} else {
|
} else {
|
||||||
result.add(lv);
|
result.addUnsafe(lv);
|
||||||
do {
|
do {
|
||||||
l++;
|
l++;
|
||||||
} while (l < aSize && lv == a.get(l));
|
} while (l < aSize && lv == a.getUnsafe(l));
|
||||||
do {
|
do {
|
||||||
r++;
|
r++;
|
||||||
} while (r < bSize && rv == b.get(r));
|
} while (r < bSize && rv == b.getUnsafe(r));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@@ -1062,13 +1062,13 @@ public final class IntList implements Serializable, Cloneable {
|
|||||||
result = new IntList(Math.min(aSize, bSize));
|
result = new IntList(Math.min(aSize, bSize));
|
||||||
|
|
||||||
for (int l = 0; l < aSize; l++) {
|
for (int l = 0; l < aSize; l++) {
|
||||||
final int lv = a.get(l);
|
final int lv = a.getUnsafe(l);
|
||||||
|
|
||||||
if (b.indexOf(lv) >= 0) {
|
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++;
|
l++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1024,21 +1024,21 @@ public final class LongList implements Serializable, Cloneable {
|
|||||||
|
|
||||||
while (l < aSize && r < bSize) {
|
while (l < aSize && r < bSize) {
|
||||||
|
|
||||||
final long lv = a.get(l);
|
final long lv = a.getUnsafe(l);
|
||||||
final long rv = b.get(r);
|
final long rv = b.getUnsafe(r);
|
||||||
|
|
||||||
if (lv < rv) {
|
if (lv < rv) {
|
||||||
l++;
|
l++;
|
||||||
} else if (lv > rv) {
|
} else if (lv > rv) {
|
||||||
r++;
|
r++;
|
||||||
} else {
|
} else {
|
||||||
result.add(lv);
|
result.addUnsafe(lv);
|
||||||
do {
|
do {
|
||||||
l++;
|
l++;
|
||||||
} while (l < aSize && lv == a.get(l));
|
} while (l < aSize && lv == a.getUnsafe(l));
|
||||||
do {
|
do {
|
||||||
r++;
|
r++;
|
||||||
} while (r < bSize && rv == b.get(r));
|
} while (r < bSize && rv == b.getUnsafe(r));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@@ -1061,13 +1061,13 @@ public final class LongList implements Serializable, Cloneable {
|
|||||||
result = new LongList(Math.min(aSize, bSize));
|
result = new LongList(Math.min(aSize, bSize));
|
||||||
|
|
||||||
for (int l = 0; l < aSize; l++) {
|
for (int l = 0; l < aSize; l++) {
|
||||||
final long lv = a.get(l);
|
final long lv = a.getUnsafe(l);
|
||||||
|
|
||||||
if (b.indexOf(lv) >= 0) {
|
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++;
|
l++;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user