Skip to content

Commit

Permalink
Merge sequentially identical samples
Browse files Browse the repository at this point in the history
  • Loading branch information
lahmatiy committed Mar 22, 2024
1 parent 0dba922 commit 2435ba3
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 18 deletions.
4 changes: 2 additions & 2 deletions app/prepare.js
Original file line number Diff line number Diff line change
Expand Up @@ -171,10 +171,10 @@ export default function(input, { rejectData, defineObjectMarker, addValueAnnotat
startOverheadTime,
endTime,
totalTime,
samples,
samples: samplesTimings.samples,
samplesTimings,
timeDeltas,
samplesTimingsFiltered,
timeDeltas: samplesTimings.timeDeltas,
wellKnownCallFrames,
callFrames,
callFramesTree,
Expand Down
44 changes: 28 additions & 16 deletions app/prepare/process-samples.ts
Original file line number Diff line number Diff line change
Expand Up @@ -227,6 +227,7 @@ export class DictionaryTiminigs<T extends CpuProNode> extends TimingsObserver {
selfTimes: Uint32Array;
totalTimes: Uint32Array;
entries: DictionaryTiminig<T>[];
entriesMap: Map<T, DictionaryTiminig<T>>;

constructor(sourceTreeTimings: TreeTiminigs<T>) {
const { dictionary } = sourceTreeTimings.tree;
Expand Down Expand Up @@ -309,6 +310,27 @@ function createTimings<T extends CpuProNode>(
};
}

// Merging sequentially identical samples and coresponsing timeDeltas.
// Usually it allows to reduce number of samples for further processing at least by x2
function mergeSamples(samples: Uint32Array, timeDeltas: Uint32Array) {
let k = 1;

for (let i = 1; i < samples.length; i++) {
if (samples[i] !== samples[i - 1]) {
timeDeltas[k] = timeDeltas[i];
samples[k] = samples[i];
k++;
} else {
timeDeltas[k - 1] += timeDeltas[i];
}
}

return {
samples: k !== samples.length ? samples.slice(0, k) : samples,
timeDeltas: k !== timeDeltas.length ? timeDeltas.slice(0, k) : timeDeltas
};
}

function remapSamples(samples: Uint32Array, nodeById: Uint32Array) {
const tmpMap = new Uint32Array(nodeById.length);
const samplesMap = []; // -> callFramesTree.nodes
Expand All @@ -332,33 +354,23 @@ function remapSamples(samples: Uint32Array, nodeById: Uint32Array) {
}

export function processSamples(
samples: Uint32Array,
timeDeltas: Uint32Array,
rawSamples: Uint32Array,
rawTimeDeltas: Uint32Array,
callFramesTree: CallTree<CpuProCallFrame>,
functionsTree: CallTree<CpuProFunction>,
modulesTree: CallTree<CpuProModule>,
packagesTree: CallTree<CpuProPackage>,
areasTree: CallTree<CpuProArea>
) {
const mergeSamplesStart = Date.now();
const { samples, timeDeltas } = mergeSamples(rawSamples, rawTimeDeltas);
TIMINGS && console.log('merge samples', Date.now() - mergeSamplesStart);

const remapSamplesStart = Date.now();
let sampleIdToNode = remapSamples(samples, callFramesTree.sourceIdToNode);
callFramesTree.sampleIdToNode = sampleIdToNode;
TIMINGS && console.log('re-map samples', Date.now() - remapSamplesStart);

// let prev = samples[0];
// let k = 0;
// samples[0] = nodeById[prev];
// for (let i = 1, k = 1; i < samples.length; i++) {
// const sample = samples[i];
// if (sample !== prev) {
// timeDeltas[k] = timeDeltas[i];
// samples[k++] = nodeById[sample];
// prev = sample;
// } else {
// timeDeltas[k - 1] += timeDeltas[i];
// }
// }

const t = Date.now();
const samplesTimings = new SamplesTiminigs(sampleIdToNode.length, samples, timeDeltas);
const samplesTimingsFiltered = samplesTimings.clone();
Expand Down

0 comments on commit 2435ba3

Please sign in to comment.