Skip to content

Commit 2bcee5a

Browse files
committed
bench: add cookies from top 20 sites
closes #79
1 parent 4f08c95 commit 2bcee5a

File tree

7 files changed

+176
-16
lines changed

7 files changed

+176
-16
lines changed

.github/workflows/ci.yml

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -36,61 +36,67 @@ jobs:
3636
- name: Node.js 0.6
3737
node-version: "0.6"
3838
39-
npm-rm: beautify-benchmark benchmark nyc
39+
npm-rm: beautify-benchmark benchmark nyc top-sites
4040

4141
- name: Node.js 0.8
4242
node-version: "0.8"
4343
44-
npm-rm: beautify-benchmark benchmark nyc
44+
npm-rm: beautify-benchmark benchmark nyc top-sites
4545

4646
- name: Node.js 0.10
4747
node-version: "0.10"
4848
49-
npm-rm: beautify-benchmark benchmark
49+
npm-rm: beautify-benchmark benchmark top-sites
5050

5151
- name: Node.js 0.12
5252
node-version: "0.12"
5353
54-
npm-rm: beautify-benchmark benchmark
54+
npm-rm: beautify-benchmark benchmark top-sites
5555

5656
- name: io.js 1.x
5757
node-version: "1.8"
5858
59-
npm-rm: beautify-benchmark benchmark
59+
npm-rm: beautify-benchmark benchmark top-sites
6060

6161
- name: io.js 2.x
6262
node-version: "2.5"
6363
64-
npm-rm: beautify-benchmark benchmark
64+
npm-rm: beautify-benchmark benchmark top-sites
6565

6666
- name: io.js 3.x
6767
node-version: "3.3"
6868
69-
npm-rm: beautify-benchmark benchmark
69+
npm-rm: beautify-benchmark benchmark top-sites
7070

7171
- name: Node.js 4.x
7272
node-version: "4.9"
7373
74+
npm-rm: beautify-benchmark benchmark top-sites
7475

7576
- name: Node.js 5.x
7677
node-version: "5.12"
7778
79+
npm-rm: beautify-benchmark benchmark top-sites
7880

7981
- name: Node.js 6.x
8082
node-version: "6.17"
8183
84+
npm-rm: beautify-benchmark benchmark top-sites
8285

8386
- name: Node.js 7.x
8487
node-version: "7.10"
8588
89+
npm-rm: beautify-benchmark benchmark top-sites
8690

8791
- name: Node.js 8.x
8892
node-version: "8.17"
8993
94+
npm-rm: beautify-benchmark benchmark top-sites
9095

9196
- name: Node.js 9.x
9297
node-version: "9.11"
9398
99+
npm-rm: beautify-benchmark benchmark top-sites
94100

95101
- name: Node.js 10.x
96102
node-version: "10.24"

README.md

