-
Notifications
You must be signed in to change notification settings - Fork 0
/
gctime.js
79 lines (58 loc) · 1.67 KB
/
gctime.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
'use strict'
const binding = require('bindings')('gctime')
const fields = new Uint32Array(10)
const SECS = 0
const NANO = 1
const UPPER_32 = 0x100000000
exports.start = binding.start
exports.stop = function () {
binding.stop()
return exports.get()
}
exports.get = function () {
binding.transfer(fields)
const stats = new HighResolutionStats()
stats.min[SECS] = fields[0] * UPPER_32 + fields[1]
stats.min[NANO] = fields[2]
stats.max[SECS] = fields[3] * UPPER_32 + fields[4]
stats.max[NANO] = fields[5]
stats.sum[SECS] = fields[6] * UPPER_32 + fields[7]
stats.sum[NANO] = fields[8]
stats.size = fields[9]
return stats
}
exports.accumulate = function (stats) {
binding.transfer(fields)
const newSize = fields[9]
if (newSize > 0) {
const oldSize = stats.size
mergeMin(stats.min, oldSize, fields[0] * UPPER_32 + fields[1], fields[2])
mergeMax(stats.max, oldSize, fields[3] * UPPER_32 + fields[4], fields[5])
mergeSum(stats.sum, fields[6] * UPPER_32 + fields[7], fields[8])
stats.size = oldSize + newSize
}
}
function HighResolutionStats () {
this.min = [0, 0]
this.max = [0, 0]
this.sum = [0, 0]
this.size = 0
}
function mergeMin (min, oldSize, sec, nano) {
if (oldSize === 0 || sec < min[SECS] || (sec === min[SECS] && nano < min[NANO])) {
min[SECS] = sec
min[NANO] = nano
}
}
function mergeMax (max, oldSize, sec, nano) {
if (oldSize === 0 || sec > max[SECS] || (sec === max[SECS] && nano > max[NANO])) {
max[SECS] = sec
max[NANO] = nano
}
}
function mergeSum (sum, sec, nano) {
const ns = sum[NANO] + nano
const overflow = ns / 1e9 | 0
sum[SECS] = sum[SECS] + sec + overflow
sum[NANO] = ns % 1e9
}