diff --git a/ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts b/ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts
index fd517a1c0316d923fec0ac6defe16918dc48600f..e623bed0374debb0f6f001e3278429f32a39a24c 100644
--- a/ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts
+++ b/ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts
@@ -268,6 +268,7 @@ margin-left: 15px;
+
Options
diff --git a/ide/src/trace/component/trace/sheet/TabPaneFilter.ts b/ide/src/trace/component/trace/sheet/TabPaneFilter.ts
index 0979ad0299a04850c229c7f823eec420a44b6c2d..50496fdefb1288d1dfb1569f3864495659b976bd 100644
--- a/ide/src/trace/component/trace/sheet/TabPaneFilter.ts
+++ b/ide/src/trace/component/trace/sheet/TabPaneFilter.ts
@@ -470,7 +470,7 @@ export class TabPaneFilter extends BaseElement {
private treeCheckClickSwitch(idx: number, check: boolean, row: NodeListOf): void {
let checkList = [];
- for (let index = 0; index < 5; index++) {
+ for (let index = 0; index < 6; index++) {
if (idx === index) {
checkList.push(check);
} else {
@@ -749,7 +749,7 @@ export class TabPaneFilter extends BaseElement {
let inputs = this.shadowRoot!.querySelectorAll('.constraints-input');
let check = this.shadowRoot!.querySelector('#constraints-check');
let data = {
- callTree: [row[0]!.checked, row[1]!.checked, row[2]!.checked, row[3]!.checked, row[4]!.checked],
+ callTree: [row[0]!.checked, row[1]!.checked, row[2]!.checked, row[3]!.checked, row[4]!.checked, row[5]!.checked],
callTreeConstraints: {
checked: check!.checked,
inputs: [inputs[0].value === '' ? '0' : inputs[0].value, inputs[1].value === '' ? '∞' : inputs[1].value],
diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts
index 55378e1138a7ec5cc2df9ff6289c8485d85f1c0d..6b2d05e0f5026e4191f78a6b1d1b2012c510b694 100644
--- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts
+++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts
@@ -32,9 +32,11 @@ import { LitHeadLine } from '../../../../../base-ui/headline/lit-headline';
import { TabPerfProfileHtml } from './TabPerfProfile.html';
const InvertOptionIndex: number = 0;
+const hideSystemLibraryOptionIndex: number = 1;
const hideThreadOptionIndex: number = 3;
const hideThreadStateOptionIndex: number = 4;
-const callTreeValueNoSample: number[] = [InvertOptionIndex, hideThreadOptionIndex, hideThreadStateOptionIndex];
+const isOnlyKernelOptionIndex: number = 5;
+const callTreeValueNoSample: number[] = [InvertOptionIndex, hideSystemLibraryOptionIndex, hideThreadOptionIndex, hideThreadStateOptionIndex, isOnlyKernelOptionIndex];
@element('tabpane-perf-profile')
export class TabpanePerfProfile extends BaseElement {
@@ -650,6 +652,7 @@ export class TabpanePerfProfile extends BaseElement {
let isHideSystemLibrary: boolean = filterData.callTree[1]; // @ts-ignore
let isHideThread: boolean = filterData.callTree[3]; // @ts-ignore
let isHideThreadState: boolean = filterData.callTree[4]; // @ts-ignore
+ let isOnlyKernel: boolean = filterData.callTree[5]; // @ts-ignore
let list = filterData.dataMining.concat(filterData.dataLibrary);
perfProfileArgs.push({
funcName: 'hideThread',
@@ -671,6 +674,13 @@ export class TabpanePerfProfile extends BaseElement {
funcArgs: [],
});
} // @ts-ignore
+ if (isOnlyKernel) {
+ // 用于筛选内核函数
+ perfProfileArgs.push({
+ funcName: 'onlyKernel',
+ funcArgs: [],
+ });
+ } // @ts-ignore
if (filterData.callTreeConstraints.checked) {
perfProfileArgs.push({
funcName: 'hideNumMaxAndMin', // @ts-ignore
@@ -685,6 +695,14 @@ export class TabpanePerfProfile extends BaseElement {
funcName: 'resetAllNode',
funcArgs: [],
});
+ if (isOnlyKernel) {
+ // 用于二次合并同级同名内核函数
+ // 间隔其他筛选类操作 不可以和上面另一个if合并
+ perfProfileArgs.push({
+ funcName: 'kernelCombination',
+ funcArgs: [],
+ });
+ } // @ts-ignore
this.refreshAllNodeExtend(perfProfileArgs);
}
diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts
index 25d5d140d2e8f244dd67f1ee6441b8cc8b758919..a79d7542e817c1cadf9d22647f02b93149541f6f 100644
--- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts
+++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts
@@ -255,12 +255,17 @@ export class ProcedureLogicWorkerPerf extends LogicHandler {
let hideThreadStateFilter = params.filter(
(item: { funcName: string }): boolean => item.funcName === 'hideThreadState'
);
+ //@ts-ignore
+ let onlyKernelFilter = params.filter(
+ (item: { funcName: string }): boolean => item.funcName === 'onlyKernel'
+ );
if (this.lib) {
if (
callChainsFilter.length > 0 ||
isHideSystemSoFilter.length > 0 ||
hideThreadFilter.length > 0 ||
- hideThreadStateFilter.length > 0
+ hideThreadStateFilter.length > 0 ||
+ onlyKernelFilter.length > 0
) {
this.samplesData = this.combineCallChainForAnalysis(this.lib);
//@ts-ignore
@@ -276,7 +281,8 @@ export class ProcedureLogicWorkerPerf extends LogicHandler {
callChainsFilter.length > 0 ||
isHideSystemSoFilter.length > 0 ||
hideThreadFilter.length > 0 ||
- hideThreadStateFilter.length > 0
+ hideThreadStateFilter.length > 0 ||
+ onlyKernelFilter.length > 0
) {
this.samplesData = this.combineCallChainForAnalysis(this.symbol);
//@ts-ignore
@@ -693,6 +699,29 @@ export class ProcedureLogicWorkerPerf extends LogicHandler {
});
}
+ onlyKernel(): void {
+ this.allProcess.forEach((item: PerfCallChainMerageData): void => {
+ item.children = [];
+
+ function recursionHideChildren(
+ sample: PerfCallChainMerageData,
+ rule: (node: PerfCallChainMerageData) => boolean
+ ): void {
+ if (sample.initChildren.length > 0) {
+ sample.initChildren.forEach((child): void => {
+ if (rule(child)) {
+ child.isStore++;
+ }
+ recursionHideChildren(child, rule);
+ });
+ }
+ }
+ recursionHideChildren(item, (node: PerfCallChainMerageData): boolean => {
+ return node.libName !== '[kernel.kallsyms]'
+ })
+ })
+ }
+
hideNumMaxAndMin(startNum: number, endNum: string): void {
let max = endNum === '∞' ? Number.POSITIVE_INFINITY : parseInt(endNum);
this.allProcess.forEach((item: PerfCallChainMerageData): void => {
@@ -757,6 +786,34 @@ export class ProcedureLogicWorkerPerf extends LogicHandler {
});
}
+ kernelCombination(): void {
+ function mergeChildren(item: PerfCallChainMerageData) {
+ if (item.children.length <= 0) {
+ return
+ }
+ item.children = item.children.reduce((total: PerfCallChainMerageData[], pfcall: PerfCallChainMerageData): PerfCallChainMerageData[] => {
+ for (const prev of total) {
+ if (pfcall.symbol == prev.symbol) {
+ prev.children.push(...pfcall.children)
+ prev.total += pfcall.total
+ prev.count += pfcall.count
+ prev.totalEvent += pfcall.totalEvent
+ prev.eventCount += pfcall.eventCount
+ return total
+ }
+ }
+ total.push(pfcall)
+ return total
+ }, [] as PerfCallChainMerageData[])
+ for (const child of item.children) {
+ mergeChildren(child)
+ }
+ }
+ this.allProcess.forEach((item: PerfCallChainMerageData): void => {
+ mergeChildren(item)
+ })
+ }
+
findSearchNode(sampleArray: PerfCallChainMerageData[], search: string, parentSearch: boolean): void {
search = search.toLocaleLowerCase();
sampleArray.forEach((sample: PerfCallChainMerageData): void => {
@@ -855,6 +912,9 @@ export class ProcedureLogicWorkerPerf extends LogicHandler {
case 'hideThreadState':
this.isHideThreadState = funcArgs[0] as boolean;
break;
+ case 'onlyKernel':
+ this.onlyKernel();
+ break;
case 'hideNumMaxAndMin':
this.hideNumMaxAndMin(funcArgs[0] as number, funcArgs[1] as string);
break;
@@ -887,6 +947,9 @@ export class ProcedureLogicWorkerPerf extends LogicHandler {
return this.combineCallChainForAnalysis();
case 'getBottomUp':
return this.getBottomUp();
+ case 'kernelCombination':
+ this.kernelCombination();
+ break;
}
return [];
}