-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathbenchmark.js
146 lines (134 loc) · 4.64 KB
/
benchmark.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
/**
* Copyright (C) 2017-2021 Andras Radics
* Licensed under the Apache License, Version 2.0
*/
'use strict';
var timeit = require('qtimeit');
var fastpriorityqueue = require('fastpriorityqueue');
var qheap = require('./');
var heap = require('heap');
var jsprioqueue = require('js-priority-queue');
// rand() from `fastpriorityqueue`
function rand(i) {
i = i + 10000;
i = i ^ (i << 16);
i = (i >> 5) ^ i ;
return i & 0xFF;
}
function testLoop() {
var i, b = qheap();
for (i = 0; i < 128; i++) { b.insert(rand(i)) }
for (i = 128; i < 1280; i++) { b.insert(rand(i)) ; b.remove() }
}
function comparAfter(a, b) { return a > b }
function comparAfter2(a, b) { return (a > b) }
function comparSubtract(a, b) { return a - b }
function comparOrder(a, b) { return a < b ? -1 : 1 }
function comparBefore(a, b) { return a < b }
function comparBefore2(a, b) { return (a < b) }
timeit.bench.visualize = true;
var x;
//console.log("new heap");
timeit.bench.preRunMessage = "new heap";
timeit.bench.timeGoal = 0.25;
/**
timeit.bench({
heap: function(){
x = new heap() },
jspriorityqueue: function() {
x = new jsprioqueue(); },
fastpriorityqueue_compar: function(){
x = new fastpriorityqueue(comparAfter) },
qheap: function(){
x = qheap() },
});
**/
// just creating a qheap with different compar functions cuts performance 6x
// fastpriorityqueue same behavior
// x = qheap({ comparBefore: comparBefore });
timeit.bench.preRunMessage =
rand.toString() + "\n" +
testLoop.toString() + "\n" +
"\n" +
"new heap + 128 inserts + 1152 insert/removes";
timeit.bench.timeGoal = .2;
//timeit.bench.baselineAvg = 20000 * 1280;
//timeit.bench.forkTests = true;
//timeit.bench.verbose = 5;
for (var i=0; i<20; i++) {
timeit.bench({
// the test from `fastpriorityqueue`
jsprioqueue: function(){
var i, b = new jsprioqueue();
for (i = 0; i < 128; i++) { b.queue(rand(i)) }
for (i = 128; i < 1280; i++) { b.queue(rand(i)) ; b.dequeue() }
},
heap: function(){
var i, b = new heap();
for (i = 0; i < 128; i++) { b.push(rand(i)) }
for (i = 128; i < 1280; i++) { b.push(rand(i)) ; b.pop() }
},
/**
// much slower with custom comparator
heap_compar: function(){
var i, b = new heap(function(a,b){ return a - b });
for (i = 0; i < 128; i++) { b.push(rand(i)) }
for (i = 128; i < 1280; i++) { b.push(rand(i)) ; b.pop() }
},
**/
qheap: function(){
var i, b = qheap();
for (i = 0; i < 128; i++) { b.insert(rand(i)) }
for (i = 128; i < 1280; i++) { b.insert(rand(i)) ; b.remove() }
},
fastpriorityqueue: function(){
var i, b = new fastpriorityqueue(comparAfter);
//var i, b = new fastpriorityqueue();
for (i = 0; i < 128; i++) { b.add(rand(i)) }
for (i = 128; i < 1280; i++) { b.add(rand(i)) ; b.poll() }
},
qheap2: function(){
var i, b = qheap();
for (i = 0; i < 128; i++) { b.insert(rand(i)) }
for (i = 128; i < 1280; i++) { b.insert(rand(i)) ; b.remove() }
},
// note: toggling between two comparator functions de-optimizes the code to run 5x slower
// constructing new fastpriorityqueue with different comparators also kills performance, 6x slower
// Maybe could build custom insert / remove methods on the fly to work with the comparator,
// to be optimized separately and not affect the base class methods?
/**
fastpriorityqueue_compar2: function(){
var i, b = new fastpriorityqueue(comparAfter2);
for (i = 0; i < 128; i++) { b.add(rand(i)) }
for (i = 128; i < 1280; i++) { b.add(rand(i)) ; b.poll() }
},
qheap_compar: function(){
var i, b = qheap({ comparBefore: comparBefore });
for (i = 0; i < 128; i++) { b.insert(rand(i)) }
for (i = 128; i < 1280; i++) { b.insert(rand(i)) ; b.remove() }
},
qheap_compar2: function(){
var i, b = qheap({ comparBefore: comparBefore2 });
for (i = 0; i < 128; i++) { b.insert(rand(i)) }
for (i = 128; i < 1280; i++) { b.insert(rand(i)) ; b.remove() }
},
/**/
'new qheap 10k': function() {
var h;
for (var i=0; i<10000; i++) h = qheap();
},
'qheap insert 10k': function() {
var h = qheap();
for (var i=0; i<10000; i++) h.insert(rand(i));
},
'qheap insert 10k / remove 10k': function() {
var h = qheap();
for (var i=0; i<10000; i++) h.insert(rand(i));
for (var i=0; i<10000; i++) h.shift();
},
});
timeit.bench.preRunMessage = "----";
timeit.bench.showPlatformInfo = false;
timeit.bench.showRunDetails = false;
//timeit.bench.verbose = 1;
}