Skip to content

Instantly share code, notes, and snippets.

@zoka
Created March 28, 2010 09:14
Show Gist options
  • Save zoka/346667 to your computer and use it in GitHub Desktop.
Save zoka/346667 to your computer and use it in GitHub Desktop.
diff --git a/src/node.cc b/src/node.cc
index 452c111..9395814 100644
--- a/src/node.cc
+++ b/src/node.cc
@@ -1062,6 +1062,47 @@ static Handle<Value> CheckBreak(const Arguments& args) {
return Undefined();
}
+ // monotonic time stamp recorded when Node app was started
+static double startup_time;
+
+#ifdef __APPLE__
+
+#include <mach/mach_time.h>
+
+static double monotonic_msec() {
+
+ static mach_timebase_info_data_t clock_gettime_inf;
+ uint64_t now, nano;
+
+ now = mach_absolute_time();
+
+ if (0 == clock_gettime_inf.denom)
+ mach_timebase_info(&clock_gettime_inf);
+
+ nano = now * clock_gettime_inf.numer / clock_gettime_inf.denom;
+ return (double) nano * 1e-6;
+}
+
+#else
+
+static double monotonic_msec() {
+
+ timespec ts;
+
+ clock_gettime(CLOCK_MONOTONIC, &ts);
+ return (double) ts.tv_sec * 1e3 + (double) ts.tv_nsec * 1e-6;
+}
+
+#endif
+
+static Handle<Value> Uptime(const Arguments& args) {
+ HandleScope scope;
+
+ Local <Number> ret = Number::New(monotonic_msec() - startup_time);
+ return scope.Close(ret);
+}
+
+
Persistent<Object> binding_cache;
static Handle<Value> Binding(const Arguments& args) {
@@ -1295,6 +1336,7 @@ static void Load(int argc, char *argv[]) {
NODE_SET_METHOD(process, "kill", Kill);
NODE_SET_METHOD(process, "memoryUsage", MemoryUsage);
NODE_SET_METHOD(process, "checkBreak", CheckBreak);
+ NODE_SET_METHOD(process, "uptime", Uptime);
NODE_SET_METHOD(process, "binding", Binding);
@@ -1341,6 +1383,9 @@ static void Load(int argc, char *argv[]) {
Local<Value> args[1] = { Local<Value>::New(process) };
+ // record startup_time
+ startup_time = monotonic_msec();
+
f->Call(global, 1, args);
#ifndef NDEBUG
#include <time.h>
#include <stdio.h>
#include <unistd.h>
// compile on OS X: g++ -o uptime_test uptime_test.cc
// compile Linux: g++ -o uptime_test uptime_test.cc -lrt
#ifdef __APPLE__
#include <mach/mach_time.h>
static double monotonic_msec() {
static mach_timebase_info_data_t clock_gettime_inf;
uint64_t now, nano;
now = mach_absolute_time();
if (0 == clock_gettime_inf.denom)
mach_timebase_info(&clock_gettime_inf);
nano = now * clock_gettime_inf.numer / clock_gettime_inf.denom;
return (double) nano * 1e-6;
}
#else
static double monotonic_msec() {
timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
return (double) ts.tv_sec * 1e3 + (double) ts.tv_nsec * 1e-6;
}
#endif
static double startup_time;
static int unique_deltas;
static double Uptime() {
return monotonic_msec() - startup_time;
}
int main() {
int i;
static int deltas[100000];
double f,s;
int d;
startup_time = monotonic_msec();
for (i = 0; i < 1000000; i++)
{
f = Uptime();
s = Uptime();
d = (int) ((s-f)*1e6);
if (d < 100000)
deltas[d]++;
else
printf("Huge diff: %d nsec !!!\n", d);
}
printf("Consecutive Uptime() statistics\n");
printf("for 1000000 invocations:\n");
for (i = 0; i < 100000; i++)
if (deltas[i]) {
printf("%6d nsec ... %6d times\n", i, deltas[i]);
unique_deltas++;
}
printf("Unique deltas: %d\n", unique_deltas);
}
Consecutive Uptime() statistics
for 1000000 invocations:
71 nsec ... 95 times
72 nsec ... 1109 times
73 nsec ... 75519 times
74 nsec ... 320060 times
75 nsec ... 517135 times
76 nsec ... 11677 times
77 nsec ... 55327 times
78 nsec ... 18234 times
79 nsec ... 557 times
80 nsec ... 12 times
81 nsec ... 74 times
82 nsec ... 4 times
83 nsec ... 10 times
84 nsec ... 11 times
86 nsec ... 10 times
87 nsec ... 1 times
88 nsec ... 1 times
90 nsec ... 3 times
92 nsec ... 5 times
93 nsec ... 4 times
95 nsec ... 12 times
96 nsec ... 3 times
97 nsec ... 1 times
98 nsec ... 1 times
99 nsec ... 25 times
100 nsec ... 2 times
101 nsec ... 4 times
102 nsec ... 7 times
103 nsec ... 1 times
104 nsec ... 14 times
105 nsec ... 3 times
106 nsec ... 1 times
107 nsec ... 1 times
108 nsec ... 8 times
110 nsec ... 4 times
111 nsec ... 6 times
113 nsec ... 1 times
117 nsec ... 5 times
119 nsec ... 2 times
120 nsec ... 1 times
122 nsec ... 4 times
124 nsec ... 2 times
125 nsec ... 2 times
126 nsec ... 3 times
128 nsec ... 1 times
129 nsec ... 1 times
130 nsec ... 1 times
131 nsec ... 1 times
135 nsec ... 1 times
138 nsec ... 1 times
141 nsec ... 1 times
144 nsec ... 2 times
149 nsec ... 1 times
155 nsec ... 1 times
158 nsec ... 1 times
162 nsec ... 1 times
165 nsec ... 1 times
170 nsec ... 1 times
176 nsec ... 1 times
189 nsec ... 1 times
198 nsec ... 1 times
216 nsec ... 1 times
272 nsec ... 1 times
1754 nsec ... 1 times
1763 nsec ... 1 times
1793 nsec ... 1 times
2121 nsec ... 1 times
2148 nsec ... 1 times
2207 nsec ... 1 times
2322 nsec ... 1 times
2499 nsec ... 1 times
2813 nsec ... 1 times
2832 nsec ... 1 times
2833 nsec ... 1 times
2876 nsec ... 1 times
3042 nsec ... 1 times
3087 nsec ... 1 times
5589 nsec ... 1 times
8790 nsec ... 1 times
9109 nsec ... 1 times
9133 nsec ... 1 times
21636 nsec ... 1 times
Unique deltas: 82
// uptime_test.js
var sys=require('sys');
sys.puts("Node init time: "+ process.uptime() + " msec");
var i;
var n = 1000000;
var m = 100000;
var unique_deltas = 0;
var deltas = new Array(m);
deltas.length = m;
for (i = 0; i < m; i++)
deltas[i] = 0;
for (i = 0; i < n; i++) {
var f,s,d;
f = process.uptime();
s = process.uptime();
d = Math.round((s-f)*1e6);
if (d > m)
sys.puts ( " d is too large: "+ d);
else {
deltas[d]++;
}
}
for (i = 0; i < n; i++) {
if (deltas[i] > 0)
{
unique_deltas++;
sys.puts(i+" nsec "+deltas[i] + " times");
}
}
sys.puts("unique deltas: "+ unique_deltas);
Node init time: 16.17586800456047 msec
152 nsec 2 times
153 nsec 8 times
156 nsec 273892 times
157 nsec 4944 times
158 nsec 36749 times
159 nsec 379888 times
160 nsec 44716 times
162 nsec 75382 times
163 nsec 1455 times
164 nsec 1394 times
165 nsec 14601 times
166 nsec 1780 times
168 nsec 3415 times
169 nsec 76 times
170 nsec 1245 times
171 nsec 13225 times
172 nsec 1552 times
174 nsec 9640 times
175 nsec 220 times
176 nsec 208 times
177 nsec 2002 times
178 nsec 216 times
180 nsec 15079 times
181 nsec 319 times
182 nsec 3274 times
183 nsec 34623 times
184 nsec 4059 times
186 nsec 6949 times
187 nsec 161 times
188 nsec 342 times
189 nsec 3606 times
190 nsec 401 times
192 nsec 1039 times
193 nsec 26 times
194 nsec 53 times
195 nsec 527 times
196 nsec 72 times
198 nsec 450 times
199 nsec 8 times
200 nsec 17 times
201 nsec 208 times
202 nsec 25 times
204 nsec 339 times
205 nsec 15 times
206 nsec 412 times
207 nsec 4677 times
208 nsec 530 times
210 nsec 22111 times
211 nsec 582 times
212 nsec 726 times
213 nsec 7644 times
214 nsec 897 times
216 nsec 8629 times
217 nsec 191 times
218 nsec 192 times
219 nsec 2122 times
220 nsec 257 times
222 nsec 709 times
223 nsec 19 times
224 nsec 10 times
225 nsec 133 times
226 nsec 17 times
228 nsec 80 times
229 nsec 2 times
230 nsec 30 times
231 nsec 278 times
232 nsec 31 times
234 nsec 2129 times
235 nsec 58 times
236 nsec 82 times
237 nsec 838 times
238 nsec 95 times
240 nsec 1364 times
241 nsec 42 times
242 nsec 42 times
243 nsec 464 times
244 nsec 75 times
246 nsec 189 times
247 nsec 3 times
248 nsec 6 times
249 nsec 88 times
250 nsec 11 times
252 nsec 75 times
253 nsec 4 times
254 nsec 8 times
255 nsec 56 times
256 nsec 4 times
258 nsec 47 times
259 nsec 2 times
260 nsec 4 times
261 nsec 28 times
262 nsec 3 times
264 nsec 28 times
266 nsec 37 times
267 nsec 440 times
268 nsec 48 times
270 nsec 1829 times
271 nsec 48 times
272 nsec 87 times
273 nsec 918 times
274 nsec 119 times
276 nsec 199 times
277 nsec 7 times
278 nsec 16 times
279 nsec 156 times
280 nsec 30 times
282 nsec 49 times
284 nsec 5 times
285 nsec 61 times
286 nsec 10 times
288 nsec 38 times
290 nsec 4 times
291 nsec 48 times
292 nsec 4 times
294 nsec 46 times
295 nsec 1 times
296 nsec 12 times
297 nsec 147 times
298 nsec 20 times
300 nsec 204 times
301 nsec 15 times
302 nsec 3 times
303 nsec 35 times
304 nsec 3 times
306 nsec 20 times
308 nsec 1 times
309 nsec 10 times
312 nsec 6 times
314 nsec 2 times
315 nsec 18 times
316 nsec 4 times
318 nsec 21 times
321 nsec 16 times
322 nsec 3 times
324 nsec 215 times
325 nsec 6 times
326 nsec 25 times
327 nsec 282 times
328 nsec 36 times
330 nsec 138 times
331 nsec 6 times
333 nsec 26 times
334 nsec 3 times
336 nsec 4 times
339 nsec 1 times
342 nsec 1 times
345 nsec 1 times
351 nsec 1 times
354 nsec 13 times
355 nsec 1 times
356 nsec 2 times
357 nsec 22 times
358 nsec 6 times
360 nsec 13 times
361 nsec 1 times
366 nsec 1 times
375 nsec 1 times
396 nsec 1 times
399 nsec 2 times
420 nsec 2 times
426 nsec 1 times
432 nsec 1 times
528 nsec 1 times
568 nsec 1 times
582 nsec 1 times
1500 nsec 1 times
1582 nsec 1 times
1602 nsec 2 times
1603 nsec 1 times
1617 nsec 1 times
1623 nsec 1 times
1654 nsec 1 times
1701 nsec 1 times
1710 nsec 1 times
1716 nsec 1 times
1731 nsec 1 times
1734 nsec 1 times
1737 nsec 1 times
1752 nsec 1 times
1773 nsec 1 times
1809 nsec 1 times
1813 nsec 1 times
1839 nsec 1 times
1840 nsec 1 times
1902 nsec 1 times
1945 nsec 1 times
2106 nsec 1 times
2151 nsec 2 times
2193 nsec 1 times
2220 nsec 1 times
2248 nsec 1 times
2253 nsec 1 times
2262 nsec 1 times
2451 nsec 1 times
2457 nsec 1 times
2473 nsec 1 times
2479 nsec 1 times
2514 nsec 1 times
2634 nsec 1 times
2643 nsec 1 times
2695 nsec 1 times
2796 nsec 1 times
2797 nsec 1 times
2856 nsec 1 times
2914 nsec 1 times
2970 nsec 1 times
3009 nsec 1 times
3294 nsec 1 times
3508 nsec 1 times
3544 nsec 1 times
3594 nsec 1 times
3687 nsec 1 times
3723 nsec 1 times
3729 nsec 1 times
3732 nsec 1 times
3741 nsec 1 times
3751 nsec 1 times
3753 nsec 1 times
3756 nsec 1 times
3760 nsec 1 times
3784 nsec 1 times
3786 nsec 2 times
3798 nsec 1 times
3813 nsec 1 times
3817 nsec 1 times
3841 nsec 1 times
3843 nsec 1 times
3846 nsec 1 times
3850 nsec 2 times
3853 nsec 1 times
3858 nsec 1 times
3865 nsec 1 times
3871 nsec 2 times
3877 nsec 1 times
3894 nsec 1 times
3897 nsec 1 times
3904 nsec 1 times
3924 nsec 1 times
3937 nsec 1 times
3939 nsec 3 times
3945 nsec 1 times
3951 nsec 1 times
3954 nsec 1 times
3961 nsec 1 times
3964 nsec 2 times
3973 nsec 1 times
3984 nsec 1 times
3987 nsec 1 times
3988 nsec 1 times
3993 nsec 1 times
3994 nsec 1 times
3999 nsec 2 times
4005 nsec 1 times
4017 nsec 1 times
4032 nsec 1 times
4051 nsec 1 times
4054 nsec 1 times
4062 nsec 1 times
4063 nsec 1 times
4066 nsec 2 times
4068 nsec 1 times
4071 nsec 1 times
4074 nsec 1 times
4092 nsec 1 times
4095 nsec 1 times
4123 nsec 1 times
4126 nsec 2 times
4134 nsec 1 times
4143 nsec 1 times
4152 nsec 1 times
4153 nsec 1 times
4155 nsec 1 times
4168 nsec 1 times
4173 nsec 1 times
4194 nsec 1 times
4198 nsec 1 times
4207 nsec 1 times
4227 nsec 1 times
4255 nsec 1 times
4267 nsec 1 times
4303 nsec 1 times
4345 nsec 1 times
4353 nsec 1 times
4372 nsec 1 times
4386 nsec 1 times
4402 nsec 1 times
4407 nsec 1 times
4428 nsec 1 times
4432 nsec 1 times
4495 nsec 1 times
4506 nsec 1 times
4509 nsec 1 times
4519 nsec 1 times
4525 nsec 1 times
4582 nsec 1 times
4597 nsec 1 times
4599 nsec 1 times
4606 nsec 1 times
4633 nsec 1 times
4717 nsec 1 times
4726 nsec 1 times
4728 nsec 1 times
4753 nsec 1 times
4780 nsec 1 times
4794 nsec 2 times
4818 nsec 1 times
4836 nsec 1 times
4839 nsec 1 times
4843 nsec 1 times
4875 nsec 1 times
4882 nsec 1 times
4894 nsec 1 times
4899 nsec 1 times
4933 nsec 1 times
4959 nsec 1 times
4968 nsec 1 times
4992 nsec 1 times
5032 nsec 1 times
5071 nsec 1 times
5103 nsec 1 times
5115 nsec 1 times
5193 nsec 1 times
5209 nsec 1 times
5248 nsec 1 times
5329 nsec 1 times
5355 nsec 1 times
5359 nsec 1 times
5379 nsec 1 times
5385 nsec 1 times
5583 nsec 1 times
5881 nsec 1 times
6511 nsec 1 times
6912 nsec 1 times
7336 nsec 1 times
7362 nsec 1 times
7744 nsec 1 times
8004 nsec 1 times
8464 nsec 1 times
8493 nsec 1 times
8926 nsec 1 times
9184 nsec 1 times
9415 nsec 1 times
9493 nsec 1 times
10151 nsec 1 times
10279 nsec 1 times
10610 nsec 1 times
10654 nsec 1 times
10828 nsec 1 times
12005 nsec 1 times
12013 nsec 1 times
12260 nsec 1 times
12797 nsec 1 times
12908 nsec 1 times
13646 nsec 1 times
14068 nsec 1 times
17324 nsec 1 times
19217 nsec 1 times
19775 nsec 1 times
23241 nsec 1 times
27720 nsec 1 times
32071 nsec 1 times
33592 nsec 1 times
33799 nsec 1 times
33802 nsec 1 times
34138 nsec 1 times
34168 nsec 1 times
34396 nsec 1 times
34699 nsec 1 times
35893 nsec 1 times
37184 nsec 1 times
46614 nsec 1 times
53134 nsec 1 times
unique deltas: 372
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment