Skip to content

Commit 2adb6d8

Browse files
committed
improve perf by ~20% (borrowing ideas from FastPriorityQueue & qheap)
1 parent 2de5004 commit 2adb6d8

File tree

1 file changed

+34
-31
lines changed

1 file changed

+34
-31
lines changed

index.js

Lines changed: 34 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,9 @@ function TinyQueue(data, compare) {
99
this.length = this.data.length;
1010
this.compare = compare || defaultCompare;
1111

12-
if (data) for (var i = Math.floor(this.length / 2); i >= 0; i--) this._down(i);
12+
if (data) {
13+
for (var i = (this.length >> 1); i >= 0; i--) this._down(i);
14+
}
1315
}
1416

1517
function defaultCompare(a, b) {
@@ -38,42 +40,43 @@ TinyQueue.prototype = {
3840
},
3941

4042
_up: function (pos) {
41-
var data = this.data,
42-
compare = this.compare;
43+
var data = this.data;
44+
var compare = this.compare;
45+
var item = data[pos];
4346

4447
while (pos > 0) {
45-
var parent = Math.floor((pos - 1) / 2);
46-
if (compare(data[pos], data[parent]) < 0) {
47-
swap(data, parent, pos);
48-
pos = parent;
49-
50-
} else break;
48+
var parent = (pos - 1) >> 1;
49+
var current = data[parent];
50+
if (compare(item, current) >= 0) break;
51+
data[pos] = current;
52+
pos = parent;
5153
}
54+
55+
data[pos] = item;
5256
},
5357

5458
_down: function (pos) {
55-
var data = this.data,
56-
compare = this.compare,
57-
len = this.length;
58-
59-
while (true) {
60-
var left = 2 * pos + 1,
61-
right = left + 1,
62-
min = pos;
63-
64-
if (left < len && compare(data[left], data[min]) < 0) min = left;
65-
if (right < len && compare(data[right], data[min]) < 0) min = right;
66-
67-
if (min === pos) return;
68-
69-
swap(data, min, pos);
70-
pos = min;
59+
var data = this.data;
60+
var compare = this.compare;
61+
var len = this.length;
62+
var halfLen = len >> 1;
63+
var item = data[pos];
64+
65+
while (pos < halfLen) {
66+
var left = (pos << 1) + 1;
67+
var right = left + 1;
68+
var best = data[left];
69+
70+
if (right < len && compare(data[right], best) < 0) {
71+
left = right;
72+
best = data[right];
73+
}
74+
if (compare(best, item) >= 0) break;
75+
76+
data[pos] = best;
77+
pos = left;
7178
}
79+
80+
data[pos] = item;
7281
}
7382
};
74-
75-
function swap(data, i, j) {
76-
var tmp = data[i];
77-
data[i] = data[j];
78-
data[j] = tmp;
79-
}

0 commit comments

Comments
 (0)