From c91e39a6386e87666a38121ab50407dfb2f2eb70 Mon Sep 17 00:00:00 2001 From: LiYuxi Date: Fri, 17 May 2024 10:20:08 +0800 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20=E7=81=AB=E7=84=B0=E5=9B=BE?= =?UTF-8?q?=E5=86=85=E6=A0=B8=E5=87=BD=E6=95=B0=E7=8B=AC=E7=AB=8B=E6=98=BE?= =?UTF-8?q?=E7=A4=BA?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: LiYuxi --- .../component/trace/sheet/TabPaneFilter.html.ts | 1 + .../trace/component/trace/sheet/TabPaneFilter.ts | 4 ++-- .../component/trace/sheet/hiperf/TabPerfProfile.ts | 10 +++++++++- .../logic-worker/ProcedureLogicWorkerPerf.ts | 13 +++++++++++++ 4 files changed, 25 insertions(+), 3 deletions(-) diff --git a/ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts b/ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts index fd517a1c0..e623bed03 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;
Hide Event
Hide Thread
Hide Thread State
+
Only Kernel
Options diff --git a/ide/src/trace/component/trace/sheet/TabPaneFilter.ts b/ide/src/trace/component/trace/sheet/TabPaneFilter.ts index 0979ad029..50496fdef 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 55378e113..3c6156f4b 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts @@ -34,7 +34,8 @@ import { TabPerfProfileHtml } from './TabPerfProfile.html'; const InvertOptionIndex: number = 0; const hideThreadOptionIndex: number = 3; const hideThreadStateOptionIndex: number = 4; -const callTreeValueNoSample: number[] = [InvertOptionIndex, hideThreadOptionIndex, hideThreadStateOptionIndex]; +const isOnlyKernelOptionIndex: number = 5; +const callTreeValueNoSample: number[] = [InvertOptionIndex, hideThreadOptionIndex, hideThreadStateOptionIndex, isOnlyKernelOptionIndex]; @element('tabpane-perf-profile') export class TabpanePerfProfile extends BaseElement { @@ -650,6 +651,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 +673,12 @@ 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 diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts index 25d5d140d..7f9f4f93a 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts @@ -25,6 +25,7 @@ import { PerfBottomUpStruct } from '../../bean/PerfBottomUpStruct'; import { SelectionParam } from '../../bean/BoxSelection'; const systemRuleName: string = '/system/'; +const kernelRuleName: string = '/kernel/'; const numRuleName: string = '/max/min/'; const maxDepth: number = 256; @@ -693,6 +694,15 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { }); } + onlyKernel(): void { + this.allProcess.forEach((item: PerfCallChainMerageData): void => { + item.children = []; + this.recursionChargeByRule(item, kernelRuleName, (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 => { @@ -855,6 +865,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; -- Gitee From e2463c93881cb20f89dc4069e5ed7a986fdecb54 Mon Sep 17 00:00:00 2001 From: LiYuxi Date: Tue, 28 May 2024 20:11:52 +0800 Subject: [PATCH 2/3] =?UTF-8?q?bugfix:=20=E5=B9=B3=E7=BA=A7=E5=86=85?= =?UTF-8?q?=E6=A0=B8=E5=87=BD=E6=95=B0=E8=87=AA=E5=8A=A8=E8=81=9A=E5=90=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: LiYuxi --- .../trace/sheet/hiperf/TabPerfProfile.ts | 9 ++- .../logic-worker/ProcedureLogicWorkerPerf.ts | 57 +++++++++++++++++-- 2 files changed, 61 insertions(+), 5 deletions(-) diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts index 3c6156f4b..ec160531c 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts @@ -32,10 +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 isOnlyKernelOptionIndex: number = 5; -const callTreeValueNoSample: number[] = [InvertOptionIndex, hideThreadOptionIndex, hideThreadStateOptionIndex, isOnlyKernelOptionIndex]; +const callTreeValueNoSample: number[] = [InvertOptionIndex, hideSystemLibraryOptionIndex, hideThreadOptionIndex, hideThreadStateOptionIndex, isOnlyKernelOptionIndex]; @element('tabpane-perf-profile') export class TabpanePerfProfile extends BaseElement { @@ -693,6 +694,12 @@ export class TabpanePerfProfile extends BaseElement { funcName: 'resetAllNode', funcArgs: [], }); + if (isOnlyKernel) { + 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 7f9f4f93a..4020c6408 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts @@ -25,7 +25,6 @@ import { PerfBottomUpStruct } from '../../bean/PerfBottomUpStruct'; import { SelectionParam } from '../../bean/BoxSelection'; const systemRuleName: string = '/system/'; -const kernelRuleName: string = '/kernel/'; const numRuleName: string = '/max/min/'; const maxDepth: number = 256; @@ -256,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 @@ -277,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 @@ -697,7 +702,21 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { onlyKernel(): void { this.allProcess.forEach((item: PerfCallChainMerageData): void => { item.children = []; - this.recursionChargeByRule(item, kernelRuleName, (node: PerfCallChainMerageData): boolean => { + + 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]' }) }) @@ -767,6 +786,33 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { }); } + kernelCombination(): void { + function mergeChildren(item: PerfCallChainMerageData) { + if (item.children.length > 0) { + 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 => { @@ -900,6 +946,9 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { return this.combineCallChainForAnalysis(); case 'getBottomUp': return this.getBottomUp(); + case 'kernelCombination': + this.kernelCombination(); + break; } return []; } -- Gitee From cfad21b039acc87930020d160801ad7b4780501a Mon Sep 17 00:00:00 2001 From: LiYuxi Date: Tue, 4 Jun 2024 09:35:53 +0800 Subject: [PATCH 3/3] =?UTF-8?q?fix:=20=E9=99=8D=E4=BD=8E=E5=B5=8C=E5=A5=97?= =?UTF-8?q?=E5=B1=82=E7=BA=A7=20=E5=A2=9E=E5=8A=A0=E9=83=A8=E5=88=86?= =?UTF-8?q?=E6=B3=A8=E9=87=8A?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: LiYuxi --- .../trace/sheet/hiperf/TabPerfProfile.ts | 3 ++ .../logic-worker/ProcedureLogicWorkerPerf.ts | 33 ++++++++++--------- 2 files changed, 20 insertions(+), 16 deletions(-) diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts index ec160531c..6b2d05e0f 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPerfProfile.ts @@ -675,6 +675,7 @@ export class TabpanePerfProfile extends BaseElement { }); } // @ts-ignore if (isOnlyKernel) { + // 用于筛选内核函数 perfProfileArgs.push({ funcName: 'onlyKernel', funcArgs: [], @@ -695,6 +696,8 @@ export class TabpanePerfProfile extends BaseElement { funcArgs: [], }); if (isOnlyKernel) { + // 用于二次合并同级同名内核函数 + // 间隔其他筛选类操作 不可以和上面另一个if合并 perfProfileArgs.push({ funcName: 'kernelCombination', funcArgs: [], diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts index 4020c6408..a79d7542e 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts @@ -788,24 +788,25 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { kernelCombination(): void { function mergeChildren(item: PerfCallChainMerageData) { - if (item.children.length > 0) { - 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 - } + 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) } + total.push(pfcall) + return total + }, [] as PerfCallChainMerageData[]) + for (const child of item.children) { + mergeChildren(child) } } this.allProcess.forEach((item: PerfCallChainMerageData): void => { -- Gitee