/
gaussian_speed.js
98 lines (83 loc) · 2.46 KB
/
gaussian_speed.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
var assert = require('assert'),
gsl = require('gsl');
var js_gaussian = function(seed, mean, std) {
var v1, v2, s,
secondSeed = seed +1,
mean = mean || 0,
std = std || 1;
do {
v1 = 2 * (new Marsaglia(seed)).nextDouble() - 1; // between -1.0 and 1.0
v2 = 2 * (new Marsaglia(secondSeed)).nextDouble() - 1; // between -1.0 and 1.0
s = v1 * v1 + v2 * v2;
if (s >= 1) secondSeed++;
} while (s >= 1 || s === 0);
var multiplier = Math.sqrt(-2 * Math.log(s) / s);
return (v1 * multiplier) * std + mean;
};
function Marsaglia(i1, i2) {
// from http://www.math.uni-bielefeld.de/~sillke/ALGORITHMS/random/marsaglia-c
var z=i1 || 362436069, w= i2 || 521288629;
var nextInt = function() {
z=(36969*(z&65535)+(z>>>16)) & 0xFFFFFFFF;
w=(18000*(w&65535)+(w>>>16)) & 0xFFFFFFFF;
return (((z&0xFFFF)<<16) | (w&0xFFFF)) & 0xFFFFFFFF;
};
this.nextDouble = function() {
var i = nextInt() / 4294967296;
return i < 0 ? 1 + i : i;
};
this.nextInt = nextInt;
}
console.log('Peformance on gaussian random generation with seed.');
var time = (new Date).getTime();
for(var i=0;i<1000000;i++){
for(var j=0;j<2;j++){
js_gaussian(1978);
}
}
console.log('JS ',(new Date).getTime() - time);
var time = (new Date).getTime();
for(var i=0;i<1000000;i++){
for(var j=0;j<2;j++){
gsl.random.gaussian(1978,1);
}
}
console.log('C++ fn',(new Date).getTime() - time);
var time = (new Date).getTime();
var random = new gsl.Random(1978);
for(var i=0;i<1000000;i++){
for(var j=0;j<2;j++){
random.gaussian(1);
}
}
console.log('C++ it',(new Date).getTime() - time);
var time = (new Date).getTime();
for(var i=0;i<1000000;i++){
for(var j=0;j<2;j++){
gsl.random.gaussianZiggurat(1978,1);
}
}
console.log('C++ fn Ziggurat',(new Date).getTime() - time);
var time = (new Date).getTime();
var random = new gsl.Random(1978);
for(var i=0;i<1000000;i++){
for(var j=0;j<2;j++){
random.gaussianZiggurat(1);
}
}
console.log('C++ it Ziggurat',(new Date).getTime() - time);
var time = (new Date).getTime();
for(var i=0;i<1000000;i++){
for(var j=0;j<2;j++){
gsl.random.gaussianRatioMethod(1978,1);
}
}
console.log('C++ fn RatioMethod',(new Date).getTime() - time);
var time = (new Date).getTime();
var random = new gsl.Random(1978);
for(var i=0;i<1000000;i++){
for(var j=0;j<2;j++){
random.gaussianRatioMethod(1);
}
}
console.log('C++ it RatioMethod',(new Date).getTime() - time);