Lines changed: 29 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -219,18 +219,40 @@ $ npm run bench
219219
220220
221221
222+
> node benchmark/parse-top.js
223+
224+
cookie.parse - top sites
225+
226+
15 tests completed.
227+
228+
parse accounts.google.com x 522,610 ops/sec ±7.53% (191 runs sampled)
229+
parse apple.com x 1,617,049 ops/sec ±12.52% (173 runs sampled)
230+
parse cloudflare.com x 379,557 ops/sec ±3.46% (189 runs sampled)
231+
parse docs.google.com x 603,625 ops/sec ±1.33% (189 runs sampled)
232+
parse drive.google.com x 610,355 ops/sec ±0.74% (191 runs sampled)
233+
parse en.wikipedia.org x 290,824 ops/sec ±0.83% (192 runs sampled)
234+
parse linkedin.com x 169,887 ops/sec ±0.57% (192 runs sampled)
235+
parse maps.google.com x 286,005 ops/sec ±0.55% (189 runs sampled)
236+
parse microsoft.com x 36,237 ops/sec ±0.59% (192 runs sampled)
237+
parse play.google.com x 373,727 ops/sec ±0.74% (193 runs sampled)
238+
parse plus.google.com x 586,023 ops/sec ±0.56% (189 runs sampled)
239+
parse support.google.com x 329,710 ops/sec ±0.49% (188 runs sampled)
240+
parse www.google.com x 287,861 ops/sec ±0.53% (193 runs sampled)
241+
parse youtu.be x 554,207 ops/sec ±0.71% (193 runs sampled)
242+
parse youtube.com x 558,357 ops/sec ±0.60% (188 runs sampled)
243+
222244
> node benchmark/parse.js
223245
224-
cookie.parse
246+
cookie.parse - generic
225247
226248
6 tests completed.
227249
228-
simple x 1,583,012 ops/sec ±0.70% (191 runs sampled)
229-
decode x 958,910 ops/sec ±0.44% (193 runs sampled)
230-
unquote x 974,390 ops/sec ±4.49% (188 runs sampled)
231-
duplicates x 572,274 ops/sec ±0.55% (190 runs sampled)
232-
10 cookies x 164,955 ops/sec ±0.69% (186 runs sampled)
233-
100 cookies x 15,415 ops/sec ±0.57% (193 runs sampled)
250+
simple x 1,546,505 ops/sec ±0.67% (187 runs sampled)
251+
decode x 842,073 ops/sec ±8.38% (171 runs sampled)
252+
unquote x 931,934 ops/sec ±6.60% (193 runs sampled)
253+
duplicates x 575,230 ops/sec ±0.63% (190 runs sampled)
254+
10 cookies x 164,555 ops/sec ±0.79% (189 runs sampled)
255+
100 cookies x 15,370 ops/sec ±0.63% (193 runs sampled)
234256
```
235257

236258
## References

benchmark/parse-top.js

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,47 @@
1+
/**
2+
* Module dependencies.
3+
*/
4+
5+
var benchmark = require('benchmark')
6+
var benchmarks = require('beautify-benchmark')
7+
var top = require('./parse-top.json')
8+
9+
/**
10+
* Globals for benchmark.js
11+
*/
12+
13+
global.cookie = require('..')
14+
15+
var suite = new benchmark.Suite()
16+
17+
Object.keys(top).forEach(function (domain) {
18+
suite.add({
19+
name: 'parse ' + domain,
20+
minSamples: 100,
21+
fn: 'var val = cookie.parse(' + JSON.stringify(top[domain]) + ')'
22+
})
23+
})
24+
25+
suite.on('start', function onCycle (event) {
26+
process.stdout.write(' cookie.parse - top sites\n\n')
27+
})
28+
29+
suite.on('cycle', function onCycle (event) {
30+
benchmarks.add(event.target)
31+
})
32+
33+
suite.on('complete', function onComplete () {
34+
benchmarks.log()
35+
})
36+
37+
suite.run({async: false})
38+
39+
function gencookies (num) {
40+
var str = ''
41+
42+
for (var i = 0; i < num; i++) {
43+
str += '; foo' + i + '=bar'
44+
}
45+
46+
return str.substr(2)
47+
}

benchmark/parse-top.json

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
{
2+
"accounts.google.com": "__Ulll-UUUU=0:UUlUlUlUllUU0UllUll0llU0lUlUUU:0UUUUlllllUUUU0l",
3+
"apple.com": "lll=UU",
4+
"cloudflare.com": "__ll_ll=U0lUlUUlUlll00l00UlUUlUlllUlUUlUlUUlUUlUllU-0000000000-0-UllUUU0lU0U0Ul0lUl0lUUlUllU0UllllUlU00UllUll+ll0Ull0UlU0lU00UUlUllllU0U0UUUUllUUUUU0lUU/lUlUl00ll0UUUlUUUUUU",
5+
"docs.google.com": "__Ulll-UUUU=0:lU0llUl0llUllUUl0l0UU0UUUlllUl:0UUlllUlUl-l0U0l",
6+
"drive.google.com": "__Ulll-UUUU=0:l00_0UlU0lU0UlU0ll0l0l0UUllUUl:0ll0Ul0lUllUl-ll",
7+
"en.wikipedia.org": "UUU-Ulll-Ulllll=00-Ull-0000; UUU-Ulll-Ulllll-Ulllll=00-Ull-0000; UllUU=UU:UU:Ulllllllllll:00.00:-00.00:l0",
8+
"linkedin.com": "UUUUUUUUUU=llll:0000000000000000000; llll=l=0&llll=ll-ll; lllllll=\"l=0&l0l0lll0-0000-0000-0000-l000ll00l000\"; llllllll=\"l=0&000000000000000000lll0-l0l0-000l-00ll-000000l00000UUUl0lU00Ul0lll0UlUlllllUU0UlUlU\"; llll=\"l=UUUU00:l=U:l=U:l=U:l=U:l=0000:l=0:l=0:l=0000000000:l=0000000000:l=0:lll=UUUUUUlll0lUUU00UUll0lUUUlllUlUU\"",
9+
"maps.google.com": "0U_UUU=0000-00-00-00; UUU=000=UlUUl00lU0UUllUUll0UllUUlllllUlllll-lU-l0UUl0UUlllUlU0UUU0UUllUl0UlUU0lllUUU0UllUlll00llll0lll0ll-l-0lUlUlUUllU0UllUUl00llllU0lUU0UU0U0UUUUlllUll0lUUlllUUl0lllUU0lllUllUUU",
10+
"microsoft.com": "llUllllUllllll=0; UUUU=000U00000U000U0U000000000U0U0U00; U-UU-UUUUUUUU=lll=llllll000l0%0lllllllllllll000%0llllllllllll%0lllllllllllllllll%0lllllllllllllllll%0lllllllllllllllllllllll%0lllllllllllllllllll%0llll-lll-lllll0l0ll&lll=0000l00l-0l00-0l00-l00l-ll00ll00l0l0; U-UU-Ulll=0; lllll_UllUU=0000000000~ll=00~ll=000000000lll00ll000lll0ll0l000l0; lllll_UllUU=0000000000~ll=00~ll=000000000lll00ll000lll0ll0l000l0",
11+
"play.google.com": "UUU=000=l0llUUlUl0U-llUlUU0lllU-llllU0U0lllllllU0llllUU_0llUllllUU0lllUUUUl_U0Ull-0UlUllUU-lU0llU0U0lUU0llUUlUllUll00llUU0l0UllUlUUUllllUUllUlUUllUlUlUl0-lUll0lllUlUUUUUllll0l0lll",
12+
"plus.google.com": "__Ulll-UUUU=0:ll0U0UlU0U-0lU00Ul0lU00llUUUUU:llUUllllUUUl0lUl",
13+
"support.google.com": "UUU=000=U00lUUl0_UlllU0UlU0Ul0UlUlU0Ulll0UU0UUlllll00l0UUll0UllUl0lUlUUUU0UlUlUlllU0UUllUlUUll0l0_lllUllUllllUUUU0U0Ul0UlllllUUlllllU0U-0UllUllUlU0l0lllU0ll0UU0UU0lUU0lUlllUlUUUll; UUU=000=U00lUUl0_UlllU0UlU0Ul0UlUlU0Ulll0UU0UUlllll00l0UUll0UllUl0lUlUUUU0UlUlUlllU0UUllUlUUll0l0_lllUllUllllUUUU0U0Ul0UlllllUUlllllU0U-0UllUllUlU0l0lllU0ll0UU0UU0lUU0lUlllUlUUUll",
14+
"www.google.com": "0U_UUU=0000-00-00-00; UUU=000=llUUUUU_-UlUlUl0U0UU0lUUl0UUUUU0lUll-0Ullll0ll0UUU_Ul00UlUll0lllUlllUlllUUl0lUUl0Ul0U00UUl00lUlUUllUlUlUll0l_lUUU0UlUl0UUlUlllllUU00Ul0llUlUlUl_UU_UUllUUlllUlUUlllUllUlUUl",
15+
"youtu.be": "UUU=0; UUU=0lUllllUUUU; UUUUUUU_UUUU0_UUUU=UUllllUllUl",
16+
"youtube.com": "UUU=0; UUU=lUlU0lllUll; UUUUUUU_UUUU0_UUUU=0UllU0UlU00"
17+
}

benchmark/parse.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ suite.add({
5050
})
5151

5252
suite.on('start', function onCycle (event) {
53-
process.stdout.write(' cookie.parse\n\n')
53+
process.stdout.write(' cookie.parse - generic\n\n')
5454
})
5555

5656
suite.on('cycle', function onCycle (event) {

package.json

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,8 @@
1818
"eslint": "7.32.0",
1919
"eslint-plugin-markdown": "2.2.1",
2020
"mocha": "9.1.4",
21-
"nyc": "15.1.0"
21+
"nyc": "15.1.0",
22+
"top-sites": "1.1.85"
2223
},
2324
"files": [
2425
"HISTORY.md",
@@ -35,6 +36,7 @@
3536
"test": "mocha --reporter spec --bail --check-leaks --ui qunit test/",
3637
"test-ci": "nyc --reporter=lcov --reporter=text npm test",
3738
"test-cov": "nyc --reporter=html --reporter=text npm test",
39+
"update-bench": "node scripts/update-benchmark.js",
3840
"version": "node scripts/version-history.js && git add HISTORY.md"
3941
}
4042
}

scripts/update-benchmark.js

Lines changed: 66 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,66 @@
1+
'use strict'
2+
3+
var fs = require('fs')
4+
var http = require('http')
5+
var https = require('https')
6+
var path = require('path')
7+
var topSites = require('top-sites')
8+
var url = require('url')
9+
10+
var BENCH_COOKIES_FILE = path.join(__dirname, '..', 'benchmark', 'parse-top.json')
11+
12+
getAllCookies(topSites.slice(0, 20), function (err, cookies) {
13+
if (err) throw err
14+
var str = '{\n' +
15+
Object.keys(cookies).sort().map(function (key) {
16+
return ' ' + JSON.stringify(key) + ': ' + JSON.stringify(cookies[key])
17+
}).join(',\n') +
18+
'\n}\n'
19+
fs.writeFileSync(BENCH_COOKIES_FILE, str)
20+
})
21+
22+
function get (href, callback) {
23+
var protocol = url.parse(href, false, true).protocol
24+
var proto = protocol === 'https:' ? https : http
25+
26+
proto.get(href)
27+
.on('error', callback)
28+
.on('response', function (res) {
29+
if (res.headers.location && res.statusCode >= 300 && res.statusCode < 400) {
30+
get(url.resolve(href, res.headers.location), callback)
31+
} else {
32+
callback(null, res)
33+
}
34+
})
35+
}
36+
37+
function getAllCookies (sites, callback) {
38+
var all = Object.create(null)
39+
var wait = sites.length
40+
41+
sites.forEach(function (site) {
42+
getCookies(site, function (err, cookies) {
43+
if (!err && cookies.length) {
44+
all[site.rootDomain] = cookies.map(obfuscate).join('; ')
45+
}
46+
if (!--wait) {
47+
callback(null, all)
48+
}
49+
})
50+
})
51+
}
52+
53+
function getCookies (site, callback) {
54+
var href = url.format({ hostname: site.rootDomain, protocol: 'http' })
55+
get(href, function (err, res) {
56+
if (err) return callback(err)
57+
var cookies = (res.headers['set-cookie'] || []).map(function (c) { return c.split(';')[0] })
58+
callback(null, cookies)
59+
})
60+
}
61+
62+
function obfuscate (str) {
63+
return str.replace(/[a-z]/g, function () { return 'l' })
64+
.replace(/[A-Z]/g, function () { return 'U' })
65+
.replace(/[0-9]/g, function () { return '0' })
66+
}

0 commit comments

Comments
 (0)