Files
SpeedScope/import/stackprof.ts
Jamie Wong 177fb0eb1d Stackprof: stack garbage collection frames on top of previous stack (#85)
We do a similar thing for Chrome to make the flamegraphs more readable
2018-07-03 00:23:40 -07:00

55 lines
1.4 KiB
TypeScript

// https://github.com/tmm1/stackprof
import {Profile, FrameInfo, StackListProfileBuilder} from '../profile'
import {TimeFormatter} from '../value-formatters'
interface StackprofFrame {
name: string
file?: string
line?: number
}
export interface StackprofProfile {
frames: {[number: string]: StackprofFrame}
raw: number[]
raw_timestamp_deltas: number[]
}
export function importFromStackprof(stackprofProfile: StackprofProfile): Profile {
const duration = stackprofProfile.raw_timestamp_deltas.reduce((a, b) => a + b, 0)
const profile = new StackListProfileBuilder(duration)
const {frames, raw, raw_timestamp_deltas} = stackprofProfile
let sampleIndex = 0
let prevStack: FrameInfo[] = []
for (let i = 0; i < raw.length; ) {
const stackHeight = raw[i++]
let stack: FrameInfo[] = []
for (let j = 0; j < stackHeight; j++) {
const id = raw[i++]
stack.push({
key: id,
...frames[id],
})
}
if (stack.length === 1 && stack[0].name === '(garbage collection)') {
stack = prevStack.concat(stack)
}
const nSamples = raw[i++]
let sampleDuration = 0
for (let j = 0; j < nSamples; j++) {
sampleDuration += raw_timestamp_deltas[sampleIndex++]
}
profile.appendSample(stack, sampleDuration)
prevStack = stack
}
profile.setValueFormatter(new TimeFormatter('microseconds'))
return profile.build()
}