Skip to content

Commit d3722e0

Browse files
committed
Use BitSet for marking profile data during compacting.
1 parent 5279217 commit d3722e0

2 files changed

Lines changed: 51 additions & 49 deletions

File tree

src/profile-logic/profile-compacting.ts

Lines changed: 49 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ import {
1111
getEmptySourceTable,
1212
} from './data-structures';
1313
import { computeStringIndexMarkerFieldsByDataType } from './marker-schema';
14+
import { type BitSet, makeBitSet, setBit, checkBit } from '../utils/bitset';
1415

1516
import type {
1617
Profile,
@@ -36,14 +37,14 @@ export type CompactedProfileWithTranslationMaps = {
3637
};
3738

3839
type ReferencedProfileData = {
39-
referencedStacks: Uint8Array;
40-
referencedFrames: Uint8Array;
41-
referencedFuncs: Uint8Array;
42-
referencedResources: Uint8Array;
43-
referencedNativeSymbols: Uint8Array;
44-
referencedSources: Uint8Array;
45-
referencedStrings: Uint8Array;
46-
referencedLibs: Uint8Array;
40+
referencedStacks: BitSet;
41+
referencedFrames: BitSet;
42+
referencedFuncs: BitSet;
43+
referencedResources: BitSet;
44+
referencedNativeSymbols: BitSet;
45+
referencedSources: BitSet;
46+
referencedStrings: BitSet;
47+
referencedLibs: BitSet;
4748
};
4849

4950
type TranslationMaps = {
@@ -99,14 +100,14 @@ function _gatherReferencesInProfile(
99100
): ReferencedProfileData {
100101
const { shared, threads } = profile;
101102
const referencedSharedData: ReferencedProfileData = {
102-
referencedStacks: new Uint8Array(shared.stackTable.length),
103-
referencedFrames: new Uint8Array(shared.frameTable.length),
104-
referencedFuncs: new Uint8Array(shared.funcTable.length),
105-
referencedResources: new Uint8Array(shared.resourceTable.length),
106-
referencedNativeSymbols: new Uint8Array(shared.nativeSymbols.length),
107-
referencedSources: new Uint8Array(shared.sources.length),
108-
referencedLibs: new Uint8Array(profile.libs.length),
109-
referencedStrings: new Uint8Array(shared.stringArray.length),
103+
referencedStacks: makeBitSet(shared.stackTable.length),
104+
referencedFrames: makeBitSet(shared.frameTable.length),
105+
referencedFuncs: makeBitSet(shared.funcTable.length),
106+
referencedResources: makeBitSet(shared.resourceTable.length),
107+
referencedNativeSymbols: makeBitSet(shared.nativeSymbols.length),
108+
referencedSources: makeBitSet(shared.sources.length),
109+
referencedLibs: makeBitSet(profile.libs.length),
110+
referencedStrings: makeBitSet(shared.stringArray.length),
110111
};
111112

112113
// This is the "marking" phase of profile compaction. We want to mark
@@ -344,7 +345,7 @@ function _gatherReferencesInStackCol(
344345
for (let i = 0; i < stackCol.length; i++) {
345346
const stack = stackCol[i];
346347
if (stack !== null) {
347-
referencedStacks[stack] = 1;
348+
setBit(referencedStacks, stack);
348349
}
349350
}
350351
}
@@ -372,7 +373,7 @@ function _gatherReferencesInMarkers(
372373
) {
373374
const { referencedStacks, referencedStrings } = references;
374375
for (let i = 0; i < markers.length; i++) {
375-
referencedStrings[markers.name[i]] = 1;
376+
setBit(referencedStrings, markers.name[i]);
376377

377378
const data = markers.data[i];
378379
if (!data) {
@@ -382,7 +383,7 @@ function _gatherReferencesInMarkers(
382383
if ('cause' in data && data.cause) {
383384
const stack = data.cause.stack;
384385
if (stack !== null) {
385-
referencedStacks[stack] = 1;
386+
setBit(referencedStacks, stack);
386387
}
387388
}
388389

@@ -394,7 +395,7 @@ function _gatherReferencesInMarkers(
394395
for (const fieldKey of stringIndexMarkerFields) {
395396
const stringIndex = (data as any)[fieldKey];
396397
if (typeof stringIndex === 'number') {
397-
referencedStrings[stringIndex] = 1;
398+
setBit(referencedStrings, stringIndex);
398399
}
399400
}
400401
}
@@ -466,15 +467,15 @@ function _gatherReferencesInStackTable(
466467
) {
467468
const { referencedStacks, referencedFrames } = references;
468469
for (let i = stackTable.length - 1; i >= 0; i--) {
469-
if (referencedStacks[i] === 0) {
470+
if (!checkBit(referencedStacks, i)) {
470471
continue;
471472
}
472473

473474
const prefix = stackTable.prefix[i];
474475
if (prefix !== null) {
475-
referencedStacks[prefix] = 1;
476+
setBit(referencedStacks, prefix);
476477
}
477-
referencedFrames[stackTable.frame[i]] = 1;
478+
setBit(referencedFrames, stackTable.frame[i]);
478479
}
479480
}
480481

@@ -487,7 +488,7 @@ function _createCompactedStackTable(
487488
translationMaps;
488489
const newStackTable = getEmptyRawStackTable();
489490
for (let i = 0; i < stackTable.length; i++) {
490-
if (referencedStacks[i] === 0) {
491+
if (!checkBit(referencedStacks, i)) {
491492
continue;
492493
}
493494

@@ -512,15 +513,15 @@ function _gatherReferencesInFrameTable(
512513
const { referencedFrames, referencedFuncs, referencedNativeSymbols } =
513514
references;
514515
for (let i = 0; i < frameTable.length; i++) {
515-
if (referencedFrames[i] === 0) {
516+
if (!checkBit(referencedFrames, i)) {
516517
continue;
517518
}
518519

519-
referencedFuncs[frameTable.func[i]] = 1;
520+
setBit(referencedFuncs, frameTable.func[i]);
520521

521522
const nativeSymbol = frameTable.nativeSymbol[i];
522523
if (nativeSymbol !== null) {
523-
referencedNativeSymbols[nativeSymbol] = 1;
524+
setBit(referencedNativeSymbols, nativeSymbol);
524525
}
525526
}
526527
}
@@ -537,7 +538,7 @@ function _createCompactedFrameTable(
537538
} = translationMaps;
538539
const newFrameTable = getEmptyFrameTable();
539540
for (let i = 0; i < frameTable.length; i++) {
540-
if (referencedFrames[i] === 0) {
541+
if (!checkBit(referencedFrames, i)) {
541542
continue;
542543
}
543544

@@ -575,20 +576,20 @@ function _gatherReferencesInFuncTable(
575576
referencedResources,
576577
} = references;
577578
for (let i = 0; i < funcTable.length; i++) {
578-
if (referencedFuncs[i] === 0) {
579+
if (!checkBit(referencedFuncs, i)) {
579580
continue;
580581
}
581582

582-
referencedStrings[funcTable.name[i]] = 1;
583+
setBit(referencedStrings, funcTable.name[i]);
583584

584585
const source = funcTable.source[i];
585586
if (source !== null) {
586-
referencedSources[source] = 1;
587+
setBit(referencedSources, source);
587588
}
588589

589590
const resource = funcTable.resource[i];
590591
if (resource !== -1) {
591-
referencedResources[resource] = 1;
592+
setBit(referencedResources, resource);
592593
}
593594
}
594595
}
@@ -606,7 +607,7 @@ function _createCompactedFuncTable(
606607
} = translationMaps;
607608
const newFuncTable = getEmptyFuncTable();
608609
for (let i = 0; i < funcTable.length; i++) {
609-
if (referencedFuncs[i] === 0) {
610+
if (!checkBit(referencedFuncs, i)) {
610611
continue;
611612
}
612613

@@ -637,20 +638,20 @@ function _gatherReferencesInResourceTable(
637638
) {
638639
const { referencedResources, referencedStrings, referencedLibs } = references;
639640
for (let i = 0; i < resourceTable.length; i++) {
640-
if (referencedResources[i] === 0) {
641+
if (!checkBit(referencedResources, i)) {
641642
continue;
642643
}
643644

644-
referencedStrings[resourceTable.name[i]] = 1;
645+
setBit(referencedStrings, resourceTable.name[i]);
645646

646647
const host = resourceTable.host[i];
647648
if (host !== null) {
648-
referencedStrings[host] = 1;
649+
setBit(referencedStrings, host);
649650
}
650651

651652
const lib = resourceTable.lib[i];
652653
if (lib !== null) {
653-
referencedLibs[lib] = 1;
654+
setBit(referencedLibs, lib);
654655
}
655656
}
656657
}
@@ -667,7 +668,7 @@ function _createCompactedResourceTable(
667668
} = translationMaps;
668669
const newResourceTable = getEmptyResourceTable();
669670
for (let i = 0; i < resourceTable.length; i++) {
670-
if (referencedResources[i] === 0) {
671+
if (!checkBit(referencedResources, i)) {
671672
continue;
672673
}
673674

@@ -696,12 +697,12 @@ function _gatherReferencesInNativeSymbols(
696697
const { referencedNativeSymbols, referencedStrings, referencedLibs } =
697698
references;
698699
for (let i = 0; i < nativeSymbols.length; i++) {
699-
if (referencedNativeSymbols[i] === 0) {
700+
if (!checkBit(referencedNativeSymbols, i)) {
700701
continue;
701702
}
702703

703-
referencedStrings[nativeSymbols.name[i]] = 1;
704-
referencedLibs[nativeSymbols.libIndex[i]] = 1;
704+
setBit(referencedStrings, nativeSymbols.name[i]);
705+
setBit(referencedLibs, nativeSymbols.libIndex[i]);
705706
}
706707
}
707708

@@ -717,7 +718,7 @@ function _createCompactedNativeSymbols(
717718
} = translationMaps;
718719
const newNativeSymbols = getEmptyNativeSymbolTable();
719720
for (let i = 0; i < nativeSymbols.length; i++) {
720-
if (referencedNativeSymbols[i] === 0) {
721+
if (!checkBit(referencedNativeSymbols, i)) {
721722
continue;
722723
}
723724

@@ -741,14 +742,15 @@ function _gatherReferencesInSources(
741742
) {
742743
const { referencedSources, referencedStrings } = references;
743744
for (let i = 0; i < sources.length; i++) {
744-
if (referencedSources[i] === 0) {
745+
if (!checkBit(referencedSources, i)) {
745746
continue;
746747
}
747748

748-
referencedStrings[sources.filename[i]] = 1;
749+
setBit(referencedStrings, sources.filename[i]);
749750

750751
const sourceMapURL = sources.sourceMapURL[i];
751752
if (sourceMapURL !== null) {
753+
setBit(referencedStrings, sourceMapURL);
752754
referencedStrings[sourceMapURL] = 1;
753755
}
754756
}
@@ -763,7 +765,7 @@ function _createCompactedSources(
763765
translationMaps;
764766
const newSources = getEmptySourceTable();
765767
for (let i = 0; i < sources.length; i++) {
766-
if (referencedSources[i] === 0) {
768+
if (!checkBit(referencedSources, i)) {
767769
continue;
768770
}
769771

@@ -798,7 +800,7 @@ function _createCompactedStringArray(
798800
let nextIndex = 0;
799801
const newStringArray = [];
800802
for (let i = 0; i < stringArray.length; i++) {
801-
if (referencedStrings[i] === 0) {
803+
if (!checkBit(referencedStrings, i)) {
802804
continue;
803805
}
804806

@@ -820,7 +822,7 @@ function _createCompactedLibs(
820822
let nextIndex = 0;
821823
const newLibs = [];
822824
for (let i = 0; i < libs.length; i++) {
823-
if (referencedLibs[i] === 0) {
825+
if (!checkBit(referencedLibs, i)) {
824826
continue;
825827
}
826828

src/test/unit/sanitize.test.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -755,7 +755,7 @@ describe('sanitizePII', function () {
755755
cause: {
756756
tid: 1112,
757757
time: 1.0,
758-
stack: 0,
758+
stack: null,
759759
},
760760
},
761761
],
@@ -773,7 +773,7 @@ describe('sanitizePII', function () {
773773
cause: {
774774
tid: 1113,
775775
time: 1.0,
776-
stack: 0,
776+
stack: null,
777777
},
778778
},
779779
],

0 commit comments

Comments
 (0)