Skip to content
This repository was archived by the owner on Apr 16, 2020. It is now read-only.

Commit aab9425

Browse files
committed
profiling
1 parent 3c1e4cd commit aab9425

File tree

8 files changed

+136
-1191
lines changed

8 files changed

+136
-1191
lines changed

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
"lint": "aegir-lint",
1212
"benchmarks": "node .",
1313
"benchmarks:report": "node src/report",
14-
"benchmarks:report:profile": "node src/report --profile=true"
14+
"benchmarks:report:profile": "sudo node src/report --profile=true"
1515
},
1616
"pre-commit": [
1717
"lint",

src/profile.js

Lines changed: 66 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,71 @@
11
'use strict'
22

3-
const profiler = require('./profiler')
4-
const argv = require('yargs').argv
3+
const spawn = require('child_process').spawn
4+
const split = require('split')
5+
const url = require('url')
6+
const path = require('path')
7+
const mapSeries = require('async/mapSeries')
58

6-
const suites = argv._
7-
const outDir = argv.out
8-
if (!outDir) {
9-
throw new Error('please provide an out dir')
9+
module.exports = profile
10+
11+
function profile (outDir, suites, envs, callback) {
12+
mapSeries(envs, (env, callback) => {
13+
profileOneEnv(outDir, suites, env, (err, path) => {
14+
if (err) {
15+
callback(err)
16+
return // early
17+
}
18+
19+
callback(null, {
20+
env: env,
21+
path: path
22+
})
23+
})
24+
}, callback)
1025
}
1126

12-
profiler(outDir, suites, (err, resultLink) => {
13-
if (err) {
14-
throw err
15-
}
16-
process.stdout.write(resultLink)
17-
})
27+
function profileOneEnv (baseOutDir, suites, env, callback) {
28+
const outDir = path.join(baseOutDir, env)
29+
const args = ['--output-dir', outDir].concat([process.argv[0], __dirname].concat(suites).concat('--envs=' + env))
30+
31+
console.log('SPAWNING 0x', args.join(' '))
32+
const child = spawn('0x', args, {})
33+
let lastLine = ''
34+
let error
35+
let errorOut = ''
36+
let ended = false
37+
38+
process.once('SIGINT', () => {
39+
if (!ended) {
40+
console.error('INT')
41+
child.kill('SIGINT')
42+
}
43+
})
44+
45+
child.stdout.pipe(process.stdout, { end : false })
46+
47+
child.stderr.pipe(split())
48+
.on('data', (line) => {
49+
if (line) {
50+
lastLine = line
51+
errorOut += line + '\n'
52+
}
53+
})
54+
.once('end', () => {
55+
console.log('ENDED')
56+
ended = true
57+
if (!error) {
58+
const matched = lastLine.match(/file:\/\/.*\/flamegraph.html/)
59+
if (matched) {
60+
const resultPath = url.parse(matched[0].replace('file://', 'file:///')).pathname
61+
callback(null, path.relative(baseOutDir, resultPath))
62+
} else {
63+
callback(new Error('0x unexpected output:\n' + errorOut))
64+
}
65+
}
66+
})
67+
.once('error', (err) => {
68+
error = err
69+
callback(err)
70+
})
71+
}

src/profiler.js

Lines changed: 0 additions & 43 deletions
This file was deleted.

src/report-templates/aggregate.html

Lines changed: 0 additions & 104 deletions
This file was deleted.

src/report-templates/results.html

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,25 @@ <h4 class="text-center">{{name}}</h4>
348348
</div>
349349
</div>
350350

351+
<div class="panel panel-default">
352+
<div class="panel-heading" role="tab" id="{{suite}}-profile-headingOne">
353+
<h4 class="panel-title">
354+
<a role="button" data-toggle="collapse" href="#{{suite}}-profile" aria-expanded="true" aria-controls="{{suite}}-profile">
355+
Profile
356+
</a>
357+
</h4>
358+
</div>
359+
<div id="{{suite}}-profile" class="panel-collapse collapse" role="tabpanel" aria-labelledby="{{suite}}-profile-headingOne">
360+
<div class="panel-body container-fluid">
361+
{{#each results}}
362+
{{#if profile}}
363+
<p><a href="{{../suite}}/{{profile}}" target="_blank">{{env}}</a></p>
364+
{{/if}}
365+
{{/each}}
366+
</div>
367+
</div>
368+
</div>
369+
351370
</div>
352371
</div>
353372
</div>

src/report.js

Lines changed: 48 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,12 @@ const mkdirp = require('mkdirp')
88
const fs = require('fs')
99
const argv = require('yargs').argv
1010
const mapSeries = require('async/mapSeries')
11+
const eachSeries = require('async/eachSeries')
1112
const waterfall = require('async/waterfall')
1213

1314
const aggregate = require('./aggregate')
15+
const profile = require('./profile')
16+
const envs = require('./run').allEnvironments
1417

1518
const PATTERNS_TO_OBLITERATE = [
1619
/Swarm listening on .*\n/g,
@@ -27,17 +30,18 @@ if (!suites.length) {
2730

2831
const prefix = (new Date()).toISOString() + '-report'
2932
const outDir = join(__dirname, '..', 'reports', 'out', prefix)
30-
mkdirp.sync(outDir)
3133
const out = join(outDir, 'report.html')
3234
const resultsJSONPath = join(outDir, 'results.json')
3335

36+
mkdirp.sync(outDir)
37+
3438
mapSeries(
3539
suites,
3640
(suite, callback) => {
3741
waterfall([
3842
(callback) => {
3943
// run suite
40-
const command = 'node ' + __dirname + ' ' + suite + ' --json'
44+
const command = ['node', __dirname, suite, ' --json'].join(' ')
4145
const child = exec(command, (err, stdout) => {
4246
console.log(stdout)
4347
if (err) {
@@ -60,21 +64,37 @@ mapSeries(
6064
callback(null, result)
6165
return
6266
}
63-
process.stderr.write(('profiling ' + suite + '\n').yellow)
64-
const command = ['node', join(__dirname, 'profile'), suite, '--out', join(outDir, suite)].join(' ')
65-
const child = exec(command, (err, stdout) => {
66-
if (err) {
67-
callback(err)
68-
} else {
67+
68+
eachSeries(envs, (env, callback) => {
69+
if (env === 'go') {
70+
callback()
71+
return // early
72+
}
73+
74+
process.stderr.write(('profiling ' + suite + ', env: ' + env + '\n').yellow)
75+
mkdirp.sync(join(outDir, suite, env))
76+
77+
profile(join(outDir, suite), [suite], [env], (err, profileResults) => {
78+
if (err) {
79+
callback(err)
80+
return // early
81+
}
6982
process.stderr.write('done\n\n'.green)
70-
result[0].profile = join(suite, stdout.trim())
83+
84+
// find suite
85+
86+
profileResults.forEach((profileResult) => {
87+
const envResults = findEnvResultsInResult(result, suite, profileResult.env)
88+
envResults.profile = profileResult.path
89+
})
90+
7191
callback(null, result)
72-
}
92+
})
93+
}, (err) => {
94+
callback(err, result)
7395
})
74-
child.stderr.pipe(process.stderr, { end: false })
7596
}
76-
],
77-
callback)
97+
], callback)
7898
},
7999
(err, _results) => {
80100
if (err) {
@@ -144,3 +164,18 @@ function generateReport (results, callback) {
144164
function cleanOutput (out) {
145165
return PATTERNS_TO_OBLITERATE.reduce((out, p) => out.replace(p, ''), out)
146166
}
167+
168+
function findEnvResultsInResult (result, suite, env) {
169+
let found
170+
result.suites.forEach((s) => {
171+
if (s.suite === suite) {
172+
s.results.forEach((result) => {
173+
if (result.env === env) {
174+
found = result
175+
}
176+
})
177+
}
178+
})
179+
180+
return found
181+
}

0 commit comments

Comments
 (0)