1 | #!/usr/bin/env node
|
2 |
|
3 | var msgpack_node = try_require("msgpack");
|
4 | var msgpack_lite = try_require("../index");
|
5 | var msgpack_js = try_require("msgpack-js");
|
6 | var msgpack_js_v5 = try_require("msgpack-js-v5");
|
7 | var msgpack5 = try_require("msgpack5");
|
8 | var msgpack_unpack = try_require("msgpack-unpack");
|
9 | var msgpack_codec = try_require("msgpack.codec");
|
10 | var notepack = try_require("notepack");
|
11 |
|
12 | msgpack5 = msgpack5 && msgpack5();
|
13 | msgpack_codec = msgpack_codec && msgpack_codec.msgpack;
|
14 |
|
15 | var pkg = require("../package.json");
|
16 | var data = require("../test/example");
|
17 | var packed = msgpack_lite.encode(data);
|
18 | var expected = JSON.stringify(data);
|
19 |
|
20 | var argv = Array.prototype.slice.call(process.argv, 2);
|
21 |
|
22 | if (argv[0] === "-v") {
|
23 | console.warn(pkg.name + " " + pkg.version);
|
24 | process.exit(0);
|
25 | }
|
26 |
|
27 | var limit = 5;
|
28 | if (argv[0] - 0) limit = argv.shift() - 0;
|
29 | limit *= 1000;
|
30 |
|
31 | var COL1 = 57;
|
32 | var COL2 = 6;
|
33 | var COL3 = 5;
|
34 | var COL4 = 6;
|
35 |
|
36 | console.log(rpad("operation", COL1), "|", " op ", "|", " ms ", "|", " op/s ");
|
37 | console.log(rpad("", COL1, "-"), "|", lpad(":", COL2, "-"), "|", lpad(":", COL3, "-"), "|", lpad(":", COL4, "-"));
|
38 |
|
39 | var buf, obj;
|
40 |
|
41 | if (JSON) {
|
42 | buf = bench('buf = Buffer(JSON.stringify(obj));', JSON_stringify, data);
|
43 | obj = bench('obj = JSON.parse(buf);', JSON.parse, buf);
|
44 | test(obj);
|
45 | }
|
46 |
|
47 | if (msgpack_lite) {
|
48 | buf = bench('buf = require("msgpack-lite").encode(obj);', msgpack_lite.encode, data);
|
49 | obj = bench('obj = require("msgpack-lite").decode(buf);', msgpack_lite.decode, packed);
|
50 | test(obj);
|
51 | }
|
52 |
|
53 | if (msgpack_node) {
|
54 | buf = bench('buf = require("msgpack").pack(obj);', msgpack_node.pack, data);
|
55 | obj = bench('obj = require("msgpack").unpack(buf);', msgpack_node.unpack, buf);
|
56 | test(obj);
|
57 | }
|
58 |
|
59 | if (msgpack_codec) {
|
60 | buf = bench('buf = Buffer(require("msgpack.codec").msgpack.pack(obj));', msgpack_codec_pack, data);
|
61 | obj = bench('obj = require("msgpack.codec").msgpack.unpack(buf);', msgpack_codec.unpack, buf);
|
62 | test(obj);
|
63 | }
|
64 |
|
65 | if (msgpack_js_v5) {
|
66 | buf = bench('buf = require("msgpack-js-v5").encode(obj);', msgpack_js_v5.encode, data);
|
67 | obj = bench('obj = require("msgpack-js-v5").decode(buf);', msgpack_js_v5.decode, buf);
|
68 | test(obj);
|
69 | }
|
70 |
|
71 | if (msgpack_js) {
|
72 | buf = bench('buf = require("msgpack-js").encode(obj);', msgpack_js.encode, data);
|
73 | obj = bench('obj = require("msgpack-js").decode(buf);', msgpack_js.decode, buf);
|
74 | test(obj);
|
75 | }
|
76 |
|
77 | if (msgpack5) {
|
78 | buf = bench('buf = require("msgpack5")().encode(obj);', msgpack5.encode, data);
|
79 | obj = bench('obj = require("msgpack5")().decode(buf);', msgpack5.decode, buf);
|
80 | test(obj);
|
81 | }
|
82 |
|
83 | if (notepack) {
|
84 | buf = bench('buf = require("notepack").encode(obj);', notepack.encode, data);
|
85 | obj = bench('obj = require("notepack").decode(buf);', notepack.decode, buf);
|
86 | test(obj);
|
87 | }
|
88 |
|
89 | if (msgpack_unpack) {
|
90 | obj = bench('obj = require("msgpack-unpack").decode(buf);', msgpack_unpack, packed);
|
91 | test(obj);
|
92 | }
|
93 |
|
94 | function JSON_stringify(src) {
|
95 | return Buffer(JSON.stringify(src));
|
96 | }
|
97 |
|
98 | function msgpack_codec_pack(data) {
|
99 | return Buffer(msgpack_codec.pack(data));
|
100 | }
|
101 |
|
102 | function bench(name, func, src) {
|
103 | if (argv.length) {
|
104 | var match = argv.filter(function(grep) {
|
105 | return (name.indexOf(grep) > -1);
|
106 | });
|
107 | if (!match.length) return SKIP;
|
108 | }
|
109 | var ret, duration;
|
110 | var start = new Date() - 0;
|
111 | var count = 0;
|
112 | while (1) {
|
113 | var end = new Date() - 0;
|
114 | duration = end - start;
|
115 | if (duration >= limit) break;
|
116 | while ((++count) % 100) ret = func(src);
|
117 | }
|
118 | name = rpad(name, COL1);
|
119 | var score = Math.floor(count / duration * 1000);
|
120 | count = lpad(count, COL2);
|
121 | duration = lpad(duration, COL3);
|
122 | score = lpad(score, COL4);
|
123 | console.log(name, "|", count, "|", duration, "|", score);
|
124 | return ret;
|
125 | }
|
126 |
|
127 | function rpad(str, len, chr) {
|
128 | if (!chr) chr = " ";
|
129 | while (str.length < len) str += chr;
|
130 | return str;
|
131 | }
|
132 |
|
133 | function lpad(str, len, chr) {
|
134 | if (!chr) chr = " ";
|
135 | str += "";
|
136 | while (str.length < len) str = chr + str;
|
137 | return str;
|
138 | }
|
139 |
|
140 | function test(actual) {
|
141 | if (actual === SKIP) return;
|
142 | actual = JSON.stringify(actual);
|
143 | if (actual === expected) return;
|
144 | console.warn("expected: " + expected);
|
145 | console.warn("actual: " + actual);
|
146 | }
|
147 |
|
148 | function SKIP() {
|
149 | }
|
150 |
|
151 | function try_require(name) {
|
152 | try {
|
153 | return require(name);
|
154 | } catch (e) {
|
155 |
|
156 | }
|
157 | } |
\ | No newline at end of file |