Import from stackprof to convenient in-memory format
This commit is contained in:
@@ -0,0 +1,47 @@
|
||||
// https://github.com/tmm1/stackprof
|
||||
|
||||
import {Profile, Frame} from './profile'
|
||||
|
||||
interface StackprofFrame {
|
||||
name: string
|
||||
file?: string
|
||||
line?: number
|
||||
}
|
||||
|
||||
export interface StackprofProfile {
|
||||
frames: {[number: string]: StackprofFrame}
|
||||
raw: number[]
|
||||
raw_timestamp_deltas: number[]
|
||||
}
|
||||
|
||||
export function importFromStackprof(contents: string): Profile {
|
||||
const stackprofProfile = JSON.parse(contents) as StackprofProfile
|
||||
|
||||
const duration = stackprofProfile.raw_timestamp_deltas.reduce((a, b) => a + b, 0)
|
||||
const profile = new Profile(duration)
|
||||
|
||||
const {frames, raw, raw_timestamp_deltas} = stackprofProfile
|
||||
let sampleIndex = 0
|
||||
for (let i = 0; i < raw.length;) {
|
||||
const stackHeight = raw[i++]
|
||||
|
||||
const stack: Frame[] = []
|
||||
for (let j = 0; j < stackHeight; j++) {
|
||||
const id = raw[i++]
|
||||
stack.push({
|
||||
key: id,
|
||||
...frames[id]
|
||||
})
|
||||
}
|
||||
const nSamples = raw[i++]
|
||||
|
||||
let sampleDuration = 0
|
||||
for (let j = 0; j < nSamples; j++) {
|
||||
sampleDuration += raw_timestamp_deltas[sampleIndex++]
|
||||
}
|
||||
|
||||
profile.appendSample(stack, sampleDuration)
|
||||
}
|
||||
|
||||
return profile
|
||||
}
|
||||
Reference in New Issue
Block a user