From 10b9eec018d51eef620a497cb5d4f341e7109415 Mon Sep 17 00:00:00 2001 From: zhangzepeng Date: Wed, 3 Jan 2024 21:19:25 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=98proto=E7=89=88=E6=9C=AC=E8=A6=86?= =?UTF-8?q?=E7=9B=96=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangzepeng --- ide/developtools_smartperf_host | 1 + ide/package.json | 34 +- ide/src/base-ui/menu/LitMainMenu.ts | 2 +- ide/src/base-ui/select/LitSelect.ts | 4 +- ide/src/base-ui/table/LitPageTable.ts | 1 + ide/src/base-ui/table/lit-table.ts | 162 +- ide/src/base-ui/utils/CSVFormater.ts | 20 +- ide/src/doc/compile_trace_streamer.html | 2 +- ide/src/doc/des_binder.html | 2 +- ide/src/doc/des_stat.html | 2 +- ide/src/doc/des_support_event.html | 2 +- ide/src/doc/des_tables.html | 2 +- ide/src/doc/des_wakup.html | 2 +- ide/src/doc/md/des_tables.md | 904 ++++---- ...quickstart_Application_operation_skills.md | 46 +- .../doc/md/quickstart_ability_monitor.html | 2 +- ide/src/doc/md/quickstart_animation.md | 26 +- ide/src/doc/md/quickstart_app_startup.md | 44 +- ide/src/doc/md/quickstart_hilog.md | 20 +- ide/src/doc/md/quickstart_hiperf.md | 86 +- ide/src/doc/md/quickstart_hisystemevent.md | 44 +- .../doc/md/quickstart_keywords_shortcuts.md | 2 +- ide/src/doc/md/quickstart_native_memory.md | 120 +- ide/src/doc/md/quickstart_parsing_ability.md | 36 +- ide/src/doc/md/quickstart_systemtrace.md | 83 +- ide/src/doc/md/quickstart_taskpool.md | 40 +- ...ickstart_Application_operation_skills.html | 2 +- ide/src/doc/quickstart_Frametimeline.html | 2 +- ide/src/doc/quickstart_Import_so.html | 2 +- ide/src/doc/quickstart_Js_memory.html | 2 +- ide/src/doc/quickstart_ability_monitor.html | 2 +- ide/src/doc/quickstart_animation.html | 2 +- ide/src/doc/quickstart_app_startup.html | 2 +- ide/src/doc/quickstart_arkts.html | 2 +- ide/src/doc/quickstart_bio.html | 6 +- ide/src/doc/quickstart_device_record.html | 2 +- ide/src/doc/quickstart_filesystem.html | 6 +- ide/src/doc/quickstart_hilog.html | 2 +- ide/src/doc/quickstart_hiperf.html | 4 +- ide/src/doc/quickstart_hisystemevent.html | 2 +- .../doc/quickstart_keywords_shortcuts.html | 2 +- ide/src/doc/quickstart_memory_template.html | 2 +- ide/src/doc/quickstart_native_memory.html | 2 +- ide/src/doc/quickstart_page_fault.html | 2 +- ide/src/doc/quickstart_parsing_ability.html | 2 +- .../doc/quickstart_schedulinganalysis.html | 2 +- ide/src/doc/quickstart_sdk.html | 2 +- ...ickstart_smartperflinux_compile_guide.html | 2 +- ide/src/doc/quickstart_sql_metrics.html | 2 +- ide/src/doc/quickstart_systemtrace.html | 2 +- ide/src/doc/quickstart_taskpool.html | 2 +- ide/src/doc/quickstart_web_record.html | 2 +- ide/src/figures/deploy/chomd+x.png | Bin 0 -> 47605 bytes ide/src/figures/deploy/put_bin.png | Bin 0 -> 7684 bytes ide/src/index.ts | 27 +- ide/src/js-heap/LoadDatabase.ts | 4 +- .../statistics/util/SpStatisticsHttpUtil.ts | 1 + ide/src/trace/SpApplication.ts | 152 +- ide/src/trace/bean/BoxSelection.ts | 14 +- ide/src/trace/bean/FuncStruct.ts | 1 + ide/src/trace/bean/JsStruct.ts | 37 +- ide/src/trace/bean/KeyPathStruct.ts | 1 + ide/src/trace/bean/ProcessMemStruct.ts | 2 +- ide/src/trace/bean/ThreadStruct.ts | 1 + ide/src/trace/bean/WakeupBean.ts | 2 + ide/src/trace/component/SpHelp.ts | 1 - ide/src/trace/component/SpRecordTrace.ts | 3 + ide/src/trace/component/SpSystemTrace.ts | 1370 ++++++------ ide/src/trace/component/Utils.ts | 7 +- .../trace/component/chart/PerfDataQuery.ts | 7 +- .../component/chart/SpAbilityMonitorChart.ts | 667 +++--- .../trace/component/chart/SpAllAppStartups.ts | 2 +- ide/src/trace/component/chart/SpArkTsChart.ts | 101 +- .../trace/component/chart/SpChartManager.ts | 41 +- ide/src/trace/component/chart/SpClockChart.ts | 32 +- ide/src/trace/component/chart/SpCpuChart.ts | 44 +- .../{SpFileSystemChart.ts => SpEBPFChart.ts} | 111 +- ide/src/trace/component/chart/SpFpsChart.ts | 2 +- .../trace/component/chart/SpFrameTimeChart.ts | 346 ++- ide/src/trace/component/chart/SpFreqChart.ts | 60 +- ide/src/trace/component/chart/SpHiPerf.ts | 313 +-- .../component/chart/SpHiSysEnergyChart.ts | 276 +-- .../component/chart/SpHiSysEventChart.ts | 20 +- ide/src/trace/component/chart/SpIrqChart.ts | 30 +- ide/src/trace/component/chart/SpLogChart.ts | 21 +- .../component/chart/SpNativeMemoryChart.ts | 73 +- .../trace/component/chart/SpProcessChart.ts | 489 +++-- ide/src/trace/component/chart/SpSdkChart.ts | 8 +- .../component/chart/SpSegmentationChart.ts | 916 ++++---- .../component/chart/SpVirtualMemChart.ts | 23 +- .../trace/component/chart/SpVmTrackerChart.ts | 292 +-- ide/src/trace/component/chart/VSync.ts | 5 +- .../SpSchedulingAnalysis.ts | 2 +- .../schedulingAnalysis/TabCpuAnalysis.ts | 2 +- .../TabCpuDetailsFrequency.ts | 2 +- .../schedulingAnalysis/TabCpuDetailsIdle.ts | 2 +- .../schedulingAnalysis/TabCpuDetailsIrq.ts | 2 +- .../TabCpuDetailsThreads.ts | 2 +- .../Top20FrequencyThread.ts | 2 +- .../Top20ProcessSwitchCount.ts | 2 +- .../Top20ProcessThreadCount.ts | 2 +- .../schedulingAnalysis/Top20ThreadCpuUsage.ts | 2 +- .../schedulingAnalysis/Top20ThreadRunTime.ts | 2 +- .../trace/component/setting/SpProbesConfig.ts | 18 +- .../component/setting/SpRecordSetting.ts | 4 +- .../component/setting/SpRecordTemplate.ts | 2 +- .../trace/component/setting/SpSdkConfig.ts | 2 +- ide/src/trace/component/trace/SpChartList.ts | 7 +- .../trace/component/trace/base/ColorUtils.ts | 11 +- .../trace/component/trace/base/Extension.ts | 10 + .../trace/component/trace/base/RangeSelect.ts | 28 +- .../trace/component/trace/base/TraceRow.ts | 127 +- .../component/trace/base/TraceRowConfig.ts | 14 +- .../trace/component/trace/base/TraceSheet.ts | 113 +- .../component/trace/base/TraceSheetConfig.ts | 6 +- ide/src/trace/component/trace/base/Utils.ts | 13 +- .../trace/component/trace/search/Search.ts | 50 +- .../component/trace/sheet/TabPaneCurrent.ts | 3 +- .../trace/sheet/TabPaneCurrentSelection.ts | 127 +- .../sheet/ability/TabPaneMemoryAbility.ts | 2 +- .../trace/sheet/ark-ts/TabPaneComparison.ts | 4 +- .../trace/sheet/ark-ts/TabPaneJsCpu.ts | 4 +- .../sheet/ark-ts/TabPaneJsCpuStatistics.ts | 3 +- .../trace/sheet/ark-ts/TabPaneSummary.ts | 4 +- .../sheet/binder/TabPaneBinderDataCut.ts | 57 +- .../trace/sheet/clock/TabPaneClockCounter.ts | 9 +- .../trace/sheet/cpu/TabPaneCounterSample.ts | 2 +- .../trace/sheet/cpu/TabPaneFrequencySample.ts | 3 +- .../component/trace/sheet/cpu/TabPanePTS.ts | 2 +- .../component/trace/sheet/cpu/TabPaneSPT.ts | 2 +- .../trace/sheet/cpu/TabPaneSchedPriority.ts | 2 +- .../sheet/file-system/TabPaneCallTree.ts | 2 +- .../trace/sheet/frame/TabFrameSpacing.ts | 4 +- .../trace/sheet/freq/TabPaneCpuFreqLimits.ts | 16 +- .../sheet/frequsage/TabPaneFreqDataCut.ts | 1936 +++++++---------- .../sheet/gpufreq/tabPaneGpufreqDataCut.ts | 145 +- .../sheet/gpufreq/tabPaneGpufreqUsage.ts | 4 +- .../trace/sheet/hilog/TabPaneHiLogSummary.ts | 2 +- .../trace/sheet/hilog/TabPaneHiLogs.ts | 17 +- .../trace/sheet/hiperf/TabPerfSampleList.ts | 5 +- .../hisysevent/TabPaneHiSysEventSummary.ts | 3 +- .../sheet/hisysevent/TabPaneHisysEvents.ts | 16 +- .../trace/sheet/irq/TabPaneIrqCounter.ts | 168 +- .../sheet/native-memory/TabPaneNMCallTree.ts | 10 +- .../native-memory/TabPaneNMSampleList.ts | 2 +- .../TabPaneNMStatisticAnalysis.ts | 2 +- .../sheet/native-memory/TabPaneNMemory.ts | 4 +- .../sheet/process/TabPaneThreadStates.ts | 163 +- .../trace/sheet/process/TabPaneThreadUsage.ts | 1 + .../sheet/schedswitch/TabPaneSchedSwitch.ts | 91 +- .../trace/sheet/smaps/TabPaneSmapsSample.ts | 8 +- .../component/trace/timer-shaft/RangeRuler.ts | 32 +- .../trace/timer-shaft/TabPaneFlag.ts | 1 - ide/src/trace/database/Procedure.ts | 2 - ide/src/trace/database/SqlLite.ts | 952 ++++++-- ide/src/trace/database/TraceWorker.ts | 54 +- .../data-trafic/AbilityMonitorReceiver.ts | 268 +++ .../data-trafic/AbilityMonitorSender.ts | 231 ++ .../database/data-trafic/AllMemoryCache.ts | 61 + .../database/data-trafic/ArkTsReceiver.ts | 539 +++++ .../trace/database/data-trafic/ArkTsSender.ts | 76 + .../database/data-trafic/ClockDataReceiver.ts | 140 ++ .../database/data-trafic/ClockDataSender.ts | 73 + .../database/data-trafic/CpuDataReceiver.ts | 133 ++ .../database/data-trafic/CpuDataSender.ts | 110 + .../data-trafic/CpuFreqDataReceiver.ts | 123 ++ .../database/data-trafic/CpuFreqDataSender.ts | 66 + .../data-trafic/CpuFreqLimitDataReceiver.ts | 116 + .../data-trafic/CpuFreqLimitDataSender.ts | 75 + .../database/data-trafic/CpuStateReceiver.ts | 106 + .../database/data-trafic/CpuStateSender.ts | 65 + .../trace/database/data-trafic/DataFilter.ts | 203 ++ .../database/data-trafic/EBPFReceiver.ts | 207 ++ .../trace/database/data-trafic/EBPFSender.ts | 137 ++ .../data-trafic/EnergySysEventReceiver.ts | 366 ++++ .../data-trafic/EnergySysEventSender.ts | 206 ++ .../data-trafic/ExecProtoForWorker.ts | 145 ++ .../data-trafic/FrameDynamicEffectReceiver.ts | 302 +++ .../data-trafic/FrameDynamicEffectSender.ts | 208 ++ .../data-trafic/FrameJanksReceiver.ts | 404 ++++ .../database/data-trafic/FrameJanksSender.ts | 102 + .../database/data-trafic/FuncDataReceiver.ts | 123 ++ .../database/data-trafic/FuncDataSender.ts | 73 + .../data-trafic/HiSysEventDataReceiver.ts | 89 + .../data-trafic/HiSysEventDataSender.ts | 78 + .../data-trafic/HiperfCallChartReceiver.ts | 489 +++++ .../data-trafic/HiperfCallChartSender.ts | 112 + .../data-trafic/HiperfCpuDataReceiver.ts | 125 ++ .../data-trafic/HiperfCpuDataSender.ts | 83 + .../data-trafic/HiperfProcessDataReceiver.ts | 125 ++ .../data-trafic/HiperfProcessDataSender.ts | 83 + .../data-trafic/HiperfThreadDataReceiver.ts | 118 + .../data-trafic/HiperfThreadDataSender.ts | 83 + .../database/data-trafic/IrqDataReceiver.ts | 125 ++ .../database/data-trafic/IrqDataSender.ts | 69 + .../database/data-trafic/LogDataReceiver.ts | 96 + .../database/data-trafic/LogDataSender.ts | 74 + .../data-trafic/NativeMemoryDataReceiver.ts | 448 ++++ .../data-trafic/NativeMemoryDataSender.ts | 86 + .../data-trafic/ProcessActualDataReceiver.ts | 127 ++ .../data-trafic/ProcessActualDataSender.ts | 81 + .../data-trafic/ProcessDataReceiver.ts | 94 + .../database/data-trafic/ProcessDataSender.ts | 64 + .../ProcessDeliverInputEventDataReceiver.ts | 124 ++ .../ProcessDeliverInputEventDataSender.ts | 97 + .../ProcessExpectedDataReceiver.ts | 108 + .../data-trafic/ProcessExpectedDataSender.ts | 75 + .../data-trafic/ProcessMemDataReceiver.ts | 71 + .../data-trafic/ProcessMemDataSender.ts | 66 + .../data-trafic/ProcessSoInitDataReceiver.ts | 86 + .../data-trafic/ProcessSoInitDataSender.ts | 85 + .../data-trafic/ProcessStartupDataReceiver.ts | 84 + .../data-trafic/ProcessStartupDataSender.ts | 86 + .../trace/database/data-trafic/QueryEnum.ts | 104 + .../data-trafic/ThreadDataReceiver.ts | 133 ++ .../database/data-trafic/ThreadDataSender.ts | 82 + .../data-trafic/VirtualMemoryDataReceiver.ts | 70 + .../data-trafic/VirtualMemoryDataSender.ts | 76 + .../data-trafic/VmTrackerDataReceiver.ts | 329 +++ .../data-trafic/VmTrackerDataSender.ts | 398 ++++ .../logic-worker/ProcedureLogicWorker.ts | 9 + .../ProcedureLogicWorkerCommon.ts | 13 +- .../ProcedureLogicWorkerFileSystem.ts | 15 +- .../ProcedureLogicWorkerJsCpuProfiler.ts | 255 +-- .../ProcedureLogicWorkerNativeNemory.ts | 331 +-- .../logic-worker/ProcedureLogicWorkerPerf.ts | 216 +- .../database/ui-worker/ProcedureWorker.ts | 10 +- .../database/ui-worker/ProcedureWorkerCPU.ts | 56 +- .../ui-worker/ProcedureWorkerClock.ts | 3 +- .../ui-worker/ProcedureWorkerCommon.ts | 101 +- .../ui-worker/ProcedureWorkerCpuAbility.ts | 60 +- .../ui-worker/ProcedureWorkerCpuFreqLimits.ts | 134 +- .../ui-worker/ProcedureWorkerCpuProfiler.ts | 31 +- .../ui-worker/ProcedureWorkerCpuState.ts | 2 + .../ui-worker/ProcedureWorkerDiskIoAbility.ts | 2 + ...erFileSystem.ts => ProcedureWorkerEBPF.ts} | 324 ++- .../ui-worker/ProcedureWorkerEnergyAnomaly.ts | 50 +- .../ui-worker/ProcedureWorkerEnergyPower.ts | 104 +- .../ui-worker/ProcedureWorkerEnergyState.ts | 11 +- .../ui-worker/ProcedureWorkerEnergySystem.ts | 50 +- .../ProcedureWorkerFrameAnimation.ts | 11 +- .../ui-worker/ProcedureWorkerFrameDynamic.ts | 47 +- .../ui-worker/ProcedureWorkerFrameSpacing.ts | 46 +- .../database/ui-worker/ProcedureWorkerFreq.ts | 10 +- .../database/ui-worker/ProcedureWorkerFunc.ts | 35 +- .../database/ui-worker/ProcedureWorkerHeap.ts | 84 +- .../ui-worker/ProcedureWorkerHeapSnapshot.ts | 12 +- .../ui-worker/ProcedureWorkerHeapTimeline.ts | 13 +- .../ui-worker/ProcedureWorkerHiPerfCPU2.ts | 74 + .../ProcedureWorkerHiPerfCallChart.ts | 18 +- .../ProcedureWorkerHiPerfProcess2.ts | 66 + .../ui-worker/ProcedureWorkerHiPerfThread2.ts | 66 + .../ui-worker/ProcedureWorkerHiSysEvent.ts | 29 +- .../database/ui-worker/ProcedureWorkerIrq.ts | 11 +- .../database/ui-worker/ProcedureWorkerJank.ts | 11 +- .../database/ui-worker/ProcedureWorkerLog.ts | 8 +- .../database/ui-worker/ProcedureWorkerMem.ts | 10 +- .../ui-worker/ProcedureWorkerMemoryAbility.ts | 2 + .../ProcedureWorkerNetworkAbility.ts | 11 +- .../ProcedureWorkerPerfCallchains.ts | 1 + .../ui-worker/ProcedureWorkerProcess.ts | 2 + .../ui-worker/ProcedureWorkerSnapshot.ts | 16 +- .../ui-worker/ProcedureWorkerSoInit.ts | 1 + .../ui-worker/ProcedureWorkerThread.ts | 2 + .../ui-worker/ProcedureWorkerVirtualMemory.ts | 2 + ide/src/trace/proto/SphBaseData.js | 1054 ++++----- ide/src/trace/proto/SphBaseData.proto | 369 ++++ ide/src/trace/proto/common_types.proto | 58 - ide/src/trace/proto/profiler_service.proto | 47 - .../trace/proto/profiler_service_types.proto | 129 -- ide/test/base-ui/button/LitButton.test.ts | 4 +- .../chart/column/LitChartColumn.test.ts | 8 +- .../chart/pagenation/PageNation.test.ts | 8 +- .../chart/pagenation/pagination-box.test.ts | 5 +- .../base-ui/chart/pie/LitChartPie.test.ts | 10 +- .../base-ui/chart/pie/LitChartPieData.test.ts | 3 +- ide/test/base-ui/checkbox/LitCheckBox.test.ts | 3 +- .../checkbox/LitCheckBoxWithText.test.ts | 3 +- .../base-ui/checkbox/LitCheckGroup.test.ts | 3 +- ide/test/base-ui/drawer/LitDrawer.test.ts | 5 +- .../base-ui/headLine/Lit-headline.test.ts | 3 +- ide/test/base-ui/icon/LitIcon.test.ts | 3 +- ide/test/base-ui/menu/LitMainMenu.test.ts | 5 +- .../base-ui/menu/LitMainMenuGroup.test.ts | 3 +- ide/test/base-ui/menu/LitMainMenuItem.test.ts | 3 +- ide/test/base-ui/modal/LitModal.test.ts | 3 +- .../base-ui/popover/LitPopContent.test.ts | 2 +- ide/test/base-ui/popover/LitPopover.test.ts | 3 +- .../base-ui/popover/LitPopoverTitle.test.ts | 3 +- ide/test/base-ui/popover/LitPopoverV.test.ts | 3 +- .../progress-bar/LitProgressBar.test.ts | 3 +- ide/test/base-ui/radiobox/LitRadioBox.test.ts | 6 +- .../select/LitAllocationSelect.test.ts | 9 +- ide/test/base-ui/select/LitSelect.test.ts | 3 +- .../base-ui/select/LitSelectOption.test.ts | 3 +- ide/test/base-ui/select/LitSelectV.test.ts | 3 +- ide/test/base-ui/slice/lit-slicer.test.ts | 3 +- ide/test/base-ui/slider/LitSlider.test.ts | 3 +- ide/test/base-ui/switch/LitSwitch.test.ts | 3 +- ide/test/base-ui/table/LitTable.test.ts | 14 +- ide/test/base-ui/table/LitTableColumn.test.ts | 3 +- ide/test/base-ui/table/LitTableGroup.test.ts | 3 +- ide/test/base-ui/table/TableRowObject.test.ts | 3 +- ide/test/base-ui/tabs/LitTabpane.test.ts | 3 +- ide/test/base-ui/tabs/LitTabs.test.ts | 3 +- ide/test/base-ui/tree/LitTree.test.ts | 3 +- ide/test/base-ui/tree/LitTreeNode.test.ts | 7 +- ide/test/base-ui/tree/lit-tree-node.test.ts | 5 +- ide/test/command/Cmd.test.ts | 3 +- ide/test/hdc/HdcDeviceManager.test.ts | 3 +- ide/test/hdc/common/BaseConversion.test.ts | 3 +- ide/test/hdc/common/ObjectToMemory.test.ts | 3 +- ide/test/hdc/common/Serialize.test.ts | 3 +- ide/test/hdc/common/Utils.test.ts | 3 +- ide/test/hdc/hdcclient/AsyncQueue.test.ts | 3 +- ide/test/hdc/hdcclient/FormatCommand.test.ts | 6 +- ide/test/hdc/hdcclient/HdcClient.test.ts | 17 +- ide/test/hdc/message/DataMessage.test.ts | 3 +- ide/test/hdc/message/PayloadHead.test.ts | 3 +- ide/test/hdc/message/PayloadProtect.test.ts | 3 +- ide/test/hdc/message/SessionHandShake.test.ts | 3 +- ide/test/hdc/message/TransferConfig.test.ts | 3 +- ide/test/hdc/message/TransferPayload.test.ts | 3 +- ide/test/hdc/message/USBHead.test.ts | 3 +- .../hdc/transmission/DataProcessing.test.ts | 5 +- .../UsbTransmissionChannel.test.ts | 5 +- ide/test/js-heap/HeapDataInterface.test.ts | 12 +- ide/test/js-heap/logic/Allocation.test.ts | 8 +- ide/test/js-heap/logic/HeapLoader.test.ts | 12 +- ide/test/js-heap/model/DatabaseStruct.test.ts | 5 +- ide/test/js-heap/model/UiStruct.test.ts | 9 +- ide/test/js-heap/utils/Utils.test.ts | 14 +- ide/test/log/Log.test.ts | 3 +- ide/test/trace/SpApplication.test.ts | 9 +- ide/test/trace/bean/AbilityMonitor.test.ts | 8 +- ide/test/trace/bean/BaseStruct.test.ts | 3 +- ide/test/trace/bean/BoxSelection.test.ts | 3 +- ide/test/trace/bean/CpuFreqStruct.test.ts | 3 +- ide/test/trace/bean/CpuStruct.test.ts | 3 +- ide/test/trace/bean/CpuUsage.test.ts | 3 +- ide/test/trace/bean/EnergyStruct.test.ts | 3 +- ide/test/trace/bean/FpsStruct.test.ts | 7 +- ide/test/trace/bean/FuncStruct.test.ts | 5 +- ide/test/trace/bean/HeapStruct.test.ts | 5 +- ide/test/trace/bean/JsStruct.test.ts | 5 +- ide/test/trace/bean/NativeHook.test.ts | 5 +- ide/test/trace/bean/PerfProfile.test.ts | 5 +- ide/test/trace/bean/ProcessMemStruct.test.ts | 3 +- ide/test/trace/bean/ProcessStruct.test.ts | 7 +- ide/test/trace/bean/SdkSummary.test.ts | 3 +- ide/test/trace/bean/SmapsStruct.test.ts | 3 +- .../trace/bean/StateProcessThread.test.ts | 3 +- ide/test/trace/bean/ThreadStruct.test.ts | 5 +- ide/test/trace/bean/WakeupBean.test.ts | 3 +- .../trace/component/SpInfoAndStas.test.ts | 7 +- ide/test/trace/component/SpMetrics.test.ts | 8 +- ide/test/trace/component/SpQuerySQL.test.ts | 12 +- .../trace/component/SpRecordTrace.test.ts | 17 +- .../trace/component/SpSystemTrace.test.ts | 59 +- .../trace/component/SpWelcomePage.test.ts | 3 +- ide/test/trace/component/StackBar.test.ts | 3 +- .../trace/component/chart/FrameChart.test.ts | 22 +- .../component/chart/PerfDataQuery.test.ts | 5 +- .../component/chart/SpAbilityMonitor.test.ts | 19 +- .../component/chart/SpArkTsChart.test.ts | 10 +- .../component/chart/SpChartManager.test.ts | 10 +- .../component/chart/SpClockChart.test.ts | 10 +- .../trace/component/chart/SpCpuChart.test.ts | 15 +- ...ystemChart.test.ts => SpEBPFChart.test.ts} | 30 +- .../trace/component/chart/SpFpsChart.test.ts | 12 +- .../component/chart/SpFrameTimeChart.test.ts | 90 +- .../trace/component/chart/SpFreqChart.test.ts | 13 +- .../trace/component/chart/SpHiPerf.test.ts | 17 +- .../chart/SpHiSysEnergyChart.test.ts | 93 +- .../component/chart/SpHiSysEventChart.test.ts | 14 +- .../trace/component/chart/SpIrqChart.test.ts | 27 +- .../component/chart/SpJsMemoryChart.test.ts | 12 +- .../trace/component/chart/SpLogChart.test.ts | 10 +- .../trace/component/chart/SpMpsChart.test.ts | 53 - .../chart/SpNativeMemoryChart.test.ts | 21 +- .../component/chart/SpProcessChart.test.ts | 75 +- .../trace/component/chart/SpSdkChart.test.ts | 10 +- .../component/chart/SpVirtualMemChart.test.ts | 18 +- .../component/chart/SpVmTrackerChart.test.ts | 12 +- .../component/metrics/CpuStrategy.test.ts | 44 - .../metrics/DistributeTermStrategy.test.ts | 39 - .../component/metrics/MemAggStrategy.test.ts | 83 - .../component/metrics/MemStrategy.test.ts | 32 - .../metrics/MetaDataStrategy.test.ts | 30 - .../metrics/SysCallsStrategy.test.ts | 32 - .../metrics/SysCallsTopStrategy.test.ts | 35 - .../metrics/TraceStatsStrategy.test.ts | 31 - .../metrics/TraceTaskStrategy.test.ts | 30 - .../CheckCpuSetting.test.ts | 8 +- .../schedulingAnalysis/DrawerCpuTabs.test.ts | 3 +- .../SpSchedulingAnalysis.test.ts | 5 +- .../schedulingAnalysis/TabCpuAnalysis.test.ts | 6 +- .../TabCpuDetailsFrequency.test.ts | 3 +- .../TabCpuDetailsIdle.test.ts | 3 +- .../TabCpuDetailsIrq.test.ts | 3 +- .../TabCpuDetailsThreads.test.ts | 3 +- .../TabThreadAnalysis.test.ts | 5 +- .../Top20FrequencyThread.test.ts | 5 +- .../Top20ProcessSwitchCount.test.ts | 3 +- .../Top20ProcessThreadCount.test.ts | 3 +- .../Top20ThreadCpuUsage.test.ts | 3 +- .../Top20ThreadRunTime.test.ts | 3 +- .../schedulingAnalysis/utils/Utils.test.ts | 3 +- .../component/setting/SpAllocations.test.ts | 5 +- .../component/setting/SpCheckDesBox.test.ts | 3 +- .../component/setting/SpFileSystem.test.ts | 3 +- .../component/setting/SpHisysEvent.test.ts | 5 +- .../component/setting/SpProbesConfig.test.ts | 3 +- .../component/setting/SpRecordPerf.test.ts | 3 +- .../component/setting/SpRecordSetting.test.ts | 3 +- .../setting/SpRecordTemplate.test.ts | 3 +- .../component/setting/SpSdkConfig.test.ts | 3 +- .../component/setting/SpTraceCommand.test.ts | 3 +- .../component/setting/SpVmTracker.test.ts | 3 +- .../component/setting/SpWebHdcShell.test.ts | 12 +- .../setting/utils/PluginConvertUtils.test.ts | 15 +- .../component/trace/TimerShaftElement.test.ts | 15 +- .../component/trace/base/ColorUtils.test.ts | 3 +- .../component/trace/base/RangeSelect.test.ts | 11 +- .../component/trace/base/TraceRow.test.ts | 12 +- .../trace/base/TraceRowConfig.test.ts | 9 +- .../trace/base/TraceRowObject.test.ts | 3 +- .../trace/base/TraceRowRecyclerView.test.ts | 7 +- .../component/trace/base/TraceSheet.test.ts | 11 +- .../trace/component/trace/base/Utils.test.ts | 3 +- .../component/trace/search/Search.test.ts | 3 +- .../sheet/TabPaneCurrentSelection.test.ts | 7 +- .../trace/sheet/TabPaneFilter.test.ts | 3 +- .../sheet/ability/TabPaneCpuAbility.test.ts | 9 +- .../sheet/ability/TabPaneDiskAbility.test.ts | 9 +- .../sheet/ability/TabPaneDmaAbility.test.ts | 11 +- .../TabPaneDmaAbilityComparison.test.ts | 17 +- .../ability/TabPaneDmaSelectAbility.test.ts | 17 +- .../ability/TabPaneGpuMemoryAbility.test.ts | 15 +- .../TabPaneGpuMemoryComparison.test.ts | 17 +- .../TabPaneGpuMemorySelectAbility.test.ts | 13 +- .../ability/TabPaneHistoryProcesses.test.ts | 9 +- .../ability/TabPaneLiveProcesses.test.ts | 11 +- .../ability/TabPaneMemoryAbility.test.ts | 9 +- .../ability/TabPaneNetworkAbility.test.ts | 11 +- .../sheet/ability/TabPanePurgPin.test.ts | 11 +- .../TabPanePurgPinComparisonAbility.test.ts | 17 +- .../ability/TabPanePurgPinSelection.test.ts | 9 +- .../sheet/ability/TabPanePurgTotal.test.ts | 9 +- .../TabPanePurgTotalComparisonAbility.test.ts | 15 +- .../ability/TabPanePurgTotalSelection.test.ts | 11 +- .../sheet/ark-ts/TabPaneComparison.test.ts | 14 +- .../trace/sheet/ark-ts/TabPaneJsCpu.test.ts | 37 +- .../ark-ts/TabPaneJsCpuStatistics.test.ts | 15 +- .../trace/sheet/ark-ts/TabPaneSummary.test.ts | 15 +- .../sheet/clock/TabPaneClockCounter.test.ts | 13 +- .../trace/sheet/cpu/TabPaneBoxChild.test.ts | 8 +- .../sheet/cpu/TabPaneCounterSample.test.ts | 21 +- .../sheet/cpu/TabPaneCpuByProcess.test.ts | 15 +- .../sheet/cpu/TabPaneCpuByThread.test.ts | 9 +- .../trace/sheet/cpu/TabPaneCpuUsage.test.ts | 9 +- .../sheet/cpu/TabPaneFrequencySample.test.ts | 15 +- .../trace/sheet/cpu/TabPanePTS.test.ts | 11 +- .../trace/sheet/cpu/TabPaneSPT.test.ts | 17 +- .../sheet/energy/TabPaneEnergyAnomaly.test.ts | 11 +- .../sheet/energy/TabPanePowerBattery.test.ts | 14 +- .../sheet/energy/TabPanePowerDetails.test.ts | 14 +- .../sheet/energy/TabPaneSystemDetails.test.ts | 18 +- .../sheet/file-system/TabPaneCallTree.test.ts | 19 +- .../TabPaneFileSystemCalltree.test.ts | 22 +- .../TabPaneFileSystemDescHistory.test.ts | 11 +- .../TabPaneFileSystemDescTimeSlice.test.ts | 11 +- .../TabPaneFileSystemEvents.test.ts | 11 +- .../TabPaneFilesystemStatistics.test.ts | 24 +- ...abPaneFilesystemStatisticsAnalysis.test.ts | 13 +- .../TabPaneIOTierStatistics.test.ts | 18 +- .../TabPaneIOTierStatisticsAnalysis.test.ts | 13 +- .../TabPaneIoCompletionTimes.test.ts | 16 +- .../sheet/file-system/TabPaneVMEvents.test.ts | 16 +- .../TabPaneVirtualMemoryStatistics.test.ts | 9 +- ...aneVirtualMemoryStatisticsAnalysis.test.ts | 13 +- .../sheet/fps/TabPaneCpuFreqLimits.test.ts | 9 +- .../trace/sheet/fps/TabPaneFps.test.ts | 9 +- .../trace/sheet/frame/TabFrameSpacing.test.ts | 8 +- .../sheet/frame/TabPaneFrameDynamic.test.ts | 5 +- .../sheet/freq/TabPaneCpuFreqLimits.test.ts | 15 +- .../frequsage/TabPaneFreqDataCut.test.ts | 23 +- .../sheet/frequsage/TabPaneFreqUsage.test.ts | 39 +- .../sheet/gpu/TabPaneGpuClickSelect.test.ts | 28 +- .../TabPaneGpuClickSelectComparison.test.ts | 15 +- .../trace/sheet/gpu/TabPaneGpuGL.test.ts | 9 +- .../gpu/TabPaneGpuTotalBoxSelect.test.ts | 11 +- .../gpu/TabPaneGpuWindowBoxSelect.test.ts | 11 +- .../TabPaneHiSysEventSummary.test.ts | 7 +- .../hi-sysevent/TabPaneHisysEvents.test.ts | 35 +- .../sheet/hilog/TabPaneHilogSummary.test.ts | 5 +- .../trace/sheet/hilog/TabPaneHilogs.test.ts | 71 +- .../sheet/hiperf/TabPanePerfAnalysis.test.ts | 27 +- .../sheet/hiperf/TabPerfBottomUp.test.ts | 12 +- .../trace/sheet/hiperf/TabPerfProfile.test.ts | 8 +- .../sheet/hiperf/TabPerfSampleList.test.ts | 11 +- .../trace/sheet/irq/TabPaneIrqCounter.test.ts | 33 +- .../trace/sheet/jank/TabPaneFrames.test.ts | 5 +- .../native-memory/TabPaneNMCallInfo.test.ts | 362 --- .../native-memory/TabPaneNMCallTree.test.ts | 17 +- .../native-memory/TabPaneNMSampleList.test.ts | 16 +- .../TabPaneNMStatisticAnalysis.test.ts | 16 +- .../native-memory/TabPaneNMStatstics.test.ts | 8 +- .../native-memory/TabPaneNMemory.test.ts | 18 +- .../sheet/process/TabPaneCounter.test.ts | 9 +- .../trace/sheet/process/TabPaneSlices.test.ts | 9 +- .../sheet/process/TabPaneStartup.test.ts | 11 +- .../sheet/process/TabPaneStaticInit.test.ts | 11 +- .../sheet/process/TabPaneThreadStates.test.ts | 23 +- .../sheet/process/TabPaneThreadUsage.test.ts | 24 +- .../trace/sheet/sdk/TabPaneSdkCounter.test.ts | 19 +- .../trace/sheet/sdk/TabPaneSdkSlice.test.ts | 16 +- .../smaps/TabPaneSmapsComparison.test.ts | 19 +- .../sheet/smaps/TabPaneSmapsRecord.test.ts | 18 +- .../smaps/TabPaneSmapsStatistics.test.ts | 22 +- .../sheet/snapshot/TabPaneComparison.test.ts | 396 ---- .../sheet/snapshot/TabPaneSummary.test.ts | 363 ---- .../sheet/task/TabPaneTaskFrames.test.ts | 17 +- .../TabPaneDmaSelectVmTracker.test.ts | 17 +- .../vmtracker/TabPaneDmaVmTracker.test.ts | 17 +- .../TabPaneDmaVmTrackerComparison.test.ts | 13 +- .../TabPaneGpuMemorySelectVmTracker.test.ts | 15 +- .../TabPaneGpuMemoryVmTracker.test.ts | 15 +- ...abPaneGpuMemoryVmTrackerComparison.test.ts | 14 +- .../TabPanePurgPinComparisonVM.test.ts | 15 +- .../TabPanePurgTotalComparisonVM.test.ts | 17 +- .../vmtracker/TabPaneVmTrackerShm.test.ts | 17 +- .../TabPaneVmTrackerShmComparison.test.ts | 19 +- .../TabPaneVmTrackerShmSelection.test.ts | 17 +- .../component/trace/timer-shaft/Flag.test.ts | 3 +- .../component/trace/timer-shaft/Graph.test.ts | 3 +- .../trace/timer-shaft/RangeRuler.test.ts | 16 +- .../component/trace/timer-shaft/Rect.test.ts | 3 +- .../trace/timer-shaft/SportRuler.test.ts | 30 +- .../trace/timer-shaft/TabPaneFlag.test.ts | 7 +- .../trace/timer-shaft/TimeRuler.test.ts | 13 +- ide/test/trace/database/Procedure.test.ts | 3 +- ide/test/trace/database/SqlLite.test.ts | 3 +- .../ProcedureLogicWorkerCommon.test.ts | 3 +- .../ProcedureLogicWorkerCpuState.test.ts | 3 +- .../ProcedureLogicWorkerFileSystem.test.ts | 3 +- .../ProcedureLogicWorkerJsCpuProfiler.test.ts | 18 +- .../ProcedureLogicWorkerNativeNemory.test.ts | 102 +- .../ProcedureLogicWorkerPerf.test.ts | 69 +- .../ProcedureLogicWorkerSPT.test.ts | 3 +- ...edureLogicWorkerSchedulingAnalysis.test.ts | 3 +- .../ui-worker/ProcedureWorker.test.ts | 3 +- .../ProcedureWorkerAppStartup.test.ts | 11 +- .../ui-worker/ProcedureWorkerCPU.test.ts | 15 +- .../ui-worker/ProcedureWorkerClock.test.ts | 8 +- .../ui-worker/ProcedureWorkerCommon.test.ts | 34 +- .../ProcedureWorkerCpuAbility.test.ts | 33 +- .../ProcedureWorkerCpuFreqLimits.test.ts | 30 +- .../ProcedureWorkerCpuProfiler.test.ts | 11 +- .../ui-worker/ProcedureWorkerCpuState.test.ts | 8 +- .../ProcedureWorkerDiskIoAbility.test.ts | 11 +- ...em.test.ts => ProcedureWorkerEBPF.test.ts} | 55 +- .../ProcedureWorkerEnergyAnomaly.test.ts | 5 +- .../ProcedureWorkerEnergyPower.test.ts | 5 +- .../ProcedureWorkerEnergyState.test.ts | 5 +- .../ProcedureWorkerEnergySystem.test.ts | 5 +- .../ui-worker/ProcedureWorkerFPS.test.ts | 8 +- .../ProcedureWorkerFrameAnimation.test.ts | 14 +- .../ProcedureWorkerFrameDynamic.test.ts | 14 +- .../ProcedureWorkerFrameSpacing.test.ts | 11 +- .../ui-worker/ProcedureWorkerFreq.test.ts | 11 +- .../ui-worker/ProcedureWorkerFunc.test.ts | 8 +- .../ui-worker/ProcedureWorkerHeap.test.ts | 18 +- .../ProcedureWorkerHeapSnapshot.test.ts | 11 +- .../ProcedureWorkerHeapTimeline.test.ts | 7 +- .../ProcedureWorkerHiPerfCPU.test.ts | 15 +- .../ProcedureWorkerHiPerfEvent.test.ts | 13 +- .../ProcedureWorkerHiPerfProcess.test.ts | 13 +- .../ProcedureWorkerHiPerfReport.test.ts | 10 +- .../ProcedureWorkerHiPerfThread.test.ts | 13 +- .../ui-worker/ProcedureWorkerIrq.test.ts | 5 +- .../ui-worker/ProcedureWorkerJank.test.ts | 12 +- .../ui-worker/ProcedureWorkerLog.test.ts | 8 +- .../ui-worker/ProcedureWorkerMem.test.ts | 11 +- .../ProcedureWorkerMemoryAbility.test.ts | 7 +- .../ProcedureWorkerNetworkAbility.test.ts | 8 +- .../ProcedureWorkerPerfCallchains.test.ts | 3 +- .../ui-worker/ProcedureWorkerProcess.test.ts | 10 +- .../ui-worker/ProcedureWorkerSmaps.test.ts | 189 -- .../ui-worker/ProcedureWorkerSnapshot.test.ts | 11 +- .../ui-worker/ProcedureWorkerSoInit.test.ts | 13 +- .../ui-worker/ProcedureWorkerThread.test.ts | 11 +- .../ui-worker/ProcedureWorkerTimeline.test.ts | 10 +- .../ProcedureWorkerVirtualMemory.test.ts | 11 +- .../ui-worker/ProduceWorkerSdkCounter.test.ts | 8 +- .../ui-worker/ProduceWorkerSdkSlice.test.ts | 8 +- ide/test/trace/grpc/HiProfilerClient.test.ts | 3 +- ide/test/trace/grpc/ProfilerClient.test.ts | 3 +- .../trace/grpc/ProfilerController.test.ts | 5 +- ide/webpack.config.js | 2 + trace_streamer/.gn | 3 +- trace_streamer/doc/compile_trace_streamer.md | 17 +- trace_streamer/sdk/dubai_sdk/BUILD.gn | 153 -- trace_streamer/sdk/dubai_sdk/doc/wasm.md | 43 - trace_streamer/sdk/dubai_sdk/main.cpp | 18 - trace_streamer/sdk/dubai_sdk/plugin/BUILD.gn | 35 - .../plugin/sdk_plugin_data_parser.cpp | 85 - .../dubai_sdk/plugin/sdk_plugin_data_parser.h | 31 - .../sdk/dubai_sdk/protos/README_zh.md | 10 - .../sdk/dubai_sdk/protos/protogen.sh | 35 - .../sdk/dubai_sdk/protos/protos.gni | 37 - .../protos/types/plugins/mock_data/BUILD.gn | 123 -- .../mock_data/mock_plugin_config.proto | 22 - .../mock_data/mock_plugin_result.proto | 53 - .../sdk/dubai_sdk/rpc/http_server.cpp | 381 ---- .../sdk/dubai_sdk/rpc/http_server.h | 74 - .../sdk/dubai_sdk/rpc/http_socket.cpp | 173 -- .../sdk/dubai_sdk/rpc/http_socket.h | 53 - .../sdk/dubai_sdk/rpc/rpc_server.cpp | 111 - trace_streamer/sdk/dubai_sdk/rpc/rpc_server.h | 45 - .../sdk/dubai_sdk/sdk/sdk_data_parser.cpp | 189 -- .../sdk/dubai_sdk/sdk/sdk_data_parser.h | 107 - trace_streamer/sdk/dubai_sdk/sdk/ts.gni | 48 - .../sdk/dubai_sdk/sdk/ts_sdk_api.cpp | 61 - trace_streamer/sdk/dubai_sdk/sdk/ts_sdk_api.h | 41 - .../sdk/dubai_sdk/sdk/wasm_func.cpp | 144 -- trace_streamer/sdk/dubai_sdk/sdk/wasm_func.h | 34 - .../table/gpu_counter_object_table.cpp | 65 - .../table/gpu_counter_object_table.h | 44 - .../sdk/dubai_sdk/table/gpu_counter_table.cpp | 70 - .../sdk/dubai_sdk/table/gpu_counter_table.h | 44 - .../sdk/dubai_sdk/table/meta_table.cpp | 63 - .../sdk/dubai_sdk/table/meta_table.h | 40 - .../dubai_sdk/table/slice_object_table.cpp | 65 - .../sdk/dubai_sdk/table/slice_object_table.h | 44 - .../sdk/dubai_sdk/table/slice_table.cpp | 85 - .../sdk/dubai_sdk/table/slice_table.h | 44 - .../sdk/dubai_sdk/table/table_base.cpp | 288 --- .../sdk/dubai_sdk/table/table_base.h | 149 -- trace_streamer/sdk/dubai_sdk/test/BUILD.gn | 89 - .../dubai_sdk/test/unittest/sdk_api_test.cpp | 647 ------ .../dubai_sdk/trace_data/trace_data_cache.cpp | 39 - .../dubai_sdk/trace_data/trace_data_cache.h | 38 - .../trace_data/trace_data_cache_base.cpp | 23 - .../trace_data/trace_data_cache_base.h | 48 - .../trace_data/trace_data_cache_reader.cpp | 44 - .../trace_data/trace_data_cache_reader.h | 42 - .../trace_data/trace_data_cache_writer.cpp | 67 - .../trace_data/trace_data_cache_writer.h | 43 - .../dubai_sdk/trace_data/trace_data_db.cpp | 405 ---- .../sdk/dubai_sdk/trace_data/trace_data_db.h | 66 - .../dubai_sdk/trace_data/trace_stdtype.cpp | 134 -- .../sdk/dubai_sdk/trace_data/trace_stdtype.h | 157 -- .../trace_streamer_selector.cpp | 96 - .../trace_streamer/trace_streamer_selector.h | 53 - trace_streamer/sdk/dubai_sdk/ts.gni | 48 - trace_streamer/sdk/dubai_sdk/version.cpp | 18 - trace_streamer/sdk/dubai_sdk/version.h | 23 - trace_streamer/src/base/clock_filter.cpp | 3 +- trace_streamer/src/base/clock_filter.h | 2 - trace_streamer/src/base/codec_cov.h | 4 +- trace_streamer/src/base/file.h | 4 +- trace_streamer/src/base/index_map.h | 6 +- trace_streamer/src/base/log.cpp | 2 +- trace_streamer/src/base/log.h | 3 +- trace_streamer/src/base/numerical_to_string.h | 4 +- trace_streamer/src/base/string_help.cpp | 5 +- trace_streamer/src/base/string_help.h | 5 +- trace_streamer/src/base/string_to_numerical.h | 4 +- trace_streamer/src/base/ts_common.h | 2 +- .../src/filter/animation_filter.cpp | 6 +- trace_streamer/src/filter/animation_filter.h | 6 + .../src/filter/app_start_filter.cpp | 1 - trace_streamer/src/filter/app_start_filter.h | 2 + trace_streamer/src/filter/clock_filter_ex.cpp | 3 +- trace_streamer/src/filter/clock_filter_ex.h | 3 +- trace_streamer/src/filter/cpu_filter.h | 1 - trace_streamer/src/filter/frame_filter.cpp | 1 + .../src/filter/hi_sysevent_measure_filter.cpp | 60 +- .../src/filter/hi_sysevent_measure_filter.h | 4 +- .../src/filter/native_hook_filter.cpp | 18 +- .../src/filter/native_hook_filter.h | 2 +- .../filter/offline_symbolization_filter.cpp | 7 +- .../src/filter/offline_symbolization_filter.h | 3 +- trace_streamer/src/filter/slice_filter.cpp | 12 +- trace_streamer/src/filter/task_pool_filter.h | 1 + trace_streamer/src/main.cpp | 22 +- trace_streamer/src/metrics/metrics.cpp | 9 +- .../bytrace_parser/bytrace_hilog_parser.cpp | 14 +- .../bytrace_parser/bytrace_hilog_parser.h | 16 +- .../bytrace_hisysevent_parser.cpp | 6 +- .../bytrace_hisysevent_parser.h | 2 +- .../parser/bytrace_parser/bytrace_parser.cpp | 81 +- .../parser/bytrace_parser/bytrace_parser.h | 27 +- trace_streamer/src/parser/common_types.h | 4 +- .../parser/hiperf_parser/perf_data_parser.cpp | 10 +- .../htrace_cpu_data_parser.cpp | 2 +- .../htrace_cpu_data_parser.h | 16 +- .../htrace_hisysevent_parser.cpp | 7 +- .../htrace_hisysevent_parser.h | 2 +- .../htrace_js_memory_parser.cpp | 17 +- .../htrace_mem_parser.h | 2 + .../htrace_pbreader_parser/htrace_parser.cpp | 128 +- .../htrace_pbreader_parser/htrace_parser.h | 8 +- .../htrace_process_parser.cpp | 10 +- .../htrace_process_parser.h | 50 +- .../src/parser/print_event_parser.cpp | 24 +- .../src/parser/print_event_parser.h | 2 - .../rawtrace_parser/ftrace_processor.cpp | 7 +- .../parser/rawtrace_parser/ftrace_processor.h | 2 + .../kernel_symbols_processor.cpp | 2 +- .../printk_formats_processor.cpp | 4 +- .../rawtrace_parser/rawtrace_parser.cpp | 23 +- .../src/parser/thread_state_flag.cpp | 4 +- trace_streamer/src/parser/thread_state_flag.h | 26 +- .../src/proto_reader/include/proto_reader.h | 11 +- .../protoc_plugin/proto_reader_plugin.cpp | 2 +- .../src/protos/smartperf_host/sph_data.proto | 30 +- trace_streamer/src/rpc/ffrt_converter.cpp | 211 +- trace_streamer/src/rpc/ffrt_converter.h | 27 +- trace_streamer/src/rpc/http_server.cpp | 4 +- trace_streamer/src/rpc/http_socket.cpp | 4 +- trace_streamer/src/rpc/rpc_server.cpp | 66 +- trace_streamer/src/rpc/rpc_server.h | 7 +- trace_streamer/src/rpc/wasm_func.cpp | 26 +- trace_streamer/src/table/base/args_table.cpp | 90 +- trace_streamer/src/table/base/args_table.h | 11 +- .../src/table/base/data_dict_table.cpp | 89 +- .../src/table/base/data_dict_table.h | 12 +- .../src/table/base/data_type_table.cpp | 64 - .../src/table/base/data_type_table.h | 3 - trace_streamer/src/table/base/span_join.cpp | 8 +- .../src/table/base/symbols_table.cpp | 90 +- trace_streamer/src/table/base/symbols_table.h | 11 +- trace_streamer/src/table/base/table_base.cpp | 40 + trace_streamer/src/table/base/table_base.h | 22 +- .../table/ebpf/bio_latency_sample_table.cpp | 89 +- .../src/table/ebpf/bio_latency_sample_table.h | 11 +- .../src/table/ebpf/ebpf_callstack_table.cpp | 89 +- .../src/table/ebpf/ebpf_callstack_table.h | 11 +- .../src/table/ebpf/ebpf_elf_symbol_table.cpp | 90 +- .../src/table/ebpf/ebpf_elf_symbol_table.h | 11 +- .../src/table/ebpf/ebpf_elf_table.cpp | 89 +- .../src/table/ebpf/ebpf_elf_table.h | 11 +- .../table/ebpf/ebpf_process_maps_table.cpp | 90 +- .../src/table/ebpf/ebpf_process_maps_table.h | 11 +- .../table/ebpf/file_system_sample_table.cpp | 89 +- .../src/table/ebpf/file_system_sample_table.h | 11 +- .../src/table/ftrace/callstack_table.cpp | 89 +- .../src/table/ftrace/callstack_table.h | 11 +- .../table/ftrace/cpu_measure_filter_table.cpp | 91 +- .../table/ftrace/cpu_measure_filter_table.h | 11 +- .../src/table/ftrace/filter_table.cpp | 89 +- .../src/table/ftrace/filter_table.h | 11 +- .../src/table/ftrace/frame_maps_table.cpp | 89 +- .../src/table/ftrace/frame_maps_table.h | 11 +- .../src/table/ftrace/frame_slice_table.cpp | 89 +- .../src/table/ftrace/frame_slice_table.h | 11 +- .../src/table/ftrace/gpu_slice_table.cpp | 89 +- .../src/table/ftrace/gpu_slice_table.h | 11 +- .../src/table/ftrace/instants_table.cpp | 103 +- .../src/table/ftrace/instants_table.h | 12 +- trace_streamer/src/table/ftrace/irq_table.cpp | 89 +- trace_streamer/src/table/ftrace/irq_table.h | 11 +- .../src/table/ftrace/measure_table.cpp | 92 +- .../src/table/ftrace/measure_table.h | 11 +- .../ftrace/process_measure_filter_table.cpp | 91 +- .../ftrace/process_measure_filter_table.h | 11 +- .../src/table/ftrace/process_table.cpp | 94 +- .../src/table/ftrace/process_table.h | 11 +- trace_streamer/src/table/ftrace/raw_table.cpp | 89 +- trace_streamer/src/table/ftrace/raw_table.h | 11 +- .../src/table/ftrace/sched_slice_table.cpp | 108 +- .../src/table/ftrace/sched_slice_table.h | 11 +- .../ftrace/system_event_filter_table.cpp | 90 +- .../table/ftrace/system_event_filter_table.h | 11 +- .../src/table/ftrace/thread_state_table.cpp | 108 +- .../src/table/ftrace/thread_state_table.h | 11 +- .../src/table/ftrace/thread_table.cpp | 95 +- .../src/table/ftrace/thread_table.h | 11 +- .../table/hiperf/perf_call_chain_table.cpp | 90 +- .../src/table/hiperf/perf_call_chain_table.h | 11 +- .../src/table/hiperf/perf_files_table.cpp | 90 +- .../src/table/hiperf/perf_files_table.h | 11 +- .../src/table/hiperf/perf_sample_table.cpp | 90 +- .../src/table/hiperf/perf_sample_table.h | 11 +- .../src/table/hiperf/perf_thread_table.cpp | 88 +- .../src/table/hiperf/perf_thread_table.h | 11 +- .../native_hook/native_hook_frame_table.cpp | 88 +- .../native_hook/native_hook_frame_table.h | 11 +- .../native_hook_statistic_table.cpp | 90 +- .../native_hook/native_hook_statistic_table.h | 11 +- .../table/native_hook/native_hook_table.cpp | 90 +- .../src/table/native_hook/native_hook_table.h | 11 +- .../trace_data/sqllite_prepar_cache_data.cpp | 486 ++--- .../trace_data/sqllite_prepar_cache_data.h | 80 +- .../src/trace_data/trace_data_cache.cpp | 8 +- .../src/trace_data/trace_data_cache_base.h | 6 + .../src/trace_data/trace_data_db.cpp | 9 +- trace_streamer/src/trace_data/trace_data_db.h | 2 +- .../src/trace_data/trace_stdtype.cpp | 35 +- trace_streamer/src/trace_data/trace_stdtype.h | 6 +- .../trace_streamer_selector.cpp | 2 +- .../trace_streamer/trace_streamer_selector.h | 2 +- trace_streamer/src/version.cpp | 8 +- trace_streamer/src/version.h | 4 + .../sqllite_prepar_cache_data_test.cpp | 70 +- 807 files changed, 21028 insertions(+), 19684 deletions(-) create mode 160000 ide/developtools_smartperf_host create mode 100644 ide/src/figures/deploy/chomd+x.png create mode 100644 ide/src/figures/deploy/put_bin.png rename ide/src/trace/component/chart/{SpFileSystemChart.ts => SpEBPFChart.ts} (77%) create mode 100644 ide/src/trace/database/data-trafic/AbilityMonitorReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/AbilityMonitorSender.ts create mode 100644 ide/src/trace/database/data-trafic/AllMemoryCache.ts create mode 100644 ide/src/trace/database/data-trafic/ArkTsReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ArkTsSender.ts create mode 100644 ide/src/trace/database/data-trafic/ClockDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ClockDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/CpuDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/CpuDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/CpuFreqDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/CpuFreqDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/CpuFreqLimitDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/CpuFreqLimitDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/CpuStateReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/CpuStateSender.ts create mode 100644 ide/src/trace/database/data-trafic/DataFilter.ts create mode 100644 ide/src/trace/database/data-trafic/EBPFReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/EBPFSender.ts create mode 100644 ide/src/trace/database/data-trafic/EnergySysEventReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/EnergySysEventSender.ts create mode 100644 ide/src/trace/database/data-trafic/ExecProtoForWorker.ts create mode 100644 ide/src/trace/database/data-trafic/FrameDynamicEffectReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/FrameDynamicEffectSender.ts create mode 100644 ide/src/trace/database/data-trafic/FrameJanksReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/FrameJanksSender.ts create mode 100644 ide/src/trace/database/data-trafic/FuncDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/FuncDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/HiSysEventDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/HiSysEventDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/HiperfCallChartReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/HiperfCallChartSender.ts create mode 100644 ide/src/trace/database/data-trafic/HiperfCpuDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/HiperfCpuDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/HiperfProcessDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/HiperfProcessDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/HiperfThreadDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/HiperfThreadDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/IrqDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/IrqDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/LogDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/LogDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/NativeMemoryDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/NativeMemoryDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessActualDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessActualDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessDeliverInputEventDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessDeliverInputEventDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessExpectedDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessExpectedDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessMemDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessMemDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessSoInitDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessSoInitDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessStartupDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ProcessStartupDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/QueryEnum.ts create mode 100644 ide/src/trace/database/data-trafic/ThreadDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/ThreadDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/VirtualMemoryDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/VirtualMemoryDataSender.ts create mode 100644 ide/src/trace/database/data-trafic/VmTrackerDataReceiver.ts create mode 100644 ide/src/trace/database/data-trafic/VmTrackerDataSender.ts rename ide/src/trace/database/ui-worker/{ProcedureWorkerFileSystem.ts => ProcedureWorkerEBPF.ts} (40%) create mode 100644 ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfCPU2.ts create mode 100644 ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfProcess2.ts create mode 100644 ide/src/trace/database/ui-worker/ProcedureWorkerHiPerfThread2.ts create mode 100644 ide/src/trace/proto/SphBaseData.proto delete mode 100644 ide/src/trace/proto/common_types.proto delete mode 100644 ide/src/trace/proto/profiler_service.proto delete mode 100644 ide/src/trace/proto/profiler_service_types.proto rename ide/test/trace/component/chart/{SpFileSystemChart.test.ts => SpEBPFChart.test.ts} (56%) delete mode 100644 ide/test/trace/component/chart/SpMpsChart.test.ts delete mode 100644 ide/test/trace/component/metrics/CpuStrategy.test.ts delete mode 100644 ide/test/trace/component/metrics/DistributeTermStrategy.test.ts delete mode 100644 ide/test/trace/component/metrics/MemAggStrategy.test.ts delete mode 100644 ide/test/trace/component/metrics/MemStrategy.test.ts delete mode 100644 ide/test/trace/component/metrics/MetaDataStrategy.test.ts delete mode 100644 ide/test/trace/component/metrics/SysCallsStrategy.test.ts delete mode 100644 ide/test/trace/component/metrics/SysCallsTopStrategy.test.ts delete mode 100644 ide/test/trace/component/metrics/TraceStatsStrategy.test.ts delete mode 100644 ide/test/trace/component/metrics/TraceTaskStrategy.test.ts delete mode 100644 ide/test/trace/component/trace/sheet/native-memory/TabPaneNMCallInfo.test.ts delete mode 100644 ide/test/trace/component/trace/sheet/snapshot/TabPaneComparison.test.ts delete mode 100644 ide/test/trace/component/trace/sheet/snapshot/TabPaneSummary.test.ts rename ide/test/trace/database/ui-worker/{ProcedureWorkerFileSystem.test.ts => ProcedureWorkerEBPF.test.ts} (61%) delete mode 100644 ide/test/trace/database/ui-worker/ProcedureWorkerSmaps.test.ts delete mode 100644 trace_streamer/sdk/dubai_sdk/BUILD.gn delete mode 100755 trace_streamer/sdk/dubai_sdk/doc/wasm.md delete mode 100644 trace_streamer/sdk/dubai_sdk/main.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/plugin/BUILD.gn delete mode 100644 trace_streamer/sdk/dubai_sdk/plugin/sdk_plugin_data_parser.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/plugin/sdk_plugin_data_parser.h delete mode 100755 trace_streamer/sdk/dubai_sdk/protos/README_zh.md delete mode 100755 trace_streamer/sdk/dubai_sdk/protos/protogen.sh delete mode 100644 trace_streamer/sdk/dubai_sdk/protos/protos.gni delete mode 100644 trace_streamer/sdk/dubai_sdk/protos/types/plugins/mock_data/BUILD.gn delete mode 100755 trace_streamer/sdk/dubai_sdk/protos/types/plugins/mock_data/mock_plugin_config.proto delete mode 100755 trace_streamer/sdk/dubai_sdk/protos/types/plugins/mock_data/mock_plugin_result.proto delete mode 100644 trace_streamer/sdk/dubai_sdk/rpc/http_server.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/rpc/http_server.h delete mode 100644 trace_streamer/sdk/dubai_sdk/rpc/http_socket.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/rpc/http_socket.h delete mode 100644 trace_streamer/sdk/dubai_sdk/rpc/rpc_server.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/rpc/rpc_server.h delete mode 100644 trace_streamer/sdk/dubai_sdk/sdk/sdk_data_parser.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/sdk/sdk_data_parser.h delete mode 100644 trace_streamer/sdk/dubai_sdk/sdk/ts.gni delete mode 100644 trace_streamer/sdk/dubai_sdk/sdk/ts_sdk_api.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/sdk/ts_sdk_api.h delete mode 100644 trace_streamer/sdk/dubai_sdk/sdk/wasm_func.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/sdk/wasm_func.h delete mode 100644 trace_streamer/sdk/dubai_sdk/table/gpu_counter_object_table.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/table/gpu_counter_object_table.h delete mode 100644 trace_streamer/sdk/dubai_sdk/table/gpu_counter_table.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/table/gpu_counter_table.h delete mode 100644 trace_streamer/sdk/dubai_sdk/table/meta_table.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/table/meta_table.h delete mode 100644 trace_streamer/sdk/dubai_sdk/table/slice_object_table.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/table/slice_object_table.h delete mode 100644 trace_streamer/sdk/dubai_sdk/table/slice_table.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/table/slice_table.h delete mode 100644 trace_streamer/sdk/dubai_sdk/table/table_base.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/table/table_base.h delete mode 100644 trace_streamer/sdk/dubai_sdk/test/BUILD.gn delete mode 100644 trace_streamer/sdk/dubai_sdk/test/unittest/sdk_api_test.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_cache.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_cache.h delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_cache_base.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_cache_base.h delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_cache_reader.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_cache_reader.h delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_cache_writer.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_cache_writer.h delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_db.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_data_db.h delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_stdtype.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_data/trace_stdtype.h delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_streamer/trace_streamer_selector.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/trace_streamer/trace_streamer_selector.h delete mode 100644 trace_streamer/sdk/dubai_sdk/ts.gni delete mode 100644 trace_streamer/sdk/dubai_sdk/version.cpp delete mode 100644 trace_streamer/sdk/dubai_sdk/version.h diff --git a/ide/developtools_smartperf_host b/ide/developtools_smartperf_host new file mode 160000 index 000000000..147d9922a --- /dev/null +++ b/ide/developtools_smartperf_host @@ -0,0 +1 @@ +Subproject commit 147d9922a031df50be9b4c6cd7a10e60cb53ad5b diff --git a/ide/package.json b/ide/package.json index 12be40e7b..668e537af 100644 --- a/ide/package.json +++ b/ide/package.json @@ -19,17 +19,9 @@ "jest": { "testEnvironment": "jsdom", "collectCoverageFrom": [ - "/dist/**/*.js", - "!/dist/bin/*", - "!/dist/trace/database/pixi.js", - "!/dist/trace/database/sql-wasm.js", - "!/dist/trace/database/uuidv4.min.js", - "!/dist/trace/database/worker.sql-wasm.js", - "!/dist/trace/database/worker.sql-wasm-debug.js", - "!/dist/trace/database/trace_streamer_builtin.js", - "!/dist/trace/database/trace_streamer_sdk_builtin.js", - "!/dist/trace/database/trace_streamer_dubai_builtin.js", - "!/dist/trace/database/trace_converter_builtin.js" + "/src/**/*.ts", + "!/src/trace/proto/SphBaseData.js", + "!/src/trace/grpc/*.ts" ], "globals": { "useWb": true @@ -39,7 +31,15 @@ ], "setupFilesAfterEnv": [ "/jest.setup.js" - ] + ], + "moduleFileExtensions": [ + "ts", + "js", + "json" + ], + "transform": { + "\\.[jt]sx?$": "babel-jest" + } }, "repository": { "type": "git", @@ -53,6 +53,7 @@ "@babel/plugin-proposal-decorators": "^7.17.2", "@babel/preset-env": "^7.23.2", "@babel/preset-typescript": "*", + "@types/google-protobuf": "^3.15.9", "@types/jest": "*", "@types/node": "^17.0.10", "typescript": "^5.2.2", @@ -67,14 +68,19 @@ "mini-css-extract-plugin": "^2.7.6", "style-loader": "^3.3.3", "ts-loader": "^9.4.4", - "@webpack-cli/generators": "^3.0.7", "clean-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^11.0.0", "html-webpack-plugin": "^5.5.3", "webpack": "^5.89.0", "webpack-cli": "^5.1.4", "webpack-dev-server": "^4.15.1", - "jest-worker": "^29.5.0" + "jest-worker": "^29.5.0", + "protobufjs": "^7.2.5", + "protobufjs-cli": "^1.1.2", + "@babel/plugin-proposal-private-methods": "^7.18.6", + "@babel/plugin-proposal-private-property-in-object": "^7.21.11", + "@babel/plugin-proposal-optional-chaining": "^7.21.0", + "babel-jest": "^29.7.0" }, "dependencies": { "@webcomponents/custom-elements": "^1.6.0" diff --git a/ide/src/base-ui/menu/LitMainMenu.ts b/ide/src/base-ui/menu/LitMainMenu.ts index 69d38e98a..6f6002cc2 100644 --- a/ide/src/base-ui/menu/LitMainMenu.ts +++ b/ide/src/base-ui/menu/LitMainMenu.ts @@ -261,7 +261,7 @@ export interface MenuGroup { export interface MenuItem { icon: string; title: string; - disabled?: boolean + disabled?: boolean; fileChoose?: boolean; clickHandler?: Function; fileHandler?: Function; diff --git a/ide/src/base-ui/select/LitSelect.ts b/ide/src/base-ui/select/LitSelect.ts index bd3d15afe..d010c17e3 100644 --- a/ide/src/base-ui/select/LitSelect.ts +++ b/ide/src/base-ui/select/LitSelect.ts @@ -231,8 +231,8 @@ export class LitSelect extends BaseElement {
+ this.showSearch || this.canInsert ? '' : 'readonly' + } tabindex="0">
diff --git a/ide/src/base-ui/table/LitPageTable.ts b/ide/src/base-ui/table/LitPageTable.ts index ca9dc257f..7e8e94aab 100644 --- a/ide/src/base-ui/table/LitPageTable.ts +++ b/ide/src/base-ui/table/LitPageTable.ts @@ -1166,6 +1166,7 @@ export class LitPageTable extends BaseElement { resetNodeHidden(false, rowData); } this.reMeauseHeight(); + e.stopPropagation(); }); return btn; } diff --git a/ide/src/base-ui/table/lit-table.ts b/ide/src/base-ui/table/lit-table.ts index 7cb198b0c..7cb7ea453 100644 --- a/ide/src/base-ui/table/lit-table.ts +++ b/ide/src/base-ui/table/lit-table.ts @@ -922,13 +922,15 @@ export class LitTable extends HTMLElement { header.style.cursor = 'pointer'; }); element.addEventListener('mousedown', (event) => { - if (!this.columnResizeEnable) return; - this.isResize = true; - this.resizeColumnIndex = index; - this.resizeDownX = event.clientX; - let pre = header.childNodes.item(this.resizeColumnIndex - 1) as HTMLDivElement; - this.beforeResizeWidth = pre.clientWidth; - event.stopPropagation(); + if (event.button === 0) { + if (!this.columnResizeEnable) return; + this.isResize = true; + this.resizeColumnIndex = index; + this.resizeDownX = event.clientX; + let pre = header.childNodes.item(this.resizeColumnIndex - 1) as HTMLDivElement; + this.beforeResizeWidth = pre.clientWidth; + event.stopPropagation(); + } }); element.addEventListener('click', (event) => { event.stopPropagation(); @@ -1008,6 +1010,7 @@ export class LitTable extends HTMLElement { this.currentRecycleList.push(newTableElement); let td = newTableElement?.querySelectorAll('.td'); if (tableRowObject.data.rowName === 'cpu-profiler') { + td[0].innerHTML = ''; this.createTextColor(tableRowObject, td[0]); } } @@ -1376,32 +1379,35 @@ export class LitTable extends HTMLElement { } else { btn.name = 'minus-square'; } - btn.addEventListener('click', (e: any) => { - rowData.data.status = false; - const resetNodeHidden = (hidden: boolean, rowData: any) => { - if (hidden) { - rowData.children.forEach((child: any) => { - child.rowHidden = false; - }); + btn.addEventListener('mouseup', (e: MouseEvent) => { + if (e.button === 0) { + rowData.data.status = false; + const resetNodeHidden = (hidden: boolean, rowData: any) => { + if (hidden) { + rowData.children.forEach((child: any) => { + child.rowHidden = false; + }); + } else { + rowData.children.forEach((child: any) => { + child.rowHidden = true; + resetNodeHidden(hidden, child); + }); + } + }; + + if (rowData.data.expanded) { + rowData.data.status = true; + this.dispatchRowClickEventIcon(rowData, [btn]); + rowData.data.expanded = false; + resetNodeHidden(true, rowData); } else { - rowData.children.forEach((child: any) => { - child.rowHidden = true; - resetNodeHidden(hidden, child); - }); + rowData.data.expanded = true; + rowData.data.status = false; + resetNodeHidden(false, rowData); } - }; - - if (rowData.data.expanded) { - rowData.data.status = true; - this.dispatchRowClickEventIcon(rowData, [btn]); - rowData.data.expanded = false; - resetNodeHidden(true, rowData); - } else { - rowData.data.expanded = true; - rowData.data.status = false; - resetNodeHidden(false, rowData); + this.reMeauseHeight(); } - this.reMeauseHeight(); + e.stopPropagation(); }); return btn; } @@ -1415,60 +1421,62 @@ export class LitTable extends HTMLElement { } else { btn.name = 'plus-square'; } - btn.onclick = (e: Event) => { - const resetNodeHidden = (hidden: boolean, rowData: any) => { - if (rowData.children.length > 0) { - if (hidden) { - rowData.children.forEach((child: any) => { - child.rowHidden = true; - resetNodeHidden(hidden, child); - }); - } else { - rowData.children.forEach((child: any) => { - child.rowHidden = !rowData.expanded; - if (rowData.expanded) { + btn.onmouseup = (e: MouseEvent) => { + if (e.button === 0) { + const resetNodeHidden = (hidden: boolean, rowData: any) => { + if (rowData.children.length > 0) { + if (hidden) { + rowData.children.forEach((child: any) => { + child.rowHidden = true; resetNodeHidden(hidden, child); - } - }); + }); + } else { + rowData.children.forEach((child: any) => { + child.rowHidden = !rowData.expanded; + if (rowData.expanded) { + resetNodeHidden(hidden, child); + } + }); + } } - } - }; + }; - if (rowData.expanded && this._mode === TableMode.Retract) { - rowData.data.status = false; - rowData.expanded = false; - resetNodeHidden(true, rowData); - } else if (!rowData.expanded && this._mode === TableMode.Retract) { - rowData.expanded = true; - rowData.data.status = true; - this.recycleDs = this.meauseTreeRowElement(this.value, RedrawTreeForm.Retract); - resetNodeHidden(false, rowData); - } + if (rowData.expanded && this._mode === TableMode.Retract) { + rowData.data.status = false; + rowData.expanded = false; + resetNodeHidden(true, rowData); + } else if (!rowData.expanded && this._mode === TableMode.Retract) { + rowData.expanded = true; + rowData.data.status = true; + this.recycleDs = this.meauseTreeRowElement(this.value, RedrawTreeForm.Retract); + resetNodeHidden(false, rowData); + } - if (this._mode === TableMode.Expand && rowData.expanded) { - // 点击收起的时候将点击的那条数据的status改为false - setChildrenStatus(this.value); - function setChildrenStatus(data: any) { - for (let d of data) { - if (rowData.data === d) { - d.status = false; - } - if (d.children != undefined && d.children.length > 0) { - setChildrenStatus(d.children); + if (this._mode === TableMode.Expand && rowData.expanded) { + // 点击收起的时候将点击的那条数据的status改为false + setChildrenStatus(this.value); + function setChildrenStatus(data: any) { + for (let d of data) { + if (rowData.data === d) { + d.status = false; + } + if (d.children != undefined && d.children.length > 0) { + setChildrenStatus(d.children); + } } } + rowData.expanded = false; + resetNodeHidden(true, rowData); + } else if (this._mode === TableMode.Expand && !rowData.expanded) { + if (rowData.data.children) { + rowData.data.status = true; + } + this.recycleDs = this.meauseTreeRowElement(this.value, RedrawTreeForm.Default); + rowData.expanded = true; + resetNodeHidden(false, rowData); } - rowData.expanded = false; - resetNodeHidden(true, rowData); - } else if (this._mode === TableMode.Expand && !rowData.expanded) { - if (rowData.data.children) { - rowData.data.status = true; - } - this.recycleDs = this.meauseTreeRowElement(this.value, RedrawTreeForm.Default); - rowData.expanded = true; - resetNodeHidden(false, rowData); + this.reMeauseHeight(); } - this.reMeauseHeight(); e.stopPropagation(); }; return btn; @@ -1696,7 +1704,7 @@ export class LitTable extends HTMLElement { } else { tblRowElement.style.gridTemplateColumns = gridTemplateColumns.join(' '); } - tblRowElement.onclick = (e) => { + tblRowElement.onmouseup = (e: MouseEvent) => { this.dispatchEvent( new CustomEvent('row-click', { detail: { diff --git a/ide/src/base-ui/utils/CSVFormater.ts b/ide/src/base-ui/utils/CSVFormater.ts index a4305f0e3..fd3a46644 100644 --- a/ide/src/base-ui/utils/CSVFormater.ts +++ b/ide/src/base-ui/utils/CSVFormater.ts @@ -136,16 +136,16 @@ export class JSONToCSV { (has = agent.indexOf('edge') !== -1 ? (type.edge = 'edge') : agent.match(/rv:([\d.]+)\) like gecko/)) ? (type.ie = has[1]) : (has = agent.match(/msie ([\d.]+)/)) - ? (type.ie = has[1]) - : (has = agent.match(/firefox\/([\d.]+)/)) - ? (type.firefox = has[1]) - : (has = agent.match(/chrome\/([\d.]+)/)) - ? (type.chrome = has[1]) - : (has = agent.match(/opera.([\d.]+)/)) - ? (type.opera = has[1]) - : (has = agent.match(/version\/([\d.]+).*safari/)) - ? (type.safari = has[1]) - : 0; + ? (type.ie = has[1]) + : (has = agent.match(/firefox\/([\d.]+)/)) + ? (type.firefox = has[1]) + : (has = agent.match(/chrome\/([\d.]+)/)) + ? (type.chrome = has[1]) + : (has = agent.match(/opera.([\d.]+)/)) + ? (type.opera = has[1]) + : (has = agent.match(/version\/([\d.]+).*safari/)) + ? (type.safari = has[1]) + : 0; return type; } diff --git a/ide/src/doc/compile_trace_streamer.html b/ide/src/doc/compile_trace_streamer.html index 08b3de97f..677e50def 100644 --- a/ide/src/doc/compile_trace_streamer.html +++ b/ide/src/doc/compile_trace_streamer.html @@ -1,4 +1,4 @@ - + compile_trace_streamer diff --git a/ide/src/doc/des_binder.html b/ide/src/doc/des_binder.html index 623e2a3ed..0c9e8cbac 100644 --- a/ide/src/doc/des_binder.html +++ b/ide/src/doc/des_binder.html @@ -1,4 +1,4 @@ - + des_binder diff --git a/ide/src/doc/des_stat.html b/ide/src/doc/des_stat.html index 9bef69217..df51e09f7 100644 --- a/ide/src/doc/des_stat.html +++ b/ide/src/doc/des_stat.html @@ -1,4 +1,4 @@ - + des_stat diff --git a/ide/src/doc/des_support_event.html b/ide/src/doc/des_support_event.html index dd1f2e773..d4b448540 100644 --- a/ide/src/doc/des_support_event.html +++ b/ide/src/doc/des_support_event.html @@ -1,4 +1,4 @@ - + des_support_event diff --git a/ide/src/doc/des_tables.html b/ide/src/doc/des_tables.html index 2321cd77d..2bacf2fe4 100644 --- a/ide/src/doc/des_tables.html +++ b/ide/src/doc/des_tables.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/des_wakup.html b/ide/src/doc/des_wakup.html index 45a58bd23..1a586723b 100644 --- a/ide/src/doc/des_wakup.html +++ b/ide/src/doc/des_wakup.html @@ -1,4 +1,4 @@ - + des_wakup diff --git a/ide/src/doc/md/des_tables.md b/ide/src/doc/md/des_tables.md index 8e2a37ec3..747e49801 100644 --- a/ide/src/doc/md/des_tables.md +++ b/ide/src/doc/md/des_tables.md @@ -1,166 +1,166 @@ -# TraceStreamer数据表概述 +# TraceStreamer 数据表概述 -TraceStreamer可以将trace数据源转化为易于理解和使用的数据库。用户可以通过SmartPerf界面直观的研究系统跟踪数据,也可在理解TraceStreamer生成的数据库的基础上,在TraceStreamer的交互模式或者Smartperf的数据库查询模式下,使用SQL查询语句自由组装查看用户关心的数据。下文将对TraceStreamer生成的数据库进行详细描述,给用户使用SQL查询系统跟踪数据提供帮助。 +TraceStreamer 可以将 trace 数据源转化为易于理解和使用的数据库。用户可以通过 SmartPerf 界面直观的研究系统跟踪数据,也可在理解 TraceStreamer 生成的数据库的基础上,在 TraceStreamer 的交互模式或者 Smartperf 的数据库查询模式下,使用 SQL 查询语句自由组装查看用户关心的数据。下文将对 TraceStreamer 生成的数据库进行详细描述,给用户使用 SQL 查询系统跟踪数据提供帮助。 -## TraceStreamer输出的数据表分类 +## TraceStreamer 输出的数据表分类 - 常规泳道图数据表 ![GitHub Logo](../../figures/traceStreamer/db_common.png) -- native memory数据源相关表 +- native memory 数据源相关表 ![GitHub Logo](../../figures/traceStreamer/db_native_memory.png) -- perf相关数据表 +- perf 相关数据表 ![GitHub Logo](../../figures/traceStreamer/db_hiperf.png) -- hisysevent相关数据表 +- hisysevent 相关数据表 ![GitHub Logo](../../figures/traceStreamer/db_hisys_event.png) -## TraceStreamer输出数据库包含以下表格 - -| 表名称 | 作用 | -| --------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | -| animation | 记录动效的响应时延和完成时延 | -| app_name | 记录HiSysEvent事件的事件名与IDE部分事件的字段名为APPNAME中存放的相关信息的映射关系 | -| app_startup | 记录了应用启动相关数据 | -| args | 记录方法参数集合 | -| bio_latency_sample | 记录IO操作相关方法调用,及调用栈数据 | -| callstack | 记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号 | -| clk_event_filter | 记录时钟相关的信息 | -| clock_event_filter | 此结构用来维护时钟事件,cpu与唯一的ID做关联 | -| clock_snapshot | 时钟号和时间,时钟名的映射表 | -| cpu_measure_filter | cpu事件过滤器表 | -| cpu_usage | 记录CPU使用率事件 | -| datasource_clockid | 数据源和时钟号的映射表 | -| data_dict | 记录常用的字符串,将字符串和索引关联,降低程序运行的内存占用,用作辅助数据 | -| data_type | 记录数据类型和typeId的关联关系 | -| device_info | 记录设备分辨率和帧率 | -| device_state | 记录设备屏幕亮度,蓝牙,位置,wifi,音乐,媒体等信息 | -| diskio | 记录磁盘读写数据事件 | -| dynamic_frame | 记录动效帧的分辨率和结束时间等 | -| ebpf_callstack | 记录了采样相关信息 | -| file_system_sample | 记录了调用栈的相关信息 | -| frame_maps | 记录应用到RS的帧的映射关系 | -| frame_slice | 记录RS(RenderService)和应用的帧渲染 | -| gpu_slice | 记录RS的帧对应的gpu渲染时长 | -| hidump | 记录FPS(Frame Per Second)数据 | -| hisys_event_measure | 记录了HiSysEvent事件相关数据,目前HiSysEvent事件包括了异常事件,IDE事件,器件状态事件 | -| instant | 记录Sched_waking, sched_wakeup事件, 用作ThreadState表的上下文使用 | -| irq | 记录中断相关事件 | -| js_config | 记录了arkTs数据采集的相关配置 | -| js_cpu_profiler_node | 记录了cpu profiler中node节点的数据 | -| js_cpu_profiler_sample | 记录了cpu profiler中sample节点的数据 | -| js_heap_edges | 记录了js内存数据类对象对应的成员的信息 | -| js_heap_files | 记录了js内存数据的名称和时间 | -| js_heap_info | 记录了js内存数据类型,如nodes和edges的字段类型和数据总数 | -| js_heap_location | 记录了js内存location节点相关数据 | -| js_heap_nodes | 记录了js内存类对象和其成员的对应关系 | -| js_heap_sample | 记录了timeline模式下的时间轴信息 | -| js_heap_string | 记录了js内存数据中的字符串 | -| js_heap_trace_function_info | 记录了timeline模式下的调用栈的每个函数信息 | -| js_heap_trace_node | 记录了timeline模式下的调用栈信息 | -| live_process | 记录了一些实时的进程中执行的一些数据 | -| log | 记录hilog打印日志数据 | -| measure | 记录所有的计量值 | -| measure_filter | 记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录 | -| memory_ashmem | 记录了进程所占用的ashmem相关信息 | -| memory_dma | 记录了进程占用的DMA内存相关信息 | -| memory_process_gpu | 记录进程占用GPU内存相关信息 | -| memory_window_gpu | 记录窗口占用GPU内存相关信息 | -| meta | 记录执行解析操作相关的基本信息 | -| native_hook | 记录堆内存申请与释放相关的数据 | -| native_hook_frame | 记录堆内存申请与释放相关的调用栈 | -| native_hook_statistic | 记录堆内存申请与释放相关的统计信息 | -| network | 抓取网络信息传输时产生的一些相关信息 | -| paged_memory_sample | 记录内存操作相关方法调用,及调用栈数据 | -| perf_callchain | 记录Hiperf采样数据的调用栈信息 | -| perf_files | 记录Hiperf工具采集到的函数符号表和文件名 | -| perf_report | 记录Hiperf工具采集数据时的配置信息。包括 | 抓取的事件类型,抓取数据的命令, 抓数据时指定的进程名称 | -| perf_sample | 记录Hiperf工具的采样信息 | -| perf_thread | 记录Hiperf工具采集到的进程和线程数据 | -| process | 记录所有的进程信息 | -| process_filter | 过滤进程 | -| process_measure | 保存进程的所有计量值 | -| process_measure_filter | 将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id | -| raw | 此数据结构主要作为ThreadState的上下文使用,这张表是sched_waking,sched_wakup, cpu_idle事件的原始记录 | -| sched_slice | 此数据结构主要作为ThreadState的上下文使用,这张表是sched_switch事件的原始记录 | -| smaps | 记录进程的内存消耗的相关信息采样 | -| stat | 此结果用来统计数据解析中各类数据的数据条数,数据和合法性,数据的匹配程度(begin-end),数据的损失等,查看此结构对应的表,可对数据源有基本的了解 | -| static_initalize | 记录了so初始化相关数据 | -| symbols | 记录系统调用名称和其函数指针的对应关系,trace中用addr来映射function_name来节省存储空间 | -| syscall | 记录用户空间函数与内核空间函数相互调用记录 | -| sys_event_filter | 记录所有的filter | -| sys_mem_measure | 记录了所有的系统内存相关的测量信息 | -| task_pool | 记录任务池相关数据,与callstack表相关联 | -| thread | 记录所有的线程信息 | -| thread_filter | 过滤线程 | -| thread_state | 记录线程状态信息 | -| trace_config | 记录trace数据源,proto的事件-plugin与其process_name | -| trace_range | 记录ftrace数据与其他类型数据的时间交集,供前端展示数据时使用 | +## TraceStreamer 输出数据库包含以下表格 + +| 表名称 | 作用 | +| --------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------- | +| animation | 记录动效的响应时延和完成时延 | +| app_name | 记录 HiSysEvent 事件的事件名与 IDE 部分事件的字段名为 APPNAME 中存放的相关信息的映射关系 | +| app_startup | 记录了应用启动相关数据 | +| args | 记录方法参数集合 | +| bio_latency_sample | 记录 IO 操作相关方法调用,及调用栈数据 | +| callstack | 记录调用堆栈和异步调用信息,其中 depth,stack_id 和 parent_stack_id 仅在非异步调用中有效。当 cookid 不为空时,为异步调用,此时 callid 为进程唯一号,否则为线程唯一号 | +| clk_event_filter | 记录时钟相关的信息 | +| clock_event_filter | 此结构用来维护时钟事件,cpu 与唯一的 ID 做关联 | +| clock_snapshot | 时钟号和时间,时钟名的映射表 | +| cpu_measure_filter | cpu 事件过滤器表 | +| cpu_usage | 记录 CPU 使用率事件 | +| datasource_clockid | 数据源和时钟号的映射表 | +| data_dict | 记录常用的字符串,将字符串和索引关联,降低程序运行的内存占用,用作辅助数据 | +| data_type | 记录数据类型和 typeId 的关联关系 | +| device_info | 记录设备分辨率和帧率 | +| device_state | 记录设备屏幕亮度,蓝牙,位置,wifi,音乐,媒体等信息 | +| diskio | 记录磁盘读写数据事件 | +| dynamic_frame | 记录动效帧的分辨率和结束时间等 | +| ebpf_callstack | 记录了采样相关信息 | +| file_system_sample | 记录了调用栈的相关信息 | +| frame_maps | 记录应用到 RS 的帧的映射关系 | +| frame_slice | 记录 RS(RenderService)和应用的帧渲染 | +| gpu_slice | 记录 RS 的帧对应的 gpu 渲染时长 | +| hidump | 记录 FPS(Frame Per Second)数据 | +| hisys_event_measure | 记录了 HiSysEvent 事件相关数据,目前 HiSysEvent 事件包括了异常事件,IDE 事件,器件状态事件 | +| instant | 记录 Sched_waking, sched_wakeup 事件, 用作 ThreadState 表的上下文使用 | +| irq | 记录中断相关事件 | +| js_config | 记录了 arkTs 数据采集的相关配置 | +| js_cpu_profiler_node | 记录了 cpu profiler 中 node 节点的数据 | +| js_cpu_profiler_sample | 记录了 cpu profiler 中 sample 节点的数据 | +| js_heap_edges | 记录了 js 内存数据类对象对应的成员的信息 | +| js_heap_files | 记录了 js 内存数据的名称和时间 | +| js_heap_info | 记录了 js 内存数据类型,如 nodes 和 edges 的字段类型和数据总数 | +| js_heap_location | 记录了 js 内存 location 节点相关数据 | +| js_heap_nodes | 记录了 js 内存类对象和其成员的对应关系 | +| js_heap_sample | 记录了 timeline 模式下的时间轴信息 | +| js_heap_string | 记录了 js 内存数据中的字符串 | +| js_heap_trace_function_info | 记录了 timeline 模式下的调用栈的每个函数信息 | +| js_heap_trace_node | 记录了 timeline 模式下的调用栈信息 | +| live_process | 记录了一些实时的进程中执行的一些数据 | +| log | 记录 hilog 打印日志数据 | +| measure | 记录所有的计量值 | +| measure_filter | 记录一个递增的 filterid 队列,所有其他的 filter 类型在获取过程中,均从此数据列表中获取下一个可用的 filter_id 并做记录 | +| memory_ashmem | 记录了进程所占用的 ashmem 相关信息 | +| memory_dma | 记录了进程占用的 DMA 内存相关信息 | +| memory_process_gpu | 记录进程占用 GPU 内存相关信息 | +| memory_window_gpu | 记录窗口占用 GPU 内存相关信息 | +| meta | 记录执行解析操作相关的基本信息 | +| native_hook | 记录堆内存申请与释放相关的数据 | +| native_hook_frame | 记录堆内存申请与释放相关的调用栈 | +| native_hook_statistic | 记录堆内存申请与释放相关的统计信息 | +| network | 抓取网络信息传输时产生的一些相关信息 | +| paged_memory_sample | 记录内存操作相关方法调用,及调用栈数据 | +| perf_callchain | 记录 Hiperf 采样数据的调用栈信息 | +| perf_files | 记录 Hiperf 工具采集到的函数符号表和文件名 | +| perf_report | 记录 Hiperf 工具采集数据时的配置信息。包括 | 抓取的事件类型,抓取数据的命令, 抓数据时指定的进程名称 | +| perf_sample | 记录 Hiperf 工具的采样信息 | +| perf_thread | 记录 Hiperf 工具采集到的进程和线程数据 | +| process | 记录所有的进程信息 | +| process_filter | 过滤进程 | +| process_measure | 保存进程的所有计量值 | +| process_measure_filter | 将进程 ID 作为 key1,进程的内存,界面刷新,屏幕亮度等信息作为 key2,唯一确定一个 filter_id | +| raw | 此数据结构主要作为 ThreadState 的上下文使用,这张表是 sched_waking,sched_wakup, cpu_idle 事件的原始记录 | +| sched_slice | 此数据结构主要作为 ThreadState 的上下文使用,这张表是 sched_switch 事件的原始记录 | +| smaps | 记录进程的内存消耗的相关信息采样 | +| stat | 此结果用来统计数据解析中各类数据的数据条数,数据和合法性,数据的匹配程度(begin-end),数据的损失等,查看此结构对应的表,可对数据源有基本的了解 | +| static_initalize | 记录了 so 初始化相关数据 | +| symbols | 记录系统调用名称和其函数指针的对应关系,trace 中用 addr 来映射 function_name 来节省存储空间 | +| syscall | 记录用户空间函数与内核空间函数相互调用记录 | +| sys_event_filter | 记录所有的 filter | +| sys_mem_measure | 记录了所有的系统内存相关的测量信息 | +| task_pool | 记录任务池相关数据,与 callstack 表相关联 | +| thread | 记录所有的线程信息 | +| thread_filter | 过滤线程 | +| thread_state | 记录线程状态信息 | +| trace_config | 记录 trace 数据源,proto 的事件-plugin 与其 process_name | +| trace_range | 记录 ftrace 数据与其他类型数据的时间交集,供前端展示数据时使用 | ## 表与事件来源 | 表名称 | 事件源 | 插件名 | 备注 | | --------------------------- | ------ | --------------------- | -------------------------------------------------- | | animation | - | ftrace-plugin | 记录动效的响应时延和完成时延 | -| app_name | - | hisysevent-plugin | JSON数据源 | -| args | - | ftrace-plugin | 配合callstack使用 | -| bio_latency_sample | - | - | IO操作相关方法调用,及调用栈数据 | +| app_name | - | hisysevent-plugin | JSON 数据源 | +| args | - | ftrace-plugin | 配合 callstack 使用 | +| bio_latency_sample | - | - | IO 操作相关方法调用,及调用栈数据 | | callstack | - | ftrace-plugin | 异步或非异步的调用 | -| cpu_measure_filter | - | ftrace-plugin | cpu跟踪器,cpu频率等 | -| cpu_usage | - | cpu-plugin | cpu使用率 | +| cpu_measure_filter | - | ftrace-plugin | cpu 跟踪器,cpu 频率等 | +| cpu_usage | - | cpu-plugin | cpu 使用率 | | data_dict | 通用的 | - | 所有字符串的记录 | | data_type | 通用的 | - | 辅助表 | | device_info | - | ftrace-plugin | 记录设备分辨率和帧率 | | device_state | 通用的 | hisysevent-plugin | 记录设备屏幕亮度,蓝牙,位置等信息 | | dynamic_frame | - | ftrace-plugin | 动效帧的分辨率和结束时间等 | | ebpf_callstack | - | - | 磁盘读写相关的数据 | -| file_system_callstack | - | - | ebpf文件系统 | -| file_system_sample | - | - | ebpf文件系统 | -| frame_maps | - | ftrace-plugin | 帧渲染数据,app到RS的映射 | +| file_system_callstack | - | - | ebpf 文件系统 | +| file_system_sample | - | - | ebpf 文件系统 | +| frame_maps | - | ftrace-plugin | 帧渲染数据,app 到 RS 的映射 | | frame_slice | - | ftrace-plugin | 帧渲染数据 | -| gpu_slice | - | ftrace-plugin | gpu渲染时长 | -| hidump | - | hidump-plugin | FPS数据 | -| hisys_event_measure | - | hisysevent-plugin | JSON数据源 | -| instant | - | ftrace-plugin | waking和wakeup事件 | +| gpu_slice | - | ftrace-plugin | gpu 渲染时长 | +| hidump | - | hidump-plugin | FPS 数据 | +| hisys_event_measure | - | hisysevent-plugin | JSON 数据源 | +| instant | - | ftrace-plugin | waking 和 wakeup 事件 | | irq | - | ftrace-plugin | 记录中断事件 | -| js_config | - | arkts-plugin | arkTs数据采集的配置 | -| js_cpu_profiler_node | - | arkts-plugin | 记录了cpu profiler中node节点的数据 | -| js_cpu_profiler_sample | - | arkts-plugin | 记录了cpu profiler中sample节点的数据 | -| js_heap_edges | - | arkts-plugin | js内存数据 | -| js_heap_files | - | arkts-plugin | js内存数据 | -| js_heap_info | - | arkts-plugin | js内存数据 | -| js_heap_location | - | arkts-plugin | js内存数据 | -| js_heap_nodes | - | arkts-plugin | js内存数据 | -| js_heap_sample | - | arkts-plugin | js内存数据 | -| js_heap_string | - | arkts-plugin | js内存数据 | -| js_heap_trace_function_info | - | arkts-plugin | js内存数据 | -| js_heap_trace_node | - | arkts-plugin | js内存数据 | +| js_config | - | arkts-plugin | arkTs 数据采集的配置 | +| js_cpu_profiler_node | - | arkts-plugin | 记录了 cpu profiler 中 node 节点的数据 | +| js_cpu_profiler_sample | - | arkts-plugin | 记录了 cpu profiler 中 sample 节点的数据 | +| js_heap_edges | - | arkts-plugin | js 内存数据 | +| js_heap_files | - | arkts-plugin | js 内存数据 | +| js_heap_info | - | arkts-plugin | js 内存数据 | +| js_heap_location | - | arkts-plugin | js 内存数据 | +| js_heap_nodes | - | arkts-plugin | js 内存数据 | +| js_heap_sample | - | arkts-plugin | js 内存数据 | +| js_heap_string | - | arkts-plugin | js 内存数据 | +| js_heap_trace_function_info | - | arkts-plugin | js 内存数据 | +| js_heap_trace_node | - | arkts-plugin | js 内存数据 | | app_startup | - | ftrace-plugin | 应用启动数据 | -| static_initalize | - | ftrace-plugin | so初始化数据 | -| live_process | - | process-plugin | Monitor数据 | -| network | - | network-plugin | Monitor数据 | -| diskio | - | diskio-plugin | Monitor数据 | +| static_initalize | - | ftrace-plugin | so 初始化数据 | +| live_process | - | process-plugin | Monitor 数据 | +| network | - | network-plugin | Monitor 数据 | +| diskio | - | diskio-plugin | Monitor 数据 | | log | - | hilog-plugin | 系统日志 | | measure | 通用的 | - | 系统中的计量值(数值型) | | measure_filter | 通用的 | - | 计量值的查询辅助表 | -| memory_ashmem | - | memory-plugin | 进程所占用ashmem相关信息 | -| memory_dma | - | memory-plugin | 进程占用的DMA内存相关信息 | -| memory_process_gpu | - | memory-plugin | 进程占用GPU内存相关信息 | -| memory_window_gpu | - | memory-plugin | 窗口占用GPU内存相关信息 | +| memory_ashmem | - | memory-plugin | 进程所占用 ashmem 相关信息 | +| memory_dma | - | memory-plugin | 进程占用的 DMA 内存相关信息 | +| memory_process_gpu | - | memory-plugin | 进程占用 GPU 内存相关信息 | +| memory_window_gpu | - | memory-plugin | 窗口占用 GPU 内存相关信息 | | meta | 通用的 | - | 记录解析现场数据(解析时间,数据类型,解析工具等) | -| native_hook | - | nativehook/hookdaemon | malloc && mmap内存数据 | -| native_hook_frame | - | nativehook/hookdaemon | native_hook调用栈数据 | -| native_hook_statistic | - | nativehook/hookdaemon | malloc && mmap统计数据 | +| native_hook | - | nativehook/hookdaemon | malloc && mmap 内存数据 | +| native_hook_frame | - | nativehook/hookdaemon | native_hook 调用栈数据 | +| native_hook_statistic | - | nativehook/hookdaemon | malloc && mmap 统计数据 | | paged_memory_sample | - | - | 网络数据传输相关的信息 | -| perf_callchain | - | perf-plugin | perf数据(非插件模式) | -| perf_files | - | - | perf数据(非插件模式) | -| perf_report | - | - | perf数据(非插件模式) | -| perf_sample | - | - | perf数据(非插件模式) | -| perf_thread | - | - | perf数据(非插件模式) | +| perf_callchain | - | perf-plugin | perf 数据(非插件模式) | +| perf_files | - | - | perf 数据(非插件模式) | +| perf_report | - | - | perf 数据(非插件模式) | +| perf_sample | - | - | perf 数据(非插件模式) | +| perf_thread | - | - | perf 数据(非插件模式) | | process | - | ftrace-plugin | 进程信息 | | process_filter | - | ftrace-plugin | 进程计量表的辅助表 | | process_measure | - | ftrace-plugin | 进程内存 | -| process_measure_filter | - | ftrace-plugin | process_measure的辅助表 | +| process_measure_filter | - | ftrace-plugin | process_measure 的辅助表 | | raw | - | ftrace-plugin | 线程唤醒信息 | -| sched_slice | - | ftrace-plugin | 配合现场状态表使用,dsched_switch的原始数据 | +| sched_slice | - | ftrace-plugin | 配合现场状态表使用,dsched_switch 的原始数据 | | smaps | - | memory-plugin | 进程的内存消耗 | | stat | 通用的 | - | 记录不同种类数据的数据量 | | symbols | - | ftrace-plugin | 符号表(地址到字符串的映射) | @@ -169,8 +169,8 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库 | sys_mem_measure | - | memory-plugin | 系统内存 | | thread | 通用的 | - | 线程信息(常用) | | thread_state | 通用的 | ftrace-plugin | 线程调度图(常用) | -| trace_config | 通用的 | hisysevent-plugin | 记录trace数据源 | -| trace_range | 通用的 | - | trace数据的时长 | +| trace_config | 通用的 | hisysevent-plugin | 记录 trace 数据源 | +| trace_range | 通用的 | - | trace 数据的时长 | | thread_filter | 通用的 | ftrace-plugin | 线程计量跟踪表(比较少用) | | clock_snapshot | 通用的 | 通用的 | 时钟号和时间,时钟名的映射表 | | datasource_clockid | 通用的 | 通用的 | 数据源和时钟号的映射表 | @@ -183,84 +183,84 @@ TraceStreamer可以将trace数据源转化为易于理解和使用的数据库 ### 进程表与线程表关系 当一个进程或者线程结束后,系统可能再次将该进程号或者线程号分配给其他进程或者线程,造成一个进程号或线程号代表多个进程或线程的情况。 -Process和Thread表中的id字段可以唯一标识进程和线程。process表中的id在其他表中用作ipid字段。thread表中的id在其他表中用作itid字段。 -thread表通过ipid字段关联process表的id字段,可以查询线程归属进程。 +Process 和 Thread 表中的 id 字段可以唯一标识进程和线程。process 表中的 id 在其他表中用作 ipid 字段。thread 表中的 id 在其他表中用作 itid 字段。 +thread 表通过 ipid 字段关联 process 表的 id 字段,可以查询线程归属进程。 ![GitHub Logo](../../figures/traceStreamer/process_thread.png) ### 查询举例 -- 已知pid = 123,查看当前进程下的所有线程信息,可以使用如下SQL语句: +- 已知 pid = 123,查看当前进程下的所有线程信息,可以使用如下 SQL 语句: `select thread.* from thread, process where process.pid = 123 and thread.ipid = process.id` ### 线程表与线程运行状态表关系图 -thread_state表记录所有线程的运行状态信息,包含ts(状态起始时间),dur(状态持续时间),cpu, itid, state(线程状态)。 thread表的id字段与thread_state表的itid字段相关联。 +thread_state 表记录所有线程的运行状态信息,包含 ts(状态起始时间),dur(状态持续时间),cpu, itid, state(线程状态)。 thread 表的 id 字段与 thread_state 表的 itid 字段相关联。 ![GitHub Logo](../../figures/traceStreamer/thread_state.png) ### 查询举例 -- 已知tid = 123, 查看当前线程的所有运行状态信息,可以使用如下SQL语句: +- 已知 tid = 123, 查看当前线程的所有运行状态信息,可以使用如下 SQL 语句: `select thread_state.* from thread, thread_state where thread.tid = 123 and thread.id = thread_state.itid` ### 堆内存数据变化表关系图 -native_hook表记录堆内存申请(AllocEvent)和释放(FreeEvent)数据。native_hook表通过ipid和itid字段分别与process和thread表的id字段关联,通过callChainId与native_hook_frame表的callChainId字段相关联。 -native_hook表字段解释如下: +native_hook 表记录堆内存申请(AllocEvent)和释放(FreeEvent)数据。native_hook 表通过 ipid 和 itid 字段分别与 process 和 thread 表的 id 字段关联,通过 callChainId 与 native_hook_frame 表的 callChainId 字段相关联。 +native_hook 表字段解释如下: -- callChainId:唯一标识一次堆内存申请或释放, 通过与native_hook_frame表关联可以拿到当前申请或释放的函数调用堆栈。 +- callChainId:唯一标识一次堆内存申请或释放, 通过与 native_hook_frame 表关联可以拿到当前申请或释放的函数调用堆栈。 - addr:堆内存申请/释放的地址。 - native_hook_size:堆内存申请/释放的大小。 -native_hook_frame表记录内存申请/释放的调用堆栈。通过callChainId区分一组调用堆栈,depth为堆栈深度,depth为0时,表示当前行为栈顶数据。 +native_hook_frame 表记录内存申请/释放的调用堆栈。通过 callChainId 区分一组调用堆栈,depth 为堆栈深度,depth 为 0 时,表示当前行为栈顶数据。 ![GitHub Logo](../../figures/traceStreamer/dump_and_mem.png) -native_hook_statistic表记录内存申请/释放的统计信息。通过callChainId区分一组调用堆栈。每个统计事件将记录当前事件的callChainId,并统计当前调用栈内存分配/释放的总次数和总大小。 +native_hook_statistic 表记录内存申请/释放的统计信息。通过 callChainId 区分一组调用堆栈。每个统计事件将记录当前事件的 callChainId,并统计当前调用栈内存分配/释放的总次数和总大小。 ![GitHub Logo](../../figures/traceStreamer/db_native_hook_statistic.png) ### 查询举例 -- 已知tid = 123,查看当前线程的所有堆内存变化信息,可以使用如下SQL语句: +- 已知 tid = 123,查看当前线程的所有堆内存变化信息,可以使用如下 SQL 语句: `select native_hook.* from thread, native_hook where thread.tid = 123 and thread.id = native_hook.itid` -- 已知callchainid = 1, 查看当前内存变化调用堆栈 +- 已知 callchainid = 1, 查看当前内存变化调用堆栈 `select * from native_hook_frame where callchain_id = 1` -- 已知callchainid = 1, 查看当前内存变化调用堆栈对应的统计信息 +- 已知 callchainid = 1, 查看当前内存变化调用堆栈对应的统计信息 `select * from native_hook_statistic where callchain_id = 1` ### 日志表与进程线程表关系图 -log表记录日志信息。可以根据seq字段的连续性,来判断是否存在日志丢失的情况。 +log 表记录日志信息。可以根据 seq 字段的连续性,来判断是否存在日志丢失的情况。 ![GitHub Logo](../../figures/traceStreamer/log.png) ### 查询举例 -- 已知tid = 123,查看当前线程的所有error级别的日志,可以使用如下SQL语句: +- 已知 tid = 123,查看当前线程的所有 error 级别的日志,可以使用如下 SQL 语句: `select * from log where tid = 123 and level = "error"` -### perf表之间关系图 +### perf 表之间关系图 -- perf_report:此表记录Hiperf工具采集数据时的配置信息。 -- perf_thread:此表记录hiperf采集到的进程和线程数据。 -- perf_sample:此表中记录Hiperf工具的采样信息。sample_id唯一表识一次采样记录,与perf_callchain表中的sample_id字段相关联。thread_id为线程号。与perf_thread表中的thread_id字段相关联。event_type_id为当前采样的事件类型id,与perf_report表中的id字段相关联。 +- perf_report:此表记录 Hiperf 工具采集数据时的配置信息。 +- perf_thread:此表记录 hiperf 采集到的进程和线程数据。 +- perf_sample:此表中记录 Hiperf 工具的采样信息。sample_id 唯一表识一次采样记录,与 perf_callchain 表中的 sample_id 字段相关联。thread_id 为线程号。与 perf_thread 表中的 thread_id 字段相关联。event_type_id 为当前采样的事件类型 id,与 perf_report 表中的 id 字段相关联。 - perf_callchain:此表格记录的是调用栈信息。 -- Perf_files:此表格主要存放着获取到的函数符号表和文件信息。file_id唯一表识一个文件,与perf_callchain表中的file_id字段相关联。 +- Perf_files:此表格主要存放着获取到的函数符号表和文件信息。file_id 唯一表识一个文件,与 perf_callchain 表中的 file_id 字段相关联。 ![GitHub Logo](../../figures/traceStreamer/perf.png) ### 查询举例 -- 已知同步后的时间戳为28463134340470,查询采样数据 +- 已知同步后的时间戳为 28463134340470,查询采样数据 `select * from perf_sample where timestamp_trace = 28463134340470` -- 已知同步后的时间戳为28463134340470,查询采样数据对应的的调用栈信息 +- 已知同步后的时间戳为 28463134340470,查询采样数据对应的的调用栈信息 `select A.* from perf_callchain as A, perf_sample as B where B.timestamp_trace = 28463134340470 and A.sample_id = B.sample_id` -- 已知同步后的时间戳为28463134277762,查询采样数据的函数名及文件路径 +- 已知同步后的时间戳为 28463134277762,查询采样数据的函数名及文件路径 `select A.*, B.name, C.path from perf_sample as A, perf_callchain as B, perf_files as C where A.timestamp_trace = 28463134277762 and B.sample_id = A.sample_id and B.callchain_id = 0 and B.file_id = C.file_id and C.serial_id = 0` -- 已知线程号为6700,查询所有的采样记录 +- 已知线程号为 6700,查询所有的采样记录 `select * from perf_sample where thread_id = 6700` -- 已知进程号为7863,查询所有的采样记录 +- 已知进程号为 7863,查询所有的采样记录 `select A.* from perf_sample as A, perf_thread as B where B.process_id = 7863 and A.thread_id = B.thread_id` - 查询所有采样对应的事件类型 @@ -268,9 +268,9 @@ log表记录日志信息。可以根据seq字段的连续性,来判断是否 ### 帧渲染表之间的关系图 -frame_slice: 记录RS(RenderService)和应用的帧渲染。 -gpu_slice: 记录RS的帧对应的gpu渲染时长。 -frame_maps:记录应用到RS的帧的映射关系。 +frame_slice: 记录 RS(RenderService)和应用的帧渲染。 +gpu_slice: 记录 RS 的帧对应的 gpu 渲染时长。 +frame_maps:记录应用到 RS 的帧的映射关系。 ![GitHub Logo](../../figures/traceStreamer/frames.jpg) ### 查询示例 @@ -278,27 +278,27 @@ frame_maps:记录应用到RS的帧的映射关系。 - 已知进程,查询进程对应的实际渲染帧 `select * from frame_slice where ipid = 1` -- 已知进程的实际渲染帧的dst为12,求其对应的RS进程的渲染帧 +- 已知进程的实际渲染帧的 dst 为 12,求其对应的 RS 进程的渲染帧 `select * from frame_slice where id = 12 ` -- 已知RS的渲染帧在frame_slice中所在行是14,求其对应的GPU渲染时长 +- 已知 RS 的渲染帧在 frame_slice 中所在行是 14,求其对应的 GPU 渲染时长 `select * from gpu_slice where frame_row = 14` -### JS内存数据表关系图 +### JS 内存数据表关系图 -js_heap_files:记录js内存数据的文件名和文件索引 +js_heap_files:记录 js 内存数据的文件名和文件索引 ![1683163158954](image/des_tables/js_heap_files.png) -js_heap_nodes:记录js内存类对象数据 -js_heap_edges:记录js内存类对象的成员数据 -js_heap_trace_node:记录timeline的调用栈信息 -js_heap_sample:记录timeline的时间轴信息 +js_heap_nodes:记录 js 内存类对象数据 +js_heap_edges:记录 js 内存类对象的成员数据 +js_heap_trace_node:记录 timeline 的调用栈信息 +js_heap_sample:记录 timeline 的时间轴信息 ![1683163373206](image/des_tables/js_heap_nodes.png) -## TraceStreamer输出数据库表格详细介绍 +## TraceStreamer 输出数据库表格详细介绍 -### app_name表 +### app_name 表 #### 表结构 @@ -311,15 +311,15 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录HiSysevent上报事件中的IDE相关事件中APPNAME的表关联信息。 +记录 HiSysevent 上报事件中的 IDE 相关事件中 APPNAME 的表关联信息。 #### 字段详细描述 -- id:用于与表hisys_event_measure表中的key_id字段做对应 -- app_name:对应的事件的信息ID -- app_key:对应的事件的APPNAME字段的信息ID +- id:用于与表 hisys_event_measure 表中的 key_id 字段做对应 +- app_name:对应的事件的信息 ID +- app_key:对应的事件的 APPNAME 字段的信息 ID -### args表 +### args 表 #### 表结构 @@ -342,7 +342,7 @@ js_heap_sample:记录timeline的时间轴信息 - value:取值 - argset:参数集合 -### bio_latency_sample表 +### bio_latency_sample 表 #### 表结构 @@ -365,24 +365,24 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录IO操作相关方法调用,及调用栈数据。 +记录 IO 操作相关方法调用,及调用栈数据。 #### 字段详细描述 -- callchain_id:调用栈的唯一标识。与ebpf_callstack表中Callchain_id字段关联 +- callchain_id:调用栈的唯一标识。与 ebpf_callstack 表中 Callchain_id 字段关联 - type:事件类型其取值为枚举类型(DATA_READ,DATA_WRITE,METADATA_READ,- METADATA_WRITE,PAGE_IN,PAGE_OUT) -- ipid:TS内部进程号 -- itid:TS内部线程号 +- ipid:TS 内部进程号 +- itid:TS 内部线程号 - start_ts:开始时间 - end_ts:结束时间 - latency_dur:总延迟 - tier:优先级 - size:文件大小 -- block_number:数据量大小(一般为4K) -- path:路径id -- dur_per_4k:每4k数据的平均延迟 +- block_number:数据量大小(一般为 4K) +- path:路径 id +- dur_per_4k:每 4k 数据的平均延迟 -### callstack表 +### callstack 表 #### 表结构 @@ -407,21 +407,21 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录调用堆栈和异步调用信息,其中depth,stack_id和parent_stack_id仅在非异步的调用中有效。当cookid不为空时,为异步调用,此时callid为进程唯一号,否则为线程唯一号。 +记录调用堆栈和异步调用信息,其中 depth,stack_id 和 parent_stack_id 仅在非异步的调用中有效。当 cookid 不为空时,为异步调用,此时 callid 为进程唯一号,否则为线程唯一号。 #### 字段详细描述 - dur:调用时长 -- callid:调用者的ID,比如针对线程表里面的id -- identify:调用栈的名字,与表dataDict相关联能够取出其string值 +- callid:调用者的 ID,比如针对线程表里面的 id +- identify:调用栈的名字,与表 dataDict 相关联能够取出其 string 值 - name:调用名称 - depth:调用深度 -- parent_id:父调用的id +- parent_id:父调用的 id - spanId:分布式调用关联关系 -- flag:C表示分布式调用发送方,S表示接受方 +- flag:C 表示分布式调用发送方,S 表示接受方 - args:分布式调用函数参数 -### clk_event_filter表 +### clk_event_filter 表 #### 表结构 @@ -441,7 +441,7 @@ js_heap_sample:记录timeline的时间轴信息 - Type:时钟事件类型 - Name:时钟事件名称 -### clock_event_filter表 +### clock_event_filter 表 #### 表结构 @@ -454,14 +454,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -此结构用来维护时钟事件,cpu与唯一的ID做关联。 +此结构用来维护时钟事件,cpu 与唯一的 ID 做关联。 #### 主要字段描述 - Type:时钟事件类型 - Name:时钟事件名称 -### cpu_measure_filter表 +### cpu_measure_filter 表 #### 表结构 @@ -474,13 +474,13 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -将cpu号作为key1,cpu的频率,空闲等状态作为key2,唯一确定一个filter_id。 +将 cpu 号作为 key1,cpu 的频率,空闲等状态作为 key2,唯一确定一个 filter_id。 #### 主要字段描述 -- Id(filterid), cpu:事件名称,cpu号 +- Id(filterid), cpu:事件名称,cpu 号 -### cpu_usage表 +### cpu_usage 表 #### 表结构 @@ -495,7 +495,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了与CPU使用率相关的数据。 +记录了与 CPU 使用率相关的数据。 #### 主要字段描述 @@ -504,7 +504,7 @@ js_heap_sample:记录timeline的时间轴信息 - system_load:系统负载 - process_num:线程数 -### data_dict表 +### data_dict 表 #### 表结构 @@ -515,14 +515,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -此表记录了一个数据类型ID和字符串的映射。 +此表记录了一个数据类型 ID 和字符串的映射。 #### 主要字段描述 - id:索引值 - data:字符串 -### data_type表 +### data_type 表 #### 表结构 @@ -534,14 +534,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -此表记录了一个数据类型ID和数据描述的映射。 +此表记录了一个数据类型 ID 和数据描述的映射。 #### 主要字段描述 -- typeId::数据类型id +- typeId::数据类型 id - Desc:数据类型描述 -### diskio表 +### diskio 表 #### 表结构 @@ -568,7 +568,7 @@ js_heap_sample:记录timeline的时间轴信息 - wr_sectors_kb:写入数据的速度 - ts:时间戳 -### ebpf_callstack表 +### ebpf_callstack 表 #### 表结构 @@ -589,11 +589,11 @@ js_heap_sample:记录timeline的时间轴信息 - callchain_id:调用栈的唯一标识 - depth:调用栈深度。取值为零时表示栈顶 -- ip:调用栈ip -- symbols_id:调用栈函数名称, 与data_dict中的id字段关联 -- file_path_id:调用栈函数所属文件路径, 与data_dict中的id字段关联 +- ip:调用栈 ip +- symbols_id:调用栈函数名称, 与 data_dict 中的 id 字段关联 +- file_path_id:调用栈函数所属文件路径, 与 data_dict 中的 id 字段关联 -### file_system_sample表 +### file_system_sample 表 #### 表结构 @@ -622,23 +622,23 @@ js_heap_sample:记录timeline的时间轴信息 #### 主要字段描述 -- callchain_id:调用栈信息ID与file_system_callstack表中call_chain_id字段相关联 -- type:对应文件操作open,close,read,write -- ipid:线程所属的进程ID +- callchain_id:调用栈信息 ID 与 file_system_callstack 表中 call_chain_id 字段相关联 +- type:对应文件操作 open,close,read,write +- ipid:线程所属的进程 ID - start_ts:开始时间 - end_ts:结束时间 - dur:耗时 - return_value:文件操作的返回值 - error_code:文件操作发生错误时的错误码 -- fd:文件描述符fd -- file_id:当type为open,close时为其操作的文件路径,当type为read,write时为固定字段(null) -- size:在type为read,write时对应的文件的读或者写的大小 +- fd:文件描述符 fd +- file_id:当 type 为 open,close 时为其操作的文件路径,当 type 为 read,write 时为固定字段(null) +- size:在 type 为 read,write 时对应的文件的读或者写的大小 - first_argument:参数一 - second_argument:参数二 - third_argument:参数三 - fourth_argument:参数四 -### hidump表 +### hidump 表 #### 表结构 @@ -656,7 +656,7 @@ js_heap_sample:记录timeline的时间轴信息 - fps:帧率值 -### hisys_event_measure表 +### hisys_event_measure 表 #### 表结构 @@ -672,18 +672,18 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录所有的system event事件的相关数据,及其相关表的映射信息。 +记录所有的 system event 事件的相关数据,及其相关表的映射信息。 #### 相关字段描述 -- serial:每条数据过来携带唯一一条id作为标识 -- name_id:存放事件对应的ID,与data_dict表相关联可以取出对应的字段 -- key_id:存放事件包含的字段的ID,与表app_name的id字段相关联,找到app_name表的 id字段对应行的app_key字段与表data_dict表相关联取出对应的字段 -- type:存放事件所包含的字段的值所属的类型为int型还是string(0为int,1为string) -- int_value:存放本事件所包含的字段的int型的值 -- string_value:存放本事件所包含的字段的string型的值 +- serial:每条数据过来携带唯一一条 id 作为标识 +- name_id:存放事件对应的 ID,与 data_dict 表相关联可以取出对应的字段 +- key_id:存放事件包含的字段的 ID,与表 app_name 的 id 字段相关联,找到 app_name 表的 id 字段对应行的 app_key 字段与表 data_dict 表相关联取出对应的字段 +- type:存放事件所包含的字段的值所属的类型为 int 型还是 string(0 为 int,1 为 string) +- int_value:存放本事件所包含的字段的 int 型的值 +- string_value:存放本事件所包含的字段的 string 型的值 -### instant表 +### instant 表 #### 表结构 @@ -698,7 +698,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了系统中的waking和wakeup事件。 +记录了系统中的 waking 和 wakeup 事件。 #### 字段描述 @@ -706,10 +706,10 @@ js_heap_sample:记录timeline的时间轴信息 - name:唤醒事件的名称 - ref:索引号 - wakeup_from:唤醒当前线程的内部线程号(itid) -- ref_type:描述了value字段的类型(一般取值为itid) +- ref_type:描述了 value 字段的类型(一般取值为 itid) - value:一般为当前线程的内部线程号取值 -### irq表 +### irq 表 #### 表结构 @@ -738,14 +738,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 相关字段描述 - dur:调用中断时长 -- callid:调用中断者的ID,比如针对线程表里面的id +- callid:调用中断者的 ID,比如针对线程表里面的 id - cat:调用栈数据类型(取值范围:irq,softirq...) - name:调用中断的名称 - depth:中断调用的深度 -- parent_id:父调用中断的id +- parent_id:父调用中断的 id - spanId:分布式调用中断关联关系 -### js_config表 +### js_config 表 #### 表结构 @@ -761,19 +761,19 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录arkTs数据采集的相关配置。 +记录 arkTs 数据采集的相关配置。 #### 相关字段描述 -- pid:目标进程ID。 -- type:JS数据类型,取值与枚举HeapType对应,0表示JS内存数据为snapshot类型,1表示JS内存数据为timeline类型,-1表示没有JS内存数据。 -- interval:当type=0时生效,单位是秒,表示一次snapshot事件和下一次snapshot事件之间的间隔。 -- capture_numeric_value:当type=0时生效,表示是否同时抓取numeric。 -- track_allocation:当type=1时生效,表示是否抓取allocations。 -- enable_cpu_profiler:表示是否存在cpuprofiler的数据。 -- cpu_profiler_interval:表示cpuprofiler数据的采集间隔。 +- pid:目标进程 ID。 +- type:JS 数据类型,取值与枚举 HeapType 对应,0 表示 JS 内存数据为 snapshot 类型,1 表示 JS 内存数据为 timeline 类型,-1 表示没有 JS 内存数据。 +- interval:当 type=0 时生效,单位是秒,表示一次 snapshot 事件和下一次 snapshot 事件之间的间隔。 +- capture_numeric_value:当 type=0 时生效,表示是否同时抓取 numeric。 +- track_allocation:当 type=1 时生效,表示是否抓取 allocations。 +- enable_cpu_profiler:表示是否存在 cpuprofiler 的数据。 +- cpu_profiler_interval:表示 cpuprofiler 数据的采集间隔。 -### js_cpu_profiler_node表 +### js_cpu_profiler_node 表 #### 表结构 @@ -791,21 +791,21 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录cpu profiler中node节点的数据。 +记录 cpu profiler 中 node 节点的数据。 #### 相关字段描述 -- function_id: 函数的ID号。 -- function_index:函数名称在data_dict中的索引号。 -- script_id:关联到的类对象所在文件的绝对路径ID。 -- url_index:关联到的类对象所在文件的绝对路径名称在data_dict中的索引号。 +- function_id: 函数的 ID 号。 +- function_index:函数名称在 data_dict 中的索引号。 +- script_id:关联到的类对象所在文件的绝对路径 ID。 +- url_index:关联到的类对象所在文件的绝对路径名称在 data_dict 中的索引号。 - line_number:类对象所在文件的行号。 - column_number:类对象所在文件的列号。 - hit_count:采样次数。 -- children:子节点的id号。 -- parent_id:父节点的id号。 +- children:子节点的 id 号。 +- parent_id:父节点的 id 号。 -### js_cpu_profiler_sample表 +### js_cpu_profiler_sample 表 #### 表结构 @@ -819,17 +819,17 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了cpu profiler 中sample节点的数据。 +记录了 cpu profiler 中 sample 节点的数据。 #### 相关字段描述 -- id: ts内部ID号。 -- function_id:函数的ID号。 +- id: ts 内部 ID 号。 +- function_id:函数的 ID 号。 - start_time:数据上报的起始时间。 - end_time:数据上报的终止时间。 - dur:数据上报的间隔时间。 -### js_heap_edges表 +### js_heap_edges 表 #### 表结构 @@ -845,19 +845,19 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录js内存数据类对象对应的成员的信息。 +记录 js 内存数据类对象对应的成员的信息。 #### 相关字段描述 -- file_id:文件ID +- file_id:文件 ID - edge_index:成员的索引号 -- type:成员的类型,取值范围为js_heap_info表中的edge_types -- name_or_index:数据名称,取值为js_heap_string表中的下标索引 -- to_node:此成员指向的类对象在nodes数组中的索引 -- from_node_id:类对象ID,该类对象指向此成员数据 -- to_node_id:此成员指向到的类对象nodes数组中的ID +- type:成员的类型,取值范围为 js_heap_info 表中的 edge_types +- name_or_index:数据名称,取值为 js_heap_string 表中的下标索引 +- to_node:此成员指向的类对象在 nodes 数组中的索引 +- from_node_id:类对象 ID,该类对象指向此成员数据 +- to_node_id:此成员指向到的类对象 nodes 数组中的 ID -### js_heap_files表 +### js_heap_files 表 #### 表结构 @@ -871,17 +871,17 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了js内存数据的文件名称和时间。 +记录了 js 内存数据的文件名称和时间。 #### 相关字段描述 -- id:文件ID +- id:文件 ID - file_name:文件名称 - start_time:数据抓取的起始时间 - end_time:数据抓取的终止时间 - pid:进程号 -### js_heap_info表 +### js_heap_info 表 #### 表结构 @@ -895,17 +895,17 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了js内存数据类型,如nodes和edges的字段类型和数据总数。 +记录了 js 内存数据类型,如 nodes 和 edges 的字段类型和数据总数。 #### 相关字段描述 -- file_id:文件ID +- file_id:文件 ID - key:类型名称 - type:数据类型索引 -- int_value:int类型的数据值,如count类型数据 -- str_value:string类型的数据值,如typename +- int_value:int 类型的数据值,如 count 类型数据 +- str_value:string 类型的数据值,如 typename -### js_heap_location表 +### js_heap_location 表 #### 表结构 @@ -919,17 +919,17 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了js内存location节点相关数据,此表目前无抓取到的数据。 +记录了 js 内存 location 节点相关数据,此表目前无抓取到的数据。 #### 相关字段描述 -- file_id:文件ID -- object_index:与location关联的类对象的索引,取值为js_heap_nodes的下标索引 -- script_id:关联到的类对象所在文件的绝对路径ID +- file_id:文件 ID +- object_index:与 location 关联的类对象的索引,取值为 js_heap_nodes 的下标索引 +- script_id:关联到的类对象所在文件的绝对路径 ID - line:在类对象所在的文件中的行号 - column:在类对象所在的文件中的列号 -### js_heap_nodes表 +### js_heap_nodes 表 #### 表结构 @@ -947,21 +947,21 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了js内存数据中类对象的数据。 +记录了 js 内存数据中类对象的数据。 #### 相关字段描述 -- file_id:文件ID +- file_id:文件 ID - node_index:类对象的索引 - type:类对象的类型 - name:类对象的名称 -- id:类对象的唯一ID +- id:类对象的唯一 ID - self_size:该类对象所有成员的大小(以字节为单位) - edge_count:该类对象指向的类成员的个数 -- trace_node_id:该类对象关联到js_heap_trace_node表中的调用栈ID -- detachedness:是否可以从window全局对象访问此节点,0表示是,1表示否 +- trace_node_id:该类对象关联到 js_heap_trace_node 表中的调用栈 ID +- detachedness:是否可以从 window 全局对象访问此节点,0 表示是,1 表示否 -### js_heap_sample表 +### js_heap_sample 表 #### 表结构 @@ -973,15 +973,15 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了timeline模式下的时间轴信息。 +记录了 timeline 模式下的时间轴信息。 #### 相关字段描述 -- file_id:文件ID +- file_id:文件 ID - timestamp_us:时间信息 -- last_assigned_id:当前时间点的id +- last_assigned_id:当前时间点的 id -### js_heap_string表 +### js_heap_string 表 #### 表结构 @@ -993,15 +993,15 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了js内存数据中的字符串。 +记录了 js 内存数据中的字符串。 #### 相关字段描述 -- file_id:文件ID +- file_id:文件 ID - file_index:索引 - string:对应的字符串信息 -### js_heap_trace_function_info表 +### js_heap_trace_function_info 表 #### 表结构 @@ -1018,20 +1018,20 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了timeline模式下的调用栈的每个函数信息。 +记录了 timeline 模式下的调用栈的每个函数信息。 #### 相关字段描述 -- file_id:文件ID +- file_id:文件 ID - function_index:函数索引 -- function_id:函数ID +- function_id:函数 ID - name:函数名称 - script_name:关联到的类对象所在文件的绝对路径名称 -- script_id:关联到的类对象所在文件的绝对路径ID +- script_id:关联到的类对象所在文件的绝对路径 ID - line:在类对象所在的文件中的行号 - column:在类对象所在的文件中的列号 -### js_heap_trace_node表 +### js_heap_trace_node 表 #### 表结构 @@ -1046,18 +1046,18 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了timeline模式下的调用栈的信息。 +记录了 timeline 模式下的调用栈的信息。 #### 相关字段描述 -- file_id:文件ID +- file_id:文件 ID - id:调用栈节点索引 - function_info_index:函数信息索引 - count:调用栈个数 - size:调用栈大小 - parent_id:调用栈父节点 -### app_startup表 +### app_startup 表 #### 表结构 @@ -1077,7 +1077,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 相关字段描述 -- call_id:调用者的ID,比如针对线程表里面的id +- call_id:调用者的 ID,比如针对线程表里面的 id - ipid:内部进程号 - tid:内部线程号 - start_time:阶段开始时间 @@ -1085,7 +1085,7 @@ js_heap_sample:记录timeline的时间轴信息 - start_name:阶段名称 - packed_name:应用名称 -### static_intialize表 +### static_intialize 表 #### 表结构 @@ -1101,19 +1101,19 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了so初始化的相关信息。 +记录了 so 初始化的相关信息。 #### 相关字段描述 -- call_id:调用者的ID,比如针对线程表里面的id +- call_id:调用者的 ID,比如针对线程表里面的 id - ipid:内部进程号 - tid:内部线程号 - start_time:阶段开始时间 - end_time:阶段结束时间 -- so_name:so文件名称 +- so_name:so 文件名称 - depth:泳道图的深度 -### live_process表 +### live_process 表 #### 表结构 @@ -1139,18 +1139,18 @@ js_heap_sample:记录timeline的时间轴信息 #### 主要字段描述 -- process_id:进程id +- process_id:进程 id - process_name:进程名 -- parent_process_id:父进程的id -- uid:用户id +- parent_process_id:父进程的 id +- uid:用户 id - user_name:用户名 -- cpu_usage:cpu使用率 +- cpu_usage:cpu 使用率 - pss_info:进程信息 - thread_num:线程数量 - disk_writes:磁盘写量 - disk_reads:磁盘读量 -### log表 +### log 表 #### 表结构 @@ -1179,7 +1179,7 @@ js_heap_sample:记录timeline的时间轴信息 - Tag:日志标签 - Context:日志内容 -### measure表 +### measure 表 #### 表结构 @@ -1201,9 +1201,9 @@ js_heap_sample:记录timeline的时间轴信息 - ts:事件时间 - dur:该值持续的时长 - value:数值 -- filter_id:对应filter表中的ID +- filter_id:对应 filter 表中的 ID -### measure_filter表 +### measure_filter 表 #### 表结构 @@ -1216,14 +1216,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录一个递增的filterid队列,所有其他的filter类型在获取过程中,均从此数据列表中获取下一个可用的filter_id并做记录。 +记录一个递增的 filterid 队列,所有其他的 filter 类型在获取过程中,均从此数据列表中获取下一个可用的 filter_id 并做记录。 #### 字段详细描述 -过滤分类(type),过滤名称(key2),数据ID(key1)。 -数据ID在process_measure_filter, sys_event_filter中作为id。 +过滤分类(type),过滤名称(key2),数据 ID(key1)。 +数据 ID 在 process_measure_filter, sys_event_filter 中作为 id。 -### meta表 +### meta 表 #### 表结构 @@ -1234,14 +1234,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -此表记录了数据解析或导出时的一些现场数据,比如使用的TraceStreamer版本, 工具的发布时间,数据解析的时间,数据的持续时长,以及原始数据的格式。 +此表记录了数据解析或导出时的一些现场数据,比如使用的 TraceStreamer 版本, 工具的发布时间,数据解析的时间,数据的持续时长,以及原始数据的格式。 #### 主要字段描述 -- Name:指定元数据的key -- Value:指定元数据的value +- Name:指定元数据的 key +- Value:指定元数据的 value -### native_hook表 +### native_hook 表 #### 表结构 @@ -1264,23 +1264,23 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录native_hook抓取的某个进程的堆内存,内存映射相关数据。 +记录 native_hook 抓取的某个进程的堆内存,内存映射相关数据。 #### 关键字段描述 -- callChainId:唯一标识一条native_hook数据 +- callChainId:唯一标识一条 native_hook 数据 - event_type:事件类型取值范围(AllocEvent,FreeEvent,MmapEvent, MunmapEvent) -- sub_type_id:子事件类型(只有sub_type字段为MmapEvent时,该字段才会有值) +- sub_type_id:子事件类型(只有 sub_type 字段为 MmapEvent 时,该字段才会有值) - start_ts:申请内存开始时间 - end_ts:释放内存时间 - Dur:申请内存活跃时间 - Addr:申请内存地址 - mem_size:申请或释放内存大小 -- all_mem_size:从采集数据开始到当前时刻,申请并活跃的内存总量。 event_type为AllocEvent或者FreeEvent时,表示活跃的堆内存总量。当event_type为MmapEvent或者MunmapEvent时,表示活跃的映射内存总量 +- all_mem_size:从采集数据开始到当前时刻,申请并活跃的内存总量。 event_type 为 AllocEvent 或者 FreeEvent 时,表示活跃的堆内存总量。当 event_type 为 MmapEvent 或者 MunmapEvent 时,表示活跃的映射内存总量 - current_size_dur:表示当前活跃内存总量的持续时间 -- last_lib_id:函数调用栈他最后一个函数所属的文件路径,除了文件名中带musl和libc++ +- last_lib_id:函数调用栈他最后一个函数所属的文件路径,除了文件名中带 musl 和 libc++ -### native_hook_frame表 +### native_hook_frame 表 #### 表结构 @@ -1305,7 +1305,7 @@ js_heap_sample:记录timeline的时间轴信息 - symbol_id:函数名 - file_id:函数所属文件 -### native_hook_statistic表 +### native_hook_statistic 表 #### 表结构 @@ -1327,16 +1327,16 @@ js_heap_sample:记录timeline的时间轴信息 #### 关键字段描述 -- callchain_id:内存分配的回调链id -- ipid:进程id +- callchain_id:内存分配的回调链 id +- ipid:进程 id - ts:统计数据上报时间 -- type:事件类型,0代表malloc事件,1代表mmap事件 +- type:事件类型,0 代表 malloc 事件,1 代表 mmap 事件 - apply_count:当前调用栈内存分配总次数 - release_count:当前调用栈内存释放总次数 - apply_size:当前调用栈累计分配总大小 - release_size:当前调用栈累计释放总大小 -### network表 +### network 表 #### 表结构 @@ -1365,7 +1365,7 @@ js_heap_sample:记录timeline的时间轴信息 - tx_bytes:网络数据的写入量 - rx_bytes:网络数据的读取量 -### paged_memory_sample表 +### paged_memory_sample 表 #### 表结构 @@ -1390,14 +1390,14 @@ js_heap_sample:记录timeline的时间轴信息 - callchain_id: 取值相同的一组数据,表示一个完整的调用栈 - type:事件类型 -- ipid:TS内部进程号 +- ipid:TS 内部进程号 - start_ts:开始时间 - end_ts:结束时间 - dur:持续时间 - size:操作页数 -- itid:TS内部线程号 +- itid:TS 内部线程号 -### perf_callchain表 +### perf_callchain 表 #### 表结构 @@ -1413,18 +1413,18 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了Hiperf采样数据的调用栈信息。 +记录了 Hiperf 采样数据的调用栈信息。 #### 主要字段描述 - callchain_id:标识一组调用堆栈 - depth:调用栈深度 - vaddr_in_file:函数在文件中的虚拟地址 -- file_id:与PerfFiles中的file_id字段相关联 -- symbol_id:与PerfFiles中的symbol_id相关联 +- file_id:与 PerfFiles 中的 file_id 字段相关联 +- symbol_id:与 PerfFiles 中的 symbol_id 相关联 - name:函数名 -### perf_files表 +### perf_files 表 #### 表结构 @@ -1438,16 +1438,16 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录Hiperf工具采集到的函数符号表和文件名。 +记录 Hiperf 工具采集到的函数符号表和文件名。 #### 主要字段描述 - file_id:文件编号 -- serial_id:一个文件中可能有多个函数,serial_id表示函数的编号 +- serial_id:一个文件中可能有多个函数,serial_id 表示函数的编号 - symbol:函数名 - path:文件路径 -### perf_report表 +### perf_report 表 #### 表结构 @@ -1459,14 +1459,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录Hiperf工具采集数据时的配置信息。包括:抓取的事件类型,抓取数据的命令, 抓数据时指定的进程名称。 +记录 Hiperf 工具采集数据时的配置信息。包括:抓取的事件类型,抓取数据的命令, 抓数据时指定的进程名称。 #### 主要字段描述 - report_type:数据类型。取值只有三种类型:config_name(事件类型), workload(抓取的进程名), cmdline(抓取命令) - report_value:对应类型的取值 -### perf_sample表 +### perf_sample 表 #### 表结构 @@ -1484,19 +1484,19 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录Hiperf工具的采样信息。 +记录 Hiperf 工具的采样信息。 #### 主要字段描述 - timestamp:未进行时钟源同步的时间戳 - thread_id:线程号 - event_count:采样统计 -- event_type_id:事件类型编号。与PerfReport表的id字段相关联 +- event_type_id:事件类型编号。与 PerfReport 表的 id 字段相关联 - timestamp_trace:时钟源同步后的时间戳 -- cpu_id:cpu核编号 -- thread_state:线程状态。采样对应Sched_Waking事件时,为Runing;对应Sched_Switch事件时,为Suspend。其余事件类型,为“-” +- cpu_id:cpu 核编号 +- thread_state:线程状态。采样对应 Sched_Waking 事件时,为 Runing;对应 Sched_Switch 事件时,为 Suspend。其余事件类型,为“-” -### perf_thread表 +### perf_thread 表 #### 表结构 @@ -1509,7 +1509,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录Hiperf工具采集到的进程和线程数据。 +记录 Hiperf 工具采集到的进程和线程数据。 #### 主要字段描述 @@ -1517,7 +1517,7 @@ js_heap_sample:记录timeline的时间轴信息 - process_id:进程号 - thread_name:线程名 -### process表 +### process 表 #### 表结构 @@ -1540,18 +1540,18 @@ js_heap_sample:记录timeline的时间轴信息 #### 关键字段描述 -- id:进程在数据库重新重新定义的id,从0开始序列增长 -- ipid:TS内部进程id +- id:进程在数据库重新重新定义的 id,从 0 开始序列增长 +- ipid:TS 内部进程 id - type:固定取值:process -- pid:进程的真实id +- pid:进程的真实 id - name:进程名字 - start_ts:开始时间 - switch_count:统计内部有多少个线程有切换 - thread_count:统计其线程个数 -- slice_count:进程内有多个线程有slice数据 +- slice_count:进程内有多个线程有 slice 数据 - mem_count:进程是否有内存数据 -### process_filter表 +### process_filter 表 #### 表结构 @@ -1564,16 +1564,16 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, filter_id同时被记录在filter表中。 +将进程 ID 作为 key1,进程的内存,界面刷新,屏幕亮度等信息作为 key2,唯一确定一个 filter_id, filter_id 同时被记录在 filter 表中。 #### 主要字段描述 -- id:进程id +- id:进程 id - type:固定取值:process_filter - name:进程名 -- ipid:该进程表中的id与process表中的id相关联 +- ipid:该进程表中的 id 与 process 表中的 id 相关联 -### process_measure表 +### process_measure 表 #### 表结构 @@ -1592,9 +1592,9 @@ js_heap_sample:记录timeline的时间轴信息 - ts:事件时间 - value:数值 -- filter_id:对应process_measure_filter表中的ID +- filter_id:对应 process_measure_filter 表中的 ID -### process_measure_filter表 +### process_measure_filter 表 #### 表结构 @@ -1607,15 +1607,15 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -将进程ID作为key1,进程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, filter_id同时被记录在measure_filter表中。 +将进程 ID 作为 key1,进程的内存,界面刷新,屏幕亮度等信息作为 key2,唯一确定一个 filter_id, filter_id 同时被记录在 measure_filter 表中。 #### 字段详细描述 - type:固定取值:process_measure_filter -- name:cpu状态名 +- name:cpu 状态名 - ipid:进程内部编号 -### raw表 +### raw 表 #### 表结构 @@ -1630,16 +1630,16 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录了系统中的waking、wakup、cpu_idel、cpu_frequency数据。 +记录了系统中的 waking、wakup、cpu_idel、cpu_frequency 数据。 #### 相关字段描述 - type:固定字段(raw) - name:调度名称(取值:cpu_idle,sched_wakeup,sched_waking) -- cpu:事件发生在哪个CPU -- itid:时间对应哪个utid +- cpu:事件发生在哪个 CPU +- itid:时间对应哪个 utid -### sched_slice表 +### sched_slice 表 #### 表结构 @@ -1657,7 +1657,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -此数据结构主要作为ThreadState的上下文使用,这张表是sched_switch事件的原始记录。 +此数据结构主要作为 ThreadState 的上下文使用,这张表是 sched_switch 事件的原始记录。 #### 主要字段描述 @@ -1665,11 +1665,11 @@ js_heap_sample:记录timeline的时间轴信息 - type:固定字段(sched_slice) - dur:状态持续时长 - ts_end:状态结束时长 -- cpu:事件发生在哪个cpu -- itid:事件对应哪个utid +- cpu:事件发生在哪个 cpu +- itid:事件对应哪个 utid - end_state:线程的终结状态 -### smaps表 +### smaps 表 #### 表结构 @@ -1704,10 +1704,10 @@ js_heap_sample:记录timeline的时间轴信息 - pss:平摊计算后的实际物理使用内存 - virtaul_size:虚拟内存空间的大小 - reside:实际分配的内存大小与虚拟内存空间的大小的比 -- protection_id:内存段的权限id与表data_dict的id字段相关联 -- path_id:如果区域是从文件映射的,则这是文件的名称对应的id序号与表data_dict的id字段相关联 +- protection_id:内存段的权限 id 与表 data_dict 的 id 字段相关联 +- path_id:如果区域是从文件映射的,则这是文件的名称对应的 id 序号与表 data_dict 的 id 字段相关联 -### stat表 +### stat 表 #### 表结构 @@ -1731,7 +1731,7 @@ js_heap_sample:记录timeline的时间轴信息 - severity:严重级别 - source:数据来源 -### symbols表 +### symbols 表 #### 表结构 @@ -1750,7 +1750,7 @@ js_heap_sample:记录timeline的时间轴信息 - funcname:系统调用名称 - adr:系统调用地址 -### syscall表 +### syscall 表 #### 表结构 @@ -1769,12 +1769,12 @@ js_heap_sample:记录timeline的时间轴信息 #### 相关字段描述 - syscall_num:系统调用的序号 -- type:固定取值:enter或者exit -- ipid:线程所属的进程ID +- type:固定取值:enter 或者 exit +- ipid:线程所属的进程 ID - ts:时间戳 -- ret:返回值,在type为exit时有效 +- ret:返回值,在 type 为 exit 时有效 -### sys_event_filter表 +### sys_event_filter 表 #### 表结构 @@ -1786,14 +1786,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -记录所有的filter。 +记录所有的 filter。 #### 相关字段描述 - type:文件类型 - name:文件名 -### sys_mem_measure表 +### sys_mem_measure 表 #### 表结构 @@ -1812,9 +1812,9 @@ js_heap_sample:记录timeline的时间轴信息 - ts:事件时间 - value:数值 -- filter_id:对应filter表中的ID +- filter_id:对应 filter 表中的 ID -### thread表 +### thread 表 #### 表结构 @@ -1837,18 +1837,18 @@ js_heap_sample:记录timeline的时间轴信息 #### 字段详细描述 -- id:线程在数据库重新重新定义的id,从0开始序列增长 -- itid:TS内部线程id +- id:线程在数据库重新重新定义的 id,从 0 开始序列增长 +- itid:TS 内部线程 id - type:固定字段(thread) - tid:线程号 - name:线程名 - start_ts:开始时间 - end_ts:结束时间 -- ipid:线程所属的进程id, 关联process表中的ID +- ipid:线程所属的进程 id, 关联 process 表中的 ID - is_main_thread:是否主线程,主线程即该线程实际就是进程本身 - switch_count:当前线程的切换次数 -### thread_filter表 +### thread_filter 表 #### 表结构 @@ -1861,16 +1861,16 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -将线程ID作为key1,线程的内存,界面刷新,屏幕亮度等信息作为key2,唯一确定一个filter_id, filter_id同时被记录在filter表中。 +将线程 ID 作为 key1,线程的内存,界面刷新,屏幕亮度等信息作为 key2,唯一确定一个 filter_id, filter_id 同时被记录在 filter 表中。 #### 主要字段描述 -- id:线程id +- id:线程 id - type:线程类型 - name:线程名称 -- itid:该表中的tid与thread表中的tid相关联 +- itid:该表中的 tid 与 thread 表中的 tid 相关联 -### thread_state表 +### thread_state 表 #### 表结构 @@ -1892,11 +1892,11 @@ js_heap_sample:记录timeline的时间轴信息 #### 字段详细描述 -- id:线程状态在数据库中的id,从0开始序列增长 +- id:线程状态在数据库中的 id,从 0 开始序列增长 - ts:该线程状态的起始时间 - dur:该线程状态的持续时间 -- cpu:该线程在哪个cpu上执行(针对running状态的线程) -- itid:该状态所属的线程id, 关联线程表中的id +- cpu:该线程在哪个 cpu 上执行(针对 running 状态的线程) +- itid:该状态所属的线程 id, 关联线程表中的 id - tid:线程号 - pid:进程号 - state:线程实际的的状态值 @@ -1923,7 +1923,7 @@ js_heap_sample:记录timeline的时间轴信息 "R-B", Task runnable binder. ``` -### clock_snapshot表 +### clock_snapshot 表 #### 表结构 @@ -1943,10 +1943,10 @@ js_heap_sample:记录timeline的时间轴信息 - ts:时钟快照报的时间 - clock_name:时钟号对应的时钟名字 时钟快照是用来对齐不同时钟号的时间 - 比如,时钟号1的时间100,和时钟号2的时间200对齐 - 则时钟号为2 的250,转换为时钟号1的时间后,为150 + 比如,时钟号 1 的时间 100,和时钟号 2 的时间 200 对齐 + 则时钟号为 2 的 250,转换为时钟号 1 的时间后,为 150 -### datasource_clockid表 +### datasource_clockid 表 #### 表结构 @@ -1962,10 +1962,10 @@ js_heap_sample:记录timeline的时间轴信息 #### 关键字段描述 - data_source_name:数据源的名称,和数据源的插件名保持一致 -- clock_id:时钟号,对应clock_snapshot中的时钟号 - 这个表是用来告诉IDE,不同的事件源的事件,原始时钟号是多少,在数据库中保存的事件,通常是转换为boottime后的时间,但有些情况下,IDE仍然需要知道原始的时钟号是怎样的 +- clock_id:时钟号,对应 clock_snapshot 中的时钟号 + 这个表是用来告诉 IDE,不同的事件源的事件,原始时钟号是多少,在数据库中保存的事件,通常是转换为 boottime 后的时间,但有些情况下,IDE 仍然需要知道原始的时钟号是怎样的 -### frame_slice表 +### frame_slice 表 ### 表结构 @@ -1986,20 +1986,20 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -应用的实际渲染帧和期望渲染帧的开始时间,持续时长,以及RenderService和App之间的关联关系。 +应用的实际渲染帧和期望渲染帧的开始时间,持续时长,以及 RenderService 和 App 之间的关联关系。 #### 关键字段描述 -- callstack_id:该帧数据对应着callstack表的调用栈所在的行数 +- callstack_id:该帧数据对应着 callstack 表的调用栈所在的行数 - dur:该帧渲染时长(当数据不完整时,改行数据为空) - src:该帧是被哪一帧(该表中对应的行数)触发的,有多个值时,用逗号分割 - dst:该帧对应的渲染帧是哪一行 - type: 0 说明该行数据是实际渲染帧, 1 说明该行数据是期望渲染帧 -- flag: 空时,为不完整的数据;0 表示实际渲染帧不卡帧, 1 表示实际渲染帧卡帧(expectEndTime < actualEndTime为异常), 2 表示数据不需要绘制(没有frameNum信息),3 表示rs进程与app进程起止异常(|expRsStartTime - expUiEndTime| < 1ms 正常,否则异常。这里使用期待帧的时间差做判断,给实际帧打标签) +- flag: 空时,为不完整的数据;0 表示实际渲染帧不卡帧, 1 表示实际渲染帧卡帧(expectEndTime < actualEndTime 为异常), 2 表示数据不需要绘制(没有 frameNum 信息),3 表示 rs 进程与 app 进程起止异常(|expRsStartTime - expUiEndTime| < 1ms 正常,否则异常。这里使用期待帧的时间差做判断,给实际帧打标签) - depth:预留 - frame_no:预留 -### frame_maps表 +### frame_maps 表 ### 表结构 @@ -2011,14 +2011,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -该表记录了app到RenderService的帧的映射关系,同frame_slice表中的src映射到dst的关系。 +该表记录了 app 到 RenderService 的帧的映射关系,同 frame_slice 表中的 src 映射到 dst 的关系。 #### 关键字段描述 -- src_row:frame_slice表中app的帧所在的行 -- dst_row:frame_slice表中RenderService的帧所在的行 +- src_row:frame_slice 表中 app 的帧所在的行 +- dst_row:frame_slice 表中 RenderService 的帧所在的行 -### gpu_slice表 +### gpu_slice 表 ### 表结构 @@ -2029,14 +2029,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -该表记录了每一帧数据在GPU上的渲染时长。 +该表记录了每一帧数据在 GPU 上的渲染时长。 #### 关键字段描述 -- frame_row:frame_slice表中渲染帧所在的行 +- frame_row:frame_slice 表中渲染帧所在的行 - dur:帧渲染时长 -### trace_range表 +### trace_range 表 #### 表结构 @@ -2051,10 +2051,10 @@ js_heap_sample:记录timeline的时间轴信息 #### 关键字段描述 -- start_ts:trace的开始时间,纳秒为单位 -- end_ts:trace的结束时间,纳秒为单位 +- start_ts:trace 的开始时间,纳秒为单位 +- end_ts:trace 的结束时间,纳秒为单位 -### task_pool表 +### task_pool 表 #### 表结构 @@ -2075,23 +2075,23 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -该表记录了任务池相关数据,与callstack表关联。 +该表记录了任务池相关数据,与 callstack 表关联。 #### 关键字段描述 -- allocation_task_row:与callstack表id号相关联 -- execute_task_row:与callstack表id号相关联 -- return_task_row:与callstack表id号相关联 -- allocation_itid:任务分发的itid -- execute_itid:任务执行的itid -- return_itid:任务返回的itid -- execute_id:任务执行id +- allocation_task_row:与 callstack 表 id 号相关联 +- execute_task_row:与 callstack 表 id 号相关联 +- return_task_row:与 callstack 表 id 号相关联 +- allocation_itid:任务分发的 itid +- execute_itid:任务执行的 itid +- return_itid:任务返回的 itid +- execute_id:任务执行 id - priority:任务分发独有的,优先级{HIGH : 0,MEDIUM : 1,LOW : 2} - execute_state:任务执行独有的执行状态{NOT_FOUND : 0,WAITING : 1,RUNNING : 2,CANCELED : 3} - return_state:任务返回独有的任务返回状态[IsCanceled DeserializeFailed Successful Unsuccessful] - timeout_row:任务执行超时时更新此列,将对应的 callstack 表行号存于对应的任务行 -### animation表 +### animation 表 #### 表结构 @@ -2112,7 +2112,7 @@ js_heap_sample:记录timeline的时间轴信息 - start_point:开始时间点 - end_point:结束时间点 -### dynamic_frame表 +### dynamic_frame 表 #### 表结构 @@ -2133,15 +2133,15 @@ js_heap_sample:记录timeline的时间轴信息 #### 关键字段描述 -- x:坐标x -- y:坐标y +- x:坐标 x +- y:坐标 y - width:宽 - height:高 - alpha:透明度 - name:当前动效帧名字 - end_time:结束时间 -### device_info表 +### device_info 表 #### 表结构 @@ -2162,7 +2162,7 @@ js_heap_sample:记录timeline的时间轴信息 - physical_height:设备高 - physical_frame_rate:设备帧率 -### device_state表 +### device_state 表 #### 表结构 @@ -2211,7 +2211,7 @@ js_heap_sample:记录timeline的时间轴信息 - accessibility:访问权限 - recording:录音 -### trace_config表 +### trace_config 表 #### 表结构 @@ -2224,7 +2224,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +该表记录 trace 数据源,proto 的事件-plugin 与其 process_name(目前只有 HisysEvent 事件在用)。 #### 关键字段描述 @@ -2232,7 +2232,7 @@ js_heap_sample:记录timeline的时间轴信息 - key:事件需要关注的信息名 - value:事件需要关注的信息名对应的信息值 -### memory_ashmem表 +### memory_ashmem 表 #### 表结构 @@ -2254,7 +2254,7 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +该表记录 trace 数据源,proto 的事件-plugin 与其 process_name(目前只有 HisysEvent 事件在用)。 #### 关键字段描述 @@ -2263,12 +2263,12 @@ js_heap_sample:记录timeline的时间轴信息 - fd:共享内存文件描述符 - ashmem_name_id:共享内存名 - size:共享内存大小 -- pss:PSS内存大小 -- ashmem_id:共享内存ID +- pss:PSS 内存大小 +- ashmem_id:共享内存 ID - ref_count:引用计数 -- flag:去重标记,0表示正常,1表示进程内部重复数据,2表示进程间重复数据 +- flag:去重标记,0 表示正常,1 表示进程内部重复数据,2 表示进程间重复数据 -### memory_dma表 +### memory_dma 表 #### 表结构 @@ -2288,20 +2288,20 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +该表记录 trace 数据源,proto 的事件-plugin 与其 process_name(目前只有 HisysEvent 事件在用)。 #### 关键字段描述 - ts:时间戳 - ipid:内部进程号 -- fd:dma内存文件描述符 -- size:dma内存大小 +- fd:dma 内存文件描述符 +- size:dma 内存大小 - exp_pid:申请者的进程号 -- buf_name_id:dma内存名 +- buf_name_id:dma 内存名 - exp_name_id:申请者进程名 -- flag:去重标记,0表示正常,1表示进程内部重复数据,2表示进程间重复数据 +- flag:去重标记,0 表示正常,1 表示进程内部重复数据,2 表示进程间重复数据 -### memory_process_gpu表 +### memory_process_gpu 表 #### 表结构 @@ -2318,19 +2318,19 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +该表记录 trace 数据源,proto 的事件-plugin 与其 process_name(目前只有 HisysEvent 事件在用)。 #### 关键字段描述 - ts:时间戳 -- gpu_name_id:gpu内存名称 -- all_gpu_size:进程占用gpu总大小 -- addr:gpu内存地址 +- gpu_name_id:gpu 内存名称 +- all_gpu_size:进程占用 gpu 总大小 +- addr:gpu 内存地址 - ipid:内部进程号 - itid:内部线程号 -- used_gpu_size:已使用的gpu大小 +- used_gpu_size:已使用的 gpu 大小 -### memory_window_gpu表 +### memory_window_gpu 表 #### 表结构 @@ -2348,19 +2348,19 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -该表记录trace数据源,proto的事件-plugin与其process_name(目前只有HisysEvent事件在用)。 +该表记录 trace 数据源,proto 的事件-plugin 与其 process_name(目前只有 HisysEvent 事件在用)。 #### 关键字段描述 - ts:时间戳 - window_name_id:窗口名 -- window_id:窗口id +- window_id:窗口 id - module_name_id:模块名 - category_name_id:目录名 - size:内存大小 - count:内存申请个数 -### static_initalize表 +### static_initalize 表 #### 表结构 @@ -2377,14 +2377,14 @@ js_heap_sample:记录timeline的时间轴信息 #### 表描述 -该表记录了so初始化相关数据。 +该表记录了 so 初始化相关数据。 #### 关键字段描述 - ipid:内部进程号 - tid:内部线程号 -- call_id:调用者的ID,对应线程表里面的itid +- call_id:调用者的 ID,对应线程表里面的 itid - start_time:阶段开始时间 - end_time:阶段结束时间 -- so_name:so文件名称 +- so_name:so 文件名称 - depth:泳道图的深度 diff --git a/ide/src/doc/md/quickstart_Application_operation_skills.md b/ide/src/doc/md/quickstart_Application_operation_skills.md index 85f5f7cf2..6e5641848 100644 --- a/ide/src/doc/md/quickstart_Application_operation_skills.md +++ b/ide/src/doc/md/quickstart_Application_operation_skills.md @@ -4,19 +4,19 @@ ### 可导入符号表 -符号表导入适用于所有支持调用栈的Tab页,选择一个文件夹,获取文件下及其子文件夹的所有so文件,更新数据库中符号数据。文件夹内so的格式需要与在设备上的路径一致,例如下图中,选择的文件夹为import,选择导入的libnative_hook.z.so,在设备上的路径是/system/lib64/,那么在本地选择的文件夹内也需要保证路径是import/system/lib64/libnative_hook.z.so。 +符号表导入适用于所有支持调用栈的 Tab 页,选择一个文件夹,获取文件下及其子文件夹的所有 so 文件,更新数据库中符号数据。文件夹内 so 的格式需要与在设备上的路径一致,例如下图中,选择的文件夹为 import,选择导入的 libnative_hook.z.so,在设备上的路径是/system/lib64/,那么在本地选择的文件夹内也需要保证路径是 import/system/lib64/libnative_hook.z.so。 ![GitHub Logo](../../figures/OperationSkills/Operation_soimport_dir.jpg) -以NativeMemory举例,导入NativeMemory文件,点击Call info的Tab页,在搜索框中输入libnative_hook.z.so,会发现该so下的调用栈没有符号化完全。 +以 NativeMemory 举例,导入 NativeMemory 文件,点击 Call info 的 Tab 页,在搜索框中输入 libnative_hook.z.so,会发现该 so 下的调用栈没有符号化完全。 ![GitHub Logo](../../figures/OperationSkills/Operation_soimport_nativehook.jpg) -将本地编译的so通过导入按钮导入,本地导入路径是import/system/lib64/libnative_hook.z.so,红框处是导入按钮。 +将本地编译的 so 通过导入按钮导入,本地导入路径是 import/system/lib64/libnative_hook.z.so,红框处是导入按钮。 ![GitHub Logo](../../figures/OperationSkills/Operation_soimport_local.jpg) -导入so以后,在搜索框中输入libnative_hook.z.so,会发现符号化数据已经更新。 +导入 so 以后,在搜索框中输入 libnative_hook.z.so,会发现符号化数据已经更新。 ![GitHub Logo](../../figures/OperationSkills/Operation_soimport_new.jpg) ### 网页连接文件打开接口 -网页连接文件打开接口可以在网址后增加文件地址,打开后直接打开trace。 -接口的url路径如下: +网页连接文件打开接口可以在网址后增加文件地址,打开后直接打开 trace。 +接口的 url 路径如下: ![GitHub Logo](../../figures/OperationSkills/Opertion_urltrace.jpg) - 蓝色框:是Smartperf工具的url(https://localhost:9000/application/)。 @@ -35,13 +35,13 @@ 将树形表格全部改为默认收起,在表头左上角添加双尖箭头图标,默认箭头朝外,点击图标,表格的每一层都展开,图标上的箭头改为朝里面,再次点击表格每一层都收起,图标上的箭头改为朝外面。 ![GitHub Logo](../../figures/OperationSkills/Taboneclick.jpg) -### 支持shift+m多次框选,框选列表显示和操作(跳转,取消),快捷键跳转ctrl+[/]和一键取消 +### 支持 shift+m 多次框选,框选列表显示和操作(跳转,取消),快捷键跳转 ctrl+[/]和一键取消 -每次框选泳道图后,按下shift+m键,在当前框选的开始和结束位置出现卡尺,如果只按下m键,会将上一次按m键出现的卡尺清除,在当前框选位置画卡尺,页面上每个卡尺都放进tab页中,在tab页中可以给卡尺改变颜色和移除旗子。用快捷键改变当前选中的卡尺。按下快捷键“ctrl+[”或“ctrl+]”的时候,会跳转到当前选中卡尺的上\下一个卡尺上,也就是上\下一个卡尺两侧变为实心,对应表格中的那行背景颜色变浅蓝色。 +每次框选泳道图后,按下 shift+m 键,在当前框选的开始和结束位置出现卡尺,如果只按下 m 键,会将上一次按 m 键出现的卡尺清除,在当前框选位置画卡尺,页面上每个卡尺都放进 tab 页中,在 tab 页中可以给卡尺改变颜色和移除旗子。用快捷键改变当前选中的卡尺。按下快捷键“ctrl+[”或“ctrl+]”的时候,会跳转到当前选中卡尺的上\下一个卡尺上,也就是上\下一个卡尺两侧变为实心,对应表格中的那行背景颜色变浅蓝色。 -### 旗子标记可快速跳转,框选列表显示和操作(跳转,取消),快捷跳转ctrl+,/.和一键取消 +### 旗子标记可快速跳转,框选列表显示和操作(跳转,取消),快捷跳转 ctrl+,/.和一键取消 -在时间刻度下方点击会出现旗子和tab页,每次点击都将旗子都放进tab页中,在tab页中可以给旗子改变颜色和移除旗子。用快捷键改变当前选中的旗子。按下快捷键“ctrl+,”或“ctrl+.”的时候,会跳转到当前选中旗子的上\下一个旗子上,也就是上\下一个旗子变为实心有旗杆,对应表格中的那行背景颜色变浅蓝色。 +在时间刻度下方点击会出现旗子和 tab 页,每次点击都将旗子都放进 tab 页中,在 tab 页中可以给旗子改变颜色和移除旗子。用快捷键改变当前选中的旗子。按下快捷键“ctrl+,”或“ctrl+.”的时候,会跳转到当前选中旗子的上\下一个旗子上,也就是上\下一个旗子变为实心有旗杆,对应表格中的那行背景颜色变浅蓝色。 ![GitHub Logo](../../figures/OperationSkills/rowskillflag.jpg) ### 泳道图支持一键收起和展开(收起前的状态) @@ -49,19 +49,19 @@ 点击时间刻度的最左边的双箭头,可以对已展开的泳道图进行一键收起和展开。 ![GitHub Logo](../../figures/OperationSkills/rowskilon.jpg) -### 单个泳道图显示为多行时可折叠为1行(收藏和非收藏) +### 单个泳道图显示为多行时可折叠为 1 行(收藏和非收藏) 单个泳道图点击会将泳道图折叠为一行,折腾后的字体是蓝色。 ![GitHub Logo](../../figures/OperationSkills/Tabskillfold.jpg) ### 已支持的泳道图按照模板分类显示,NaitveMemory,Hisysevent,应用内存等 -导入trace文件后,页面右上角的出现漏斗图标,点击会出现Display Template页面,Template Select区域显示已经添加到显示模板中的泳道图,每类泳道图后面会有一个多选框,默认不勾选,如果勾选页面上就只保留勾选的泳道图。 +导入 trace 文件后,页面右上角的出现漏斗图标,点击会出现 Display Template 页面,Template Select 区域显示已经添加到显示模板中的泳道图,每类泳道图后面会有一个多选框,默认不勾选,如果勾选页面上就只保留勾选的泳道图。 ![GitHub Logo](../../figures/OperationSkills/Tabskilltemple.jpg) ### 所有进程的用户输入事件归一显示,观察操作事件和对象 -对于用户InputEvent会绘制到固定的泳道图。 +对于用户 InputEvent 会绘制到固定的泳道图。 ![GitHub Logo](../../figures/OperationSkills/rowskillinput.jpg) ### 支持收藏的泳道图整体画布可伸缩 @@ -69,27 +69,27 @@ 收藏以后的泳道图可以在红线位置处上下伸缩拖动。 ![GitHub Logo](../../figures/OperationSkills/collectskilldrag.jpg) -### 用户自定义分组化收藏(2组),及一键取消所有收藏 +### 用户自定义分组化收藏(2 组),及一键取消所有收藏 -选择界面上的G1和G2,可以根据自己的需求将泳道图收藏到对应G1或者G2中,点击G1和G2旁边的星号可以一键取消所有收藏。 +选择界面上的 G1 和 G2,可以根据自己的需求将泳道图收藏到对应 G1 或者 G2 中,点击 G1 和 G2 旁边的星号可以一键取消所有收藏。 ![GitHub Logo](../../figures/OperationSkills/collectskillg.jpg) -### trace顶部的cpu负载预览颜色随着负载降低,亮度降低的能力对比度提升 +### trace 顶部的 cpu 负载预览颜色随着负载降低,亮度降低的能力对比度提升 -CPU负载颜色的亮度,负载越大颜色更深,负载越小颜色越浅。 +CPU 负载颜色的亮度,负载越大颜色更深,负载越小颜色越浅。 ![GitHub Logo](../../figures/OperationSkills/colorcontrast.jpg) -### 导航栏/泳道图背景颜色支持颜色可选,字体颜色可感知slice的颜色而进行变化,颜色动态可配 +### 导航栏/泳道图背景颜色支持颜色可选,字体颜色可感知 slice 的颜色而进行变化,颜色动态可配 -给用户提供两种模式,浅色模式(导航栏白底黑字,泳道图颜色偏淡)和深色模式(导航栏黑底白字,泳道图颜色偏深),点击最左下方的小桶标志用户可以按需选择,并且用户可以自定义systemTrace页面的颜色,给用户更多自由,自己动手设置自己喜欢的颜色,提升用户体验。 +给用户提供两种模式,浅色模式(导航栏白底黑字,泳道图颜色偏淡)和深色模式(导航栏黑底白字,泳道图颜色偏深),点击最左下方的小桶标志用户可以按需选择,并且用户可以自定义 systemTrace 页面的颜色,给用户更多自由,自己动手设置自己喜欢的颜色,提升用户体验。 ![GitHub Logo](../../figures/OperationSkills/colorchoose.jpg) -### Trace抓取动态可停 +### Trace 抓取动态可停 -在抓取trace过程中,点击StopRecord按钮会对抓取命令进行启停,等待抓取停止命令返回后,将生成的文件拉取下来进行文件的解析。 +在抓取 trace 过程中,点击 StopRecord 按钮会对抓取命令进行启停,等待抓取停止命令返回后,将生成的文件拉取下来进行文件的解析。 ![GitHub Logo](../../figures/OperationSkills/tracestop.jpg) -### Smartperf web端集成hdc命令能力 +### Smartperf web 端集成 hdc 命令能力 -在现有的配置界面上,新增一个Web版本的shell界面,可以支持shell命令。 +在现有的配置界面上,新增一个 Web 版本的 shell 界面,可以支持 shell 命令。 ![GitHub Logo](../../figures/OperationSkills/shellconfig.jpg) diff --git a/ide/src/doc/md/quickstart_ability_monitor.html b/ide/src/doc/md/quickstart_ability_monitor.html index b9cbe9d18..cde6491b8 100644 --- a/ide/src/doc/md/quickstart_ability_monitor.html +++ b/ide/src/doc/md/quickstart_ability_monitor.html @@ -1,4 +1,4 @@ - + quickstart_ability_monitor diff --git a/ide/src/doc/md/quickstart_animation.md b/ide/src/doc/md/quickstart_animation.md index 9fca81ec3..fb15dea18 100644 --- a/ide/src/doc/md/quickstart_animation.md +++ b/ide/src/doc/md/quickstart_animation.md @@ -1,38 +1,38 @@ -# Animation的抓取和展示说明 +# Animation 的抓取和展示说明 通过动效模板的指标项对图形子系统和应用做动效卡顿类问题分析。 -### Animation抓取参数的配置 +### Animation 抓取参数的配置 ![GitHub Logo](../../figures/animation/animationconfig.jpg) 配置项说明: - Animation effect:动效配置项的总开关。 -### Animation展示说明 +### Animation 展示说明 -将抓取的Animation文件导入到smartperf工具中,查看图形子系统和应用动效卡顿类问题。 +将抓取的 Animation 文件导入到 smartperf 工具中,查看图形子系统和应用动效卡顿类问题。 -### Animation泳道图展示 +### Animation 泳道图展示 -Animation的响应时延和完成时延泳道图显示,泳道图的Slice会显示响应时延和完成时延,如下图中的Response delay(79.379165ms),Completion delay(2606.938539ms)。 +Animation 的响应时延和完成时延泳道图显示,泳道图的 Slice 会显示响应时延和完成时延,如下图中的 Response delay(79.379165ms),Completion delay(2606.938539ms)。 ![GitHub Logo](../../figures/animation/anrsdelayrow.jpg)。 -Animation的动效曲线和帧间距的总泳道图,如图点击WindowScene_mm37旁边的小齿轮可以切换WindowScene。 +Animation 的动效曲线和帧间距的总泳道图,如图点击 WindowScene_mm37 旁边的小齿轮可以切换 WindowScene。 ![GitHub Logo](../../figures/animation/anrsallrow.jpg)。 -Animation的动效曲线泳道图展示,如下: +Animation 的动效曲线泳道图展示,如下: ![GitHub Logo](../../figures/animation/anieffectcurv.jpg) 泳道图说明: - Animation Effect Curve旁边的齿轮显示的x,y,width,height,alpha是动效帧的属性值,可以切换。 - Animation Effect Curve泳道图红色的曲线代表的是异常判断点,也就是相邻两帧属性值相同的异常时间区间。 - Animation的帧间距泳道图展示,如下: + Animation 的帧间距泳道图展示,如下: ![GitHub Logo](../../figures/animation/framespacirow.jpg) 泳道图说明: - Frame spacing泳道图显示相邻两帧在时间尺度上相对于设备物理屏幕的变化间距值。 ### 动效曲线泳道图点选功能 -点选动效曲线泳道图上的属性值会出现一个空心小圆点,Frame Dynamic的Tab页会显示相关信息。 +点选动效曲线泳道图上的属性值会出现一个空心小圆点,Frame Dynamic 的 Tab 页会显示相关信息。 ![GitHub Logo](../../figures/animation/anieffectcurvselect.jpg) - Timestamp: 时间戳信息。 @@ -41,7 +41,7 @@ Animation的动效曲线泳道图展示,如下: ### 动效曲线泳道图框选功能 -框选动效曲线泳道图,Frame Dynamic的Tab页会显示框选范围内每个点的属性值。 +框选动效曲线泳道图,Frame Dynamic 的 Tab 页会显示框选范围内每个点的属性值。 ![GitHub Logo](../../figures/animation/anieffectcurvdrag.jpg) - Timestamp: 时间戳信息。 @@ -50,7 +50,7 @@ Animation的动效曲线泳道图展示,如下: ### 帧间距泳道图点选功能 -点选帧间距泳道图,Frame spacing的Tab页会显示这一个点的帧间距计算数据,一个点要计算四个属性的的帧间距,所以需要显示四个属性的。 +点选帧间距泳道图,Frame spacing 的 Tab 页会显示这一个点的帧间距计算数据,一个点要计算四个属性的的帧间距,所以需要显示四个属性的。 ![GitHub Logo](../../figures/animation/anispacingselect.jpg) - Timestamp: 时间戳信息。 @@ -65,7 +65,7 @@ Animation的动效曲线泳道图展示,如下: ### 帧间距泳道图框选功能 -框选帧间距泳道图,Frame spacing的Tab页会显示框选范围内帧间距数据。 +框选帧间距泳道图,Frame spacing 的 Tab 页会显示框选范围内帧间距数据。 ![GitHub Logo](../../figures/animation/anispacingdrag.jpg) - Timestamp: 时间戳信息。 diff --git a/ide/src/doc/md/quickstart_app_startup.md b/ide/src/doc/md/quickstart_app_startup.md index 6325f4485..f6f20762c 100644 --- a/ide/src/doc/md/quickstart_app_startup.md +++ b/ide/src/doc/md/quickstart_app_startup.md @@ -1,28 +1,28 @@ -# App startup的抓取和展示说明 +# App startup 的抓取和展示说明 应用启动分析功能主要是提供应用启动分析模板帮助系统调优人员做应用启动慢场景问题分析,快速查找系统侧启动慢阶段和耗时长调用栈信息。 -### App startup抓取参数的配置 +### App startup 抓取参数的配置 ![GitHub Logo](../../figures/appstartup/appstartupconfig.jpg) 配置项说明: - App startup:配置项的总开关。 -### App startup展示说明 +### App startup 展示说明 -将抓取的App startup文件导入到smartperf工具中,查看应用启动各阶段耗时的情况。 +将抓取的 App startup 文件导入到 smartperf 工具中,查看应用启动各阶段耗时的情况。 -### App startup泳道图展示 +### App startup 泳道图展示 -App startup的泳道图展示: +App startup 的泳道图展示: ![GitHub Logo](../../figures/appstartup/appstartuprow.jpg) -应用启动包括六个阶段,分别是Process Creating(应用进程创建阶段)、Application Launching(加载应用阶段)、UI Ability Launching(加载UI Ability)、UI Ability OnForeground(应用进入前台)、First Frame - APP Phase(首帧渲染提交-应用)、First Frame - Render Phase(首帧渲染提交-Render Service)。每个阶段的Slice上都会显示出该阶段的时延。 +应用启动包括六个阶段,分别是 Process Creating(应用进程创建阶段)、Application Launching(加载应用阶段)、UI Ability Launching(加载 UI Ability)、UI Ability OnForeground(应用进入前台)、First Frame - APP Phase(首帧渲染提交-应用)、First Frame - Render Phase(首帧渲染提交-Render Service)。每个阶段的 Slice 上都会显示出该阶段的时延。 -### App startup泳道图点选功能 +### App startup 泳道图点选功能 -可以对启动各个阶段的Slice进行点选,点选后在最下方的弹出层中会展示点选数据的统计的tab页。 -以Process Creating的Slice点选为例: +可以对启动各个阶段的 Slice 进行点选,点选后在最下方的弹出层中会展示点选数据的统计的 tab 页。 +以 Process Creating 的 Slice 点选为例: ![GitHub Logo](../../figures/appstartup/appstartupslice.jpg) - StartTime(Relative): 应用启动开始时间(相对时间)。 @@ -31,17 +31,17 @@ App startup的泳道图展示: - EndTime(Absolute):应用启动的结束时间(绝对时间)。 - Duration:应用启动的持续时间。 -### App startup泳道图Tab页跳转功能 +### App startup 泳道图 Tab 页跳转功能 -点击各阶段的起始或者结束时间后面的跳转图标,跳转至关联Slice,并显示该Slice的详细信息。 -以Process Creating的跳转为例: +点击各阶段的起始或者结束时间后面的跳转图标,跳转至关联 Slice,并显示该 Slice 的详细信息。 +以 Process Creating 的跳转为例: ![GitHub Logo](../../figures/appstartup/appstartupjump.jpg) 跳转说明: - StartTime(Relative)的跳转: 跳转到H:virtual int OHOS::AAFwk::AbilityManagerService::StartAbility关键字函数。 - EndTime(Relative)的跳转: 跳转到H:virtual void OHOS::AppExecFwk::AppMgrServiceInner::AttachApplication关键字函数,并且调用栈要带##应用名,如##com.ohos.smartperf。 -### App startup泳道图的框选功能 +### App startup 泳道图的框选功能 应用启动阶段泳道图框选功能主要是框选启动分析泳道图之后,统计应用各个启动阶段的耗费时长信息。 ![GitHub Logo](../../figures/appstartup/appstartupdrag.jpg) @@ -50,14 +50,14 @@ App startup的泳道图展示: - Duration:应用各阶段启动时长。 - %:应用各阶段启动时长的占比。 -### So初始化泳道图展示 +### So 初始化泳道图展示 -So初始化的泳道图展示: +So 初始化的泳道图展示: ![GitHub Logo](../../figures/appstartup/staticinitilizationrow.jpg) -### So初始化泳道图的点选功能 +### So 初始化泳道图的点选功能 -点选So初始化的Slice,展示该so初始化信息的tab页。 +点选 So 初始化的 Slice,展示该 so 初始化信息的 tab 页。 ![GitHub Logo](../../figures/appstartup/staticinitilizationslice.jpg) - Name:So的名称。 @@ -65,17 +65,17 @@ So初始化的泳道图展示: - StartTime(Absolute):So初始化开始时间(绝对时间)。 - Duration:So初始化耗时。 -### So初始化泳道图Tab页跳转功能 +### So 初始化泳道图 Tab 页跳转功能 -点击So初始化开始时间后面的跳转图标,跳转至关联Slice,并显示该Slice的详细信息。 +点击 So 初始化开始时间后面的跳转图标,跳转至关联 Slice,并显示该 Slice 的详细信息。 ![GitHub Logo](../../figures/appstartup/staticinitilizationjump.jpg) 跳转说明: - StartTime(Relative)的跳转: 跳转到dlopen: system/lib64/extensionability/libinputmethod_extension_module.z.so。 -### So初始化泳道图的框选功能 +### So 初始化泳道图的框选功能 -So初始化泳道图框选功能主要是框选So初始化泳道图之后,统计各个进程下各个So的初始化耗费时长信息。 +So 初始化泳道图框选功能主要是框选 So 初始化泳道图之后,统计各个进程下各个 So 的初始化耗费时长信息。 ![GitHub Logo](../../figures/appstartup/staticinitilizationdrag.jpg) - Process / Lib: 应用名称和So名称。 diff --git a/ide/src/doc/md/quickstart_hilog.md b/ide/src/doc/md/quickstart_hilog.md index 88414b2ef..cfc17f200 100644 --- a/ide/src/doc/md/quickstart_hilog.md +++ b/ide/src/doc/md/quickstart_hilog.md @@ -1,22 +1,22 @@ -# Hilog抓取和展示说明 +# Hilog 抓取和展示说明 -Hilog分析模块主要展示系统日志信息。 +Hilog 分析模块主要展示系统日志信息。 -## Hilog的抓取 +## Hilog 的抓取 -#### Hilog的抓取配置参数 +#### Hilog 的抓取配置参数 -打开Hilog开关抓取taskpool数据。 +打开 Hilog 开关抓取 taskpool 数据。 ![GitHub Logo](../../figures/Hilog/hilogconfig.jpg) -### Hilog展示说明 +### Hilog 展示说明 -将抓取的hilog文件导入到smartperf中,查看日志信息。 +将抓取的 hilog 文件导入到 smartperf 中,查看日志信息。 ![GitHub Logo](../../figures/Hilog/hilogrow.jpg) -### Hilog泳道图的框选功能 +### Hilog 泳道图的框选功能 -框选Hilog的泳道图,展示Hilog的tab页,Log Level可以选择日志级别,也能根据Tag,Process name,Message去搜索。 +框选 Hilog 的泳道图,展示 Hilog 的 tab 页,Log Level 可以选择日志级别,也能根据 Tag,Process name,Message 去搜索。 ![GitHub Logo](../../figures/Hilog/hilogtab.jpg) - Timestamp: 时间戳信息。 @@ -25,7 +25,7 @@ Hilog分析模块主要展示系统日志信息。 - Tag:日志的tag。 - Process name:进程名。 - Message:日志具体信息。 - 框选Hilog的泳道图,展示Summary的tab页。 + 框选 Hilog 的泳道图,展示 Summary 的 tab 页。 ![GitHub Logo](../../figures/Hilog/hilogsummarytab.jpg) - Level/Process/Tag/Message: 根据类别显示日志。 - Count: 各级别日志的条数。 diff --git a/ide/src/doc/md/quickstart_hiperf.md b/ide/src/doc/md/quickstart_hiperf.md index 505457ad7..e4da5784f 100644 --- a/ide/src/doc/md/quickstart_hiperf.md +++ b/ide/src/doc/md/quickstart_hiperf.md @@ -1,10 +1,10 @@ -# HiPerf的抓取和展示说明 +# HiPerf 的抓取和展示说明 -HiPerf工具是对系统性能数据进行采样记录,并将采样数据保存为文件,进行读取,展示分析。 +HiPerf 工具是对系统性能数据进行采样记录,并将采样数据保存为文件,进行读取,展示分析。 -## HiPerf的抓取 +## HiPerf 的抓取 -### HiPerf抓取配置参数 +### HiPerf 抓取配置参数 ![GitHub Logo](../../figures/perf/perfsetting.jpg) 配置项说明: @@ -14,45 +14,45 @@ HiPerf工具是对系统性能数据进行采样记录,并将采样数据保 - Frequency:配置抓取的频率。 - Call Stack:配置抓取的堆栈类型。 - Advance Options:更多的抓取配置项。 - 再点击Record setting,在output file path输入文件名hiprofiler_data_perf.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 + 再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_perf.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/perf/perfset.jpg) - 点击Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 + 点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 ![GitHub Logo](../../figures/perf/perfcommand.jpg) - 输入hdc_shell,进入设备,执行命令。 + 输入 hdc_shell,进入设备,执行命令。 ![GitHub Logo](../../figures/perf/perfexcutecommand.jpg) - 执行完成后,进入指定目录查看,在/data/local/tmp下就会生成trace文件。 + 执行完成后,进入指定目录查看,在/data/local/tmp 下就会生成 trace 文件。 ![GitHub Logo](../../figures/perf/perffile.jpg) -### HiPerf展示说明 +### HiPerf 展示说明 -将抓取的trace文件导入smartperf界面查看。 +将抓取的 trace 文件导入 smartperf 界面查看。 ![GitHub Logo](../../figures/perf/summary.jpg) -界面布局介绍:Perf整体界面布局分为3个部分: +界面布局介绍:Perf 整体界面布局分为 3 个部分: - 红色区域:泳道图。 - 绿色区域:详细信息(Perf Profile和Sample List)。 - 黄色区域:辅助信息(Callstack)。 -### HiPerf泳道图展示 +### HiPerf 泳道图展示 -Perf泳道图展示按照CPU使用量和线程和进程展示,鼠标移动到泳道图上,悬浮框会显示CPU的使用量。 +Perf 泳道图展示按照 CPU 使用量和线程和进程展示,鼠标移动到泳道图上,悬浮框会显示 CPU 的使用量。 ![GitHub Logo](../../figures/perf/chart.jpg) -按住w键放大界面,泳道图会出现P的标志,鼠标移动到P图标上,悬浮框会显示每个callstack和调用的深度如下图。 +按住 w 键放大界面,泳道图会出现 P 的标志,鼠标移动到 P 图标上,悬浮框会显示每个 callstack 和调用的深度如下图。 ![GitHub Logo](../../figures/perf/callstack.jpg) -Perf泳道图上浅色表示无效调用栈的采样点,抓取时由于设备上的对应的so无符号信息,函数跟地址都无法获取到,固该采样点在tab页中不做显示。 +Perf 泳道图上浅色表示无效调用栈的采样点,抓取时由于设备上的对应的 so 无符号信息,函数跟地址都无法获取到,固该采样点在 tab 页中不做显示。 ![GitHub Logo](../../figures/perf/perf_nocallstack.jpg) -### HiPerf泳道图的框选功能 +### HiPerf 泳道图的框选功能 -可以对CPU使用量区,线程和进程区数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有两个tab页。 -Perf Profile的Tab页如图: +可以对 CPU 使用量区,线程和进程区数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有两个 tab 页。 +Perf Profile 的 Tab 页如图: ![GitHub Logo](../../figures/perf/PerfProfile.jpg) - Call Stack:为经过符号解析后的Callstack,并且给出动态链接库或者进程名的信息。 - Local:为该调用方法自身占用的CPU时间。 - Weight:调用方法的执行次数和占比。 - Sample List的Tab页如图: + Sample List 的 Tab 页如图: ![GitHub Logo](../../figures/perf/Samplelist.jpg) - Sample Time:采样的时间戳信息。 - Core:当前的CPU核信息。 @@ -61,61 +61,61 @@ Perf Profile的Tab页如图: - State:运行状态。 - Backtrace:栈顶的调用栈名称。 -### HiPerf支持多种Options展示风格 +### HiPerf 支持多种 Options 展示风格 -点击Perf Profile的Tab页底部的Options,会有两个CheckBox复选框。 +点击 Perf Profile 的 Tab 页底部的 Options,会有两个 CheckBox 复选框。 ![GitHub Logo](../../figures/perf/Options.jpg) - Invert:反向输出调用树。 - Hide System so:隐藏系统库文件。 -### HiPerf支持过滤调用栈调用次数的展示风格 +### HiPerf 支持过滤调用栈调用次数的展示风格 -点击Perf Profile的Tab页底部的Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 +点击 Perf Profile 的 Tab 页底部的 Sample Counter Filter,可以填上区间值。过滤出符合该区间值调用次数的调用栈信息。 ![GitHub Logo](../../figures/perf/samplecounter.jpg) -### HiPerf功能的调用栈Group展示-数据分析支持剪裁功能 +### HiPerf 功能的调用栈 Group 展示-数据分析支持剪裁功能 ![GitHub Logo](../../figures/perf/datamining.jpg) -- 裁剪Callstack,点击Callstack上一个节点符号,再点击底部Symbol Filter按钮,则该符号自动被裁剪掉,同时将该节点往下所有的Callstack内容裁剪掉。 +- 裁剪 Callstack,点击 Callstack 上一个节点符号,再点击底部 Symbol Filter 按钮,则该符号自动被裁剪掉,同时将该节点往下所有的 Callstack 内容裁剪掉。 -- 裁剪Library,点击Library Filter按钮,则该库文件符号下所有的子节点也被裁剪。 -- 点击Reset按钮,将恢复选中的裁剪内容。 +- 裁剪 Library,点击 Library Filter 按钮,则该库文件符号下所有的子节点也被裁剪。 +- 点击 Reset 按钮,将恢复选中的裁剪内容。 -### HiPerf功能的调用栈Group展示支持按条件过滤 +### HiPerf 功能的调用栈 Group 展示支持按条件过滤 -在Input Filter输入关键字,会显示出带有该关键字的展示信息。 +在 Input Filter 输入关键字,会显示出带有该关键字的展示信息。 ![GitHub Logo](../../figures/perf/inputfilter.jpg) -### HiPerf辅助信息区展示调用栈 +### HiPerf 辅助信息区展示调用栈 -当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。对上展示到根节点,对下则展示CPU占用率最大的调用栈。调用栈右侧有Sliding bar可以滚动。 -如下图的Heaviest Stack Trace: +当在详细信息区选择一个符号时,将展示与该符号相关的完整的调用栈。对上展示到根节点,对下则展示 CPU 占用率最大的调用栈。调用栈右侧有 Sliding bar 可以滚动。 +如下图的 Heaviest Stack Trace: ![GitHub Logo](../../figures/perf/heaviesttrace1.jpg) -### HiPerf的火焰图功能 +### HiPerf 的火焰图功能 -点击Perf Profile左下角的柱状图的图标,会切换到火焰图页面。 +点击 Perf Profile 左下角的柱状图的图标,会切换到火焰图页面。 ![GitHub Logo](../../figures/perf/flame.jpg) -进入到火焰图页面,火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称,lib,addr,Count,%in current thread,%in current process,&in all process。 +进入到火焰图页面,火焰图的展示跟 Callinfo 的 tab 页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称,lib,addr,Count,%in current thread,%in current process,&in all process。 ![GitHub Logo](../../figures/perf/flameshow.jpg) -### HiPerf的show event count功能 +### HiPerf 的 show event count 功能 -在Hiperf的父级泳道图上增加筛选功能,可在Cpu Usage 和各种event type之间选择,切换选择之后即可将Hiperf下级各个泳道图数据更新,悬浮框可以根据选择的事件名显示对应的event count。 +在 Hiperf 的父级泳道图上增加筛选功能,可在 Cpu Usage 和各种 event type 之间选择,切换选择之后即可将 Hiperf 下级各个泳道图数据更新,悬浮框可以根据选择的事件名显示对应的 event count。 ![GitHub Logo](../../figures/perf/showevent.jpg) -### HiPerf的CPU/进程级/线程级泳道支持时序火焰图, 按照每个时间点的调用栈显示功能 +### HiPerf 的 CPU/进程级/线程级泳道支持时序火焰图, 按照每个时间点的调用栈显示功能 -根据Hiperf父级泳道图所筛选的类型,来显示各个CPU或者线程的时序火焰图,用户可根据自己的需要,点击泳道图旁边的齿轮标志筛选出某个cpu 或者线程的火焰时序图数据。 +根据 Hiperf 父级泳道图所筛选的类型,来显示各个 CPU 或者线程的时序火焰图,用户可根据自己的需要,点击泳道图旁边的齿轮标志筛选出某个 cpu 或者线程的火焰时序图数据。 ![GitHub Logo](../../figures/perf/cpuandthreadrow.jpg) -### HiPerf的调用栈分析饼图/火焰图支持按进程、线程粒度可选, 饼图和火焰图可以跳转功能 +### HiPerf 的调用栈分析饼图/火焰图支持按进程、线程粒度可选, 饼图和火焰图可以跳转功能 -HiPerf分为process、thread、library、function四层,调用栈均可在每层的表格上鼠标点击右键跳转到对应的火焰图Tab页。火焰图上方标题显示是由哪一层跳转而来,点击关闭图标火焰图重置为当前框选范围的所有数据。 +HiPerf 分为 process、thread、library、function 四层,调用栈均可在每层的表格上鼠标点击右键跳转到对应的火焰图 Tab 页。火焰图上方标题显示是由哪一层跳转而来,点击关闭图标火焰图重置为当前框选范围的所有数据。 ![GitHub Logo](../../figures/perf/perf_analysisjump.jpg) -如上图,右键点击hiprofiler_plugins可以跳转到下图 +如上图,右键点击 hiprofiler_plugins 可以跳转到下图 ![GitHub Logo](../../figures/perf/perf_jumpframe.jpg) -筛选面板新增Hide Thread、Hide Thread State筛选选项,Hiperf可隐藏线程和状态。 +筛选面板新增 Hide Thread、Hide Thread State 筛选选项,Hiperf 可隐藏线程和状态。 ![GitHub Logo](../../figures/perf/perf_hide.jpg) diff --git a/ide/src/doc/md/quickstart_hisystemevent.md b/ide/src/doc/md/quickstart_hisystemevent.md index ef3f419cc..8e8d80e9d 100644 --- a/ide/src/doc/md/quickstart_hisystemevent.md +++ b/ide/src/doc/md/quickstart_hisystemevent.md @@ -1,27 +1,27 @@ -# HiSystemEvent的抓取和展示说明 +# HiSystemEvent 的抓取和展示说明 -HiSystemEvent应用功耗模块主要是展示应用的各个子类别功耗占比信息、应用的资源申请使用记录信息、应用功耗异常事件信息、功耗关联系统状态信息。 +HiSystemEvent 应用功耗模块主要是展示应用的各个子类别功耗占比信息、应用的资源申请使用记录信息、应用功耗异常事件信息、功耗关联系统状态信息。 -## HiSystemEvent的抓取 +## HiSystemEvent 的抓取 -### HiSystemEvent抓取配置参数 +### HiSystemEvent 抓取配置参数 -打开Start Hisystem Event Tracker Record开关抓取HiSystemEvent数据。 +打开 Start Hisystem Event Tracker Record 开关抓取 HiSystemEvent 数据。 ![GitHub Logo](../../figures/HiSystemEvent/hisyseventsetting.jpg) -再点击Record setting,在output file path输入文件名hiprofiler_data_hisystemevent.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_hisystemevent.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemeventrecord.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemcommand.jpg) -输入hdc_std shell,进入设备,执行上述生成的命令。 +输入 hdc_std shell,进入设备,执行上述生成的命令。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemeventemexcute.jpg) -执行完成后,进入指定目录查看,在/data/local/tmp下就会生成trace文件。 +执行完成后,进入指定目录查看,在/data/local/tmp 下就会生成 trace 文件。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemeventfile.jpg) -### HiSystemEvent展示说明 +### HiSystemEvent 展示说明 -### HiSystemEvent的Energy泳道图展示 +### HiSystemEvent 的 Energy 泳道图展示 -将抓取的trace文件导入smartperf界面查看。 +将抓取的 trace 文件导入 smartperf 界面查看。 ![GitHub Logo](../../figures/HiSystemEvent/hisystemeventsummary.jpg) 泳道图说明: @@ -36,15 +36,15 @@ HiSystemEvent应用功耗模块主要是展示应用的各个子类别功耗占 - Bluetooth Br Switch State泳道:鼠标悬浮可以显示蓝牙开关状态(enable:开, disable:关)。 - Location Switch State泳道:鼠标悬浮可以显示GPS开关状态(enable:开,disable:关)。 -### HiSystemEvent的Energy泳道图的框选功能 +### HiSystemEvent 的 Energy 泳道图的框选功能 -可以对Energy各泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格。 -System Details的Tab页如图: +可以对 Energy 各泳道图进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格。 +System Details 的 Tab 页如图: ![GitHub Logo](../../figures/HiSystemEvent/hisystemdetails.jpg) - Event Name: 事件名称,事件包括后台任务,应用锁,GPS定位。 - Time: 时间戳信息。 - 点击事件名会显示该事件的详细信息的Tab页。 + 点击事件名会显示该事件的详细信息的 Tab 页。 ![GitHub Logo](../../figures/HiSystemEvent/systemselectdetals.jpg) - EVENT_NAME:事件名称。 - PID:应用PID。 @@ -55,7 +55,7 @@ System Details的Tab页如图: - NAME:NAME信息。 - MESSAGE:MESSAGE信息。 - TAG:锁名。 - Power Battery的Tab页如图: + Power Battery 的 Tab 页如图: ![GitHub Logo](../../figures/HiSystemEvent/hisyseventPowerBattery.jpg) - Gas Gauge: 电池电量。 - Charge:充电状态。 @@ -64,7 +64,7 @@ System Details的Tab页如图: - Current:电池电流。 - Capacity:电池容量。 - APP Name:应用包名。 - Power Details的Tab页如图: + Power Details 的 Tab 页如图: ![GitHub Logo](../../figures/HiSystemEvent/hisyseventPowerdetails.jpg) - UID: 应用UID。 - Charge:充电状态。 @@ -91,13 +91,13 @@ System Details的Tab页如图: - Count:应用个数。 - Energy Percent(%):功耗占比。 -### HiSystemEvent的Hisysevent泳道图展示 +### HiSystemEvent 的 Hisysevent 泳道图展示 ![GitHub Logo](../../figures/HiSystemEvent/hisystemeventrow.jpg) -### HiSystemEvent的Hisysevent泳道图框选功能 +### HiSystemEvent 的 Hisysevent 泳道图框选功能 -框选Hisysevent的泳道图,展示Hisysevents的tab页,有Filter by Domain,Filter by eventname,Filter by contents输入框。All下拉框可以选择level级别 +框选 Hisysevent 的泳道图,展示 Hisysevents 的 tab 页,有 Filter by Domain,Filter by eventname,Filter by contents 输入框。All 下拉框可以选择 level 级别 ![GitHub Logo](../../figures/HiSystemEvent/hisyseventtab.jpg) - id: id值。 @@ -112,7 +112,7 @@ System Details的Tab页如图: - level:事件级别。 - seq:序列号。 - contents:抓取内容。 - 框选Hisysevent的泳道图,展示Statistics的tab页。 + 框选 Hisysevent 的泳道图,展示 Statistics 的 tab 页。 ![GitHub Logo](../../figures/HiSystemEvent/hisyseventStatistics.jpg) - Level/Domain/EventName:根据级别,Domain,事件名显示。 - Count: 各级别事件个数。 diff --git a/ide/src/doc/md/quickstart_keywords_shortcuts.md b/ide/src/doc/md/quickstart_keywords_shortcuts.md index 797cfd849..c8b2661e3 100644 --- a/ide/src/doc/md/quickstart_keywords_shortcuts.md +++ b/ide/src/doc/md/quickstart_keywords_shortcuts.md @@ -8,7 +8,7 @@ - a/d:界面的左/右移动。 - m:对指定区域进行临时标记。 - Shift+m:对指定区域进行永久标记。 -- ctrl+[/]:对Shift+m的的标尺进行左右跳转。 +- ctrl+[/]:对 Shift+m 的的标尺进行左右跳转。 - ctrl+,/.:对旗子标志进行左右跳转。 ### 鼠标和键盘的操作 diff --git a/ide/src/doc/md/quickstart_native_memory.md b/ide/src/doc/md/quickstart_native_memory.md index 6cc1a2729..d6474b1be 100644 --- a/ide/src/doc/md/quickstart_native_memory.md +++ b/ide/src/doc/md/quickstart_native_memory.md @@ -1,55 +1,55 @@ -# Native Memory抓取和展示说明 +# Native Memory 抓取和展示说明 -Native Memory是查看内存的分配和释放等情况。 +Native Memory 是查看内存的分配和释放等情况。 -## Native Memory的抓取 +## Native Memory 的抓取 -### Native Memory抓取配置参数 +### Native Memory 抓取配置参数 ![GitHub Logo](../../figures/NativeMemory/nativememorysetting.jpg) 配置参数说明: -- ProcessId or ProcessName:设置抓取的进程ID或者进程名,此处以输入com.ohos.mms进程名为例。 +- ProcessId or ProcessName:设置抓取的进程 ID 或者进程名,此处以输入 com.ohos.mms 进程名为例。 - Max unwind level:抓取的栈的最大深度。 -- Shared Memory Size:native_daemon和native_hook进程之间存储数据的共享内存大小。 -- Filter Memory Size:只抓取大于该size的malloc数据(free不受影响)。 -- Use Fp Unwind:Fp回栈。 +- Shared Memory Size:native_daemon 和 native_hook 进程之间存储数据的共享内存大小。 +- Filter Memory Size:只抓取大于该 size 的 malloc 数据(free 不受影响)。 +- Use Fp Unwind:Fp 回栈。 - Use Record Accurately:不过滤数据,上报全量的。 - Use Offline Symbolization:离线符号化。 - Use Record Statistics:统计数据上报时间间隔设置。 - Use Startup Mode :抓取应用启动阶段的内存(默认是关闭,需要抓取应用启阶段内存可开启)。 -再点击Record setting,在output file path输入文件名hiprofiler_data_nativememory.htrace,拖动滚动条设置buffer size大小是64M,抓取时长是50s。 +再点击 Record setting,在 output file path 输入文件名 hiprofiler_data_nativememory.htrace,拖动滚动条设置 buffer size 大小是 64M,抓取时长是 50s。 ![GitHub Logo](../../figures/NativeMemory/nativememoryset.jpg) -点击Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 +点击 Trace command,就会根据上面的配置生成抓取命令,点击复制按钮,会将命令行复制。 ![GitHub Logo](../../figures/NativeMemory/nativememorycommand.jpg) 命令行参数说明: -- save_file:是否将hook数据保存成文件,不上报protobuf形式数据给hiprofilerd。 -- filter_size:过滤malloc的大小,最小值是0,默认值是4096Byte。 -- smb_pages:nativedeamon与libnativehook间的共享内存大小。 +- save_file:是否将 hook 数据保存成文件,不上报 protobuf 形式数据给 hiprofilerd。 +- filter_size:过滤 malloc 的大小,最小值是 0,默认值是 4096Byte。 +- smb_pages:nativedeamon 与 libnativehook 间的共享内存大小。 - max_stack_depth:最多回栈的层数,也就是抓取的栈的最大深度。 - process_name:抓取的应用进程名。 - string_compressed:是否进行字符串压缩。 -- fp_unwind:是否进行fp回栈。 +- fp_unwind:是否进行 fp 回栈。 - callframe_compress: 是否进行栈帧压缩。 - record_accurately: 是否不过滤数据,上报全量的。 - offline_symbolization: 是否离线符号化。 - statistics_interval: 统计模式下上报数据的时间间隔。 - startup_mode: 是否需要抓取应用启动阶段内存。 -输入hdc_std shell,进入设备,执行命令。 +输入 hdc_std shell,进入设备,执行命令。 ![GitHub Logo](../../figures/NativeMemory/nativeexcutecommand.jpg) -执行完成后,进入指定目录查看,在/data/local/tmp下就会生成trace文件。 +执行完成后,进入指定目录查看,在/data/local/tmp 下就会生成 trace 文件。 ![GitHub Logo](../../figures/NativeMemory/naitvememoryfile.jpg) -## Native Memory展示说明 +## Native Memory 展示说明 -将抓取的nativememory文件导入到smartperf工具中查看,查看内存的分配和释放等情况。 +将抓取的 nativememory 文件导入到 smartperf 工具中查看,查看内存的分配和释放等情况。 -### Native Memory泳道图展示类型 +### Native Memory 泳道图展示类型 点击齿轮状的图标可以设置内存的展示单位。 ![GitHub Logo](../../figures/NativeMemory/NativeChart.jpg) @@ -60,10 +60,10 @@ Native Memory是查看内存的分配和释放等情况。 - All Heap:malloc分配的内存。 - All Anonymous VM:mmap分配的内存。 -### Native Memory泳道图的框选功能 +### Native Memory 泳道图的框选功能 -可以对内存的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有四个tab页。 -Statistics的Tab页,主要显示了统计明细类型。 +可以对内存的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有四个 tab 页。 +Statistics 的 Tab 页,主要显示了统计明细类型。 ![GitHub Logo](../../figures/NativeMemory/Statistics.jpg) - Memory Type:内存的类型。 @@ -76,13 +76,13 @@ Statistics的Tab页,主要显示了统计明细类型。 - Peak Value: 框选区间内内存申请的峰值。 - Existing/Total:框选区间内剩余的内存比上申请的内存,其中浅紫色是框选区间内申请的大小/整个时间轴(申请+释放的总大小),深紫色是框选区间内(申请+释放)的大小/整个时间轴(申请+释放的总大小)。 -Call Info的Tab页,主要显示了调用树详细类型。 +Call Info 的 Tab 页,主要显示了调用树详细类型。 ![GitHub Logo](../../figures/NativeMemory/CallInfo.jpg) - Symble Name:每个内存分配的调用栈。 - Size:分配的总大小。 - Count:相同调用栈出现的次数。 - Native Memory的Tab页,主要显示了单次分配信息列表。 + Native Memory 的 Tab 页,主要显示了单次分配信息列表。 ![GitHub Logo](../../figures/NativeMemory/NativeMemory.jpg) - Address:内存块的地址。 - Memory Type:内存分配的类型。 @@ -91,7 +91,7 @@ Call Info的Tab页,主要显示了调用树详细类型。 - Size:该次申请分配内存的大小。 - Responsible Library :调用该函数的库。 - Responsible Caller :调用该函数的方法。 - Snapshot List的Tab页,主要显示了各时刻内存的增长的差值。 + Snapshot List 的 Tab 页,主要显示了各时刻内存的增长的差值。 ![GitHub Logo](../../figures/NativeMemory/Snapshotlist.jpg) - Snapshot:标记的打点说明。 - Timestamp :时间戳信息。 @@ -99,30 +99,30 @@ Call Info的Tab页,主要显示了调用树详细类型。 - Total Growth :自从上次Snapshot的增长量,是计算的每一次分配的。 - #Existing :仍然存在的内存数。 -### Native Memory的辅助信息功能 +### Native Memory 的辅助信息功能 -在Call Info和Native Memory的Tab页,点击选中某一行,右边画红线处会显示出该行调用栈的树结构信息。 +在 Call Info 和 Native Memory 的 Tab 页,点击选中某一行,右边画红线处会显示出该行调用栈的树结构信息。 ![GitHub Logo](../../figures/NativeMemory/nativecallstack.jpg) -### Native Memory详细显示的过滤功能 +### Native Memory 详细显示的过滤功能 -点击下方的All Allocations可以对Allocation的lifeSpan进行过滤,有三个选择:All Allocatios,Create & Existing,Create & Destroyed。 +点击下方的 All Allocations 可以对 Allocation 的 lifeSpan 进行过滤,有三个选择:All Allocatios,Create & Existing,Create & Destroyed。 ![GitHub Logo](../../figures/NativeMemory/lifespan.jpg) - All Allocations:所有的内存。 - Created & Existing:创建且被存活的内存。 - Created & Destroyed: 创建且被销毁的内存。 - 点击下方的All Heap&Anonymous可以对内存类型进行过滤。 + 点击下方的 All Heap&Anonymous 可以对内存类型进行过滤。 ![GitHub Logo](../../figures/NativeMemory/AllocationType.jpg) - All Heap&AnonuymousVM:Heap和AnonuymousVM的总量。 - All Heap:malloc分配的内存。 - All Anonymous VM:mmap的匿名页。 - 点击下方的Mark Snapshot可以在时间轴上打标签。出现小旗的标志,通过标注多个时间点。点击到Snapshot List标签页可以看到各个时间点的内存的增长值。 + 点击下方的 Mark Snapshot 可以在时间轴上打标签。出现小旗的标志,通过标注多个时间点。点击到 Snapshot List 标签页可以看到各个时间点的内存的增长值。 ![GitHub Logo](../../figures/NativeMemory/Generation.jpg) -### Native Memory的火焰图功能 +### Native Memory 的火焰图功能 -火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称,栈的所在库名,地址,size大小,栈的个数。 +火焰图的展示跟 Callinfo 的 tab 页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称,栈的所在库名,地址,size 大小,栈的个数。 ![GitHub Logo](../../figures/NativeMemory/nativeflameshow.jpg) ### 基于函数进行调用栈(单个或多个)选择后可以在时间轴上显示内存操作点 @@ -132,42 +132,42 @@ Call Info的Tab页,主要显示了调用树详细类型。 ### 内存搜索大小写不敏感,上层火焰图的大小和总内存需要根据搜索内容动态调整 -执行搜索的关键字大小写不区分,搜索的函数的parent只显示搜索的children的大小之和,且可以与点选联动。 +执行搜索的关键字大小写不区分,搜索的函数的 parent 只显示搜索的 children 的大小之和,且可以与点选联动。 ### 焦点函数火焰图详细展开:选中函数的全部调用栈展示 -点击调用栈某个函数,点击函数调用的函数对应铺满画布,点击函数的parent,显示以及绘制的大小变化为点击函数的大小,如下图点击OHOS::EglCoreInit()函数,会显示该函数的全部调用栈。 +点击调用栈某个函数,点击函数调用的函数对应铺满画布,点击函数的 parent,显示以及绘制的大小变化为点击函数的大小,如下图点击 OHOS::EglCoreInit()函数,会显示该函数的全部调用栈。 ![GitHub Logo](../../figures/NativeMemory/eg_callstack.jpg) ### 搜索框支持表达式输入 -调用栈默认显示火焰图,新增搜索框表达式输入。表达式作用范围为nativehook统计与非统计模式。其中处理的均为Responsible Library与Responsible Caller,其中Responsible Library,Responsible Caller表示从下往上非libc++ musl的第一条调用栈的lib跟symbol,如下图所示,由于最后一条 [ operator new(unsigned long) ] libc++.so为libc++.so的函数,固跳过,所以该条调用栈的Responsible Library为 libhilog.so,Responsible Caller为OHOS::HiviewDFX::GetDomainLevel(unsigned int) 。 +调用栈默认显示火焰图,新增搜索框表达式输入。表达式作用范围为 nativehook 统计与非统计模式。其中处理的均为 Responsible Library 与 Responsible Caller,其中 Responsible Library,Responsible Caller 表示从下往上非 libc++ musl 的第一条调用栈的 lib 跟 symbol,如下图所示,由于最后一条 [ operator new(unsigned long) ] libc++.so 为 libc++.so 的函数,固跳过,所以该条调用栈的 Responsible Library 为 libhilog.so,Responsible Caller 为 OHOS::HiviewDFX::GetDomainLevel(unsigned int) 。 ![GitHub Logo](../../figures/NativeMemory/framecaller.jpg) -表达式说明:在InputFilter输入框可以进行搜索过滤和表达式过滤,其中表达式必须以@开头,英文括号包起所需要过滤的内容,每个括号必须包括 (Responsible Library,Responsible Caller)匹配全量以\*表示,否则认为该输入为搜索过滤。 - -| 表达式 | 含义 | -| --------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------- | -| @(libquickjs tryalloc) | 只显示 Responsible Library为libquickjs 且Responsible Caller包含tryalloc的数据 | -| @(libquickjs \*) | 只显示Responsible Library包含libquickjs的数据 | -| @(\* tryalloc codec bitmapcache skYUV) | 只显示 Responsible Library为任意值 且Responsible Caller包含tryalloc或codec或bitmapcache或skYUV的数据 | -| @(libglobal *,*resourceManager) | 只显示Responsible Library包含libglobal且 Responsible Caller为任意值的数据 或 Responsible Library为任意值,Responsible Caller包含resourceManager的数据 | -| @(/data/user \*) | 只显示Responsible Library路径/data/user且symbol为任意值的数据 | -| @(mali.so _,libGLES_mali.so _) | 只显示Responsible Library包含mali.so或者libGLES_mali.so的数据 | -| @(\* PixelMap:ReadImageData) | 只显示Responsible Caller包含PixelMap:ReadImageData的数据 | -| | | -| @-(libark jsvm table) | 不显示Responsible Library包含libark且Responsible Caller包含jsvm或者table的数据 | -| @-(librender picture, libskia picture)
| 不显示Responsible Library包含librender或者libskia且Responsible Caller中包含picture的数据 | -| @-(libark \*) | 不显示Responsible Library包含libark的数据 | -| @-(\* table) | 不显示Responsible Caller中table的数据 | -| | | -| @(_ table) - (libark _) | 只显示Responsible Caller包含table且Responsible Library不为libark的数据 | - -### Native Memory数据统计功能 - -选择Use Record Statistics和statistics interval配置项抓取的数据,只会显示Call Info的Tab页,Call Info相关功能同上。 +表达式说明:在 InputFilter 输入框可以进行搜索过滤和表达式过滤,其中表达式必须以@开头,英文括号包起所需要过滤的内容,每个括号必须包括 (Responsible Library,Responsible Caller)匹配全量以\*表示,否则认为该输入为搜索过滤。 + +| 表达式 | 含义 | +| --------------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------- | +| @(libquickjs tryalloc) | 只显示 Responsible Library 为 libquickjs 且 Responsible Caller 包含 tryalloc 的数据 | +| @(libquickjs \*) | 只显示 Responsible Library 包含 libquickjs 的数据 | +| @(\* tryalloc codec bitmapcache skYUV) | 只显示 Responsible Library 为任意值 且 Responsible Caller 包含 tryalloc 或 codec 或 bitmapcache 或 skYUV 的数据 | +| @(libglobal *,*resourceManager) | 只显示 Responsible Library 包含 libglobal 且 Responsible Caller 为任意值的数据 或 Responsible Library 为任意值,Responsible Caller 包含 resourceManager 的数据 | +| @(/data/user \*) | 只显示 Responsible Library 路径/data/user 且 symbol 为任意值的数据 | +| @(mali.so _,libGLES_mali.so _) | 只显示 Responsible Library 包含 mali.so 或者 libGLES_mali.so 的数据 | +| @(\* PixelMap:ReadImageData) | 只显示 Responsible Caller 包含 PixelMap:ReadImageData 的数据 | +| | | +| @-(libark jsvm table) | 不显示 Responsible Library 包含 libark 且 Responsible Caller 包含 jsvm 或者 table 的数据 | +| @-(librender picture, libskia picture)
| 不显示 Responsible Library 包含 librender 或者 libskia 且 Responsible Caller 中包含 picture 的数据 | +| @-(libark \*) | 不显示 Responsible Library 包含 libark 的数据 | +| @-(\* table) | 不显示 Responsible Caller 中 table 的数据 | +| | | +| @(_ table) - (libark _) | 只显示 Responsible Caller 包含 table 且 Responsible Library 不为 libark 的数据 | + +### Native Memory 数据统计功能 + +选择 Use Record Statistics 和 statistics interval 配置项抓取的数据,只会显示 Call Info 的 Tab 页,Call Info 相关功能同上。 ![GitHub Logo](../../figures/NativeMemory/statiscsCallInfo.jpg) -### Native Memory多进程数据显示 +### Native Memory 多进程数据显示 -前端可以支持多进程数据的展示,通过在tab页切换不同进程,可以显示不同进程的hook数据。 +前端可以支持多进程数据的展示,通过在 tab 页切换不同进程,可以显示不同进程的 hook 数据。 ![GitHub Logo](../../figures/NativeMemory/hook_moreprocess.jpg) diff --git a/ide/src/doc/md/quickstart_parsing_ability.md b/ide/src/doc/md/quickstart_parsing_ability.md index a0c1622a7..b3bb85846 100644 --- a/ide/src/doc/md/quickstart_parsing_ability.md +++ b/ide/src/doc/md/quickstart_parsing_ability.md @@ -1,27 +1,27 @@ -# Trace解析能力增强 +# Trace 解析能力增强 -Trace解析能力增强主要是提高Trace的解析能力。 +Trace 解析能力增强主要是提高 Trace 的解析能力。 -### 焦点问题trace切割,选择焦点trace,聚焦问题发生时间范围,单独打开 +### 焦点问题 trace 切割,选择焦点 trace,聚焦问题发生时间范围,单独打开 -焦点问题切割是将现有的trace加载到界面时,对指定时间进行框选,截取框选时间范围内的trace数据通过跳转的方式去打开新的trace界面,新界面的trace数据就是按照这段时间范围去切割的。如下图框选一段时间范围,点击右上方的小剪刀图标对框选时间范围数据进行剪切。 +焦点问题切割是将现有的 trace 加载到界面时,对指定时间进行框选,截取框选时间范围内的 trace 数据通过跳转的方式去打开新的 trace 界面,新界面的 trace 数据就是按照这段时间范围去切割的。如下图框选一段时间范围,点击右上方的小剪刀图标对框选时间范围数据进行剪切。 ![GitHub Logo](../../figures/parsingability/cuttrace_bytime.jpg) -### 超大trace分段打开,超大trace按照固定大小切割,分段打开显示 +### 超大 trace 分段打开,超大 trace 按照固定大小切割,分段打开显示 -超大trace分段打开是对现有配置抓取的同一种时钟源数据源的。也就是配置命令下发的抓取有效。Htrace数据按照端测切割的大小的分成多个文件,并将不能切割的hiperf、ebpf、arkts的数据单独存储。IDE通过将这几种源文件数据存储在IndexedDB,并调用trace streamer去进行切割数据,并在IDE测过滤筛选出切割的数据进行展示。 +超大 trace 分段打开是对现有配置抓取的同一种时钟源数据源的。也就是配置命令下发的抓取有效。Htrace 数据按照端测切割的大小的分成多个文件,并将不能切割的 hiperf、ebpf、arkts 的数据单独存储。IDE 通过将这几种源文件数据存储在 IndexedDB,并调用 trace streamer 去进行切割数据,并在 IDE 测过滤筛选出切割的数据进行展示。 -#### 超大trace浏览器用户数据目录配置说明 +#### 超大 trace 浏览器用户数据目录配置说明 -由于大文件切割的数据是保存在浏览器的IndexedDb中,默认存储在系统盘,所以需要修改用户目录数据存放位置。 +由于大文件切割的数据是保存在浏览器的 IndexedDb 中,默认存储在系统盘,所以需要修改用户目录数据存放位置。 -##### 找到浏览器的exe执行文件位置(或者浏览器exe的快捷方式位置), 在cmd窗口执行以下命令(edge浏览器) +##### 找到浏览器的 exe 执行文件位置(或者浏览器 exe 的快捷方式位置), 在 cmd 窗口执行以下命令(edge 浏览器) D:\deskTop\msedge.exe.lnk --user-data-dir=D:\Edgedata D:\deskTop\msedge.exe.lnk 浏览器的exe执行文件位置(或者浏览器exe的快捷方式位置) --user-data-dir=D:\Edgedata 指定用户目录数据位置,本地除系统盘外的位置都可以,内存尽量大一点 -##### 浏览器exe或者exe快捷方式目录和名称不能有带空格 +##### 浏览器 exe 或者 exe 快捷方式目录和名称不能有带空格 错误:D:\desk Top\Microsoft Edge.exe.lnk --user-data-dir=D:\Edgedata 正确:D:\deskTop\MicrosoftEdge.exe.lnk --user-data-dir=D:\Edgedata @@ -31,28 +31,28 @@ Trace解析能力增强主要是提高Trace的解析能力。 edge浏览器: edge://version/ chrome浏览器: chrome://version/ -#### 超大trace抓取配置说明 +#### 超大 trace 抓取配置说明 ![GitHub Logo](../../figures/parsingability/bigtracerecord.jpg) - Long Trace Mode: 超大trace抓取模式。 - Single file max size: trace文件分割的大小。 -#### 本地导入超大trace +#### 本地导入超大 trace -本地导入超大trace是导入文件夹,将该文件夹中所有文件导入。如下图从Open long trace file入口导入。 +本地导入超大 trace 是导入文件夹,将该文件夹中所有文件导入。如下图从 Open long trace file 入口导入。 ![GitHub Logo](../../figures/parsingability/longtraceload.jpg) 本地导入以后,点击右上方的切页图标可以切页。 ![GitHub Logo](../../figures/parsingability/longtraceswitch.jpg) -### web端支持已打开的trace文件转换成systrace,并可下载 +### web 端支持已打开的 trace 文件转换成 systrace,并可下载 -已打开的trace界面,增加trace conver按钮,支持将htrace和row trace转为systrace。 +已打开的 trace 界面,增加 trace conver 按钮,支持将 htrace 和 row trace 转为 systrace。 ![GitHub Logo](../../figures/parsingability/traceconvert.jpg) -### tracestreamer离线执行sql和metrics语句,对标trace_processor_shell –q和—run-metrics +### tracestreamer 离线执行 sql 和 metrics 语句,对标 trace_processor_shell –q 和—run-metrics -trace_streamer_shell –q可以直接将sql查询结果显示在命令行里,如下图bytrace.ftrace是需要解析的文件,a.txt是sql语句。 +trace_streamer_shell –q 可以直接将 sql 查询结果显示在命令行里,如下图 bytrace.ftrace 是需要解析的文件,a.txt 是 sql 语句。 ![GitHub Logo](../../figures/parsingability/tracestreamer_q.jpg) -trace_streamer_shell –m可以直接将metric接口的查询结果显示在命令行里,如下图bytrace.ftrace是需要解析的文件,trace_stats是metric接口名。 +trace_streamer_shell –m 可以直接将 metric 接口的查询结果显示在命令行里,如下图 bytrace.ftrace 是需要解析的文件,trace_stats 是 metric 接口名。 ![GitHub Logo](../../figures/parsingability/tsmetric.jpg) diff --git a/ide/src/doc/md/quickstart_systemtrace.md b/ide/src/doc/md/quickstart_systemtrace.md index 3306e00b7..4802cbbdb 100644 --- a/ide/src/doc/md/quickstart_systemtrace.md +++ b/ide/src/doc/md/quickstart_systemtrace.md @@ -1,83 +1,83 @@ -# web端加载trace说明 +# web 端加载 trace 说明 -从web端查看trace文件,进行性能检测的分析。 +从 web 端查看 trace 文件,进行性能检测的分析。 ## 文件加载入口 -将抓取的trace导入查看。 +将抓取的 trace 导入查看。 ![GitHub Logo](../../figures/Web/opentrace.jpg) 说明: -- Open trace file:导入离线trace文件入口。 +- Open trace file:导入离线 trace 文件入口。 - Open long trace file:导入大文件入口。 -- Record new trace:抓取新的trace文件入口。 -- Record template:抓取指定模块的trace入口。 +- Record new trace:抓取新的 trace 文件入口。 +- Record template:抓取指定模块的 trace 入口。 -## 导入trace文件后显示页面 +## 导入 trace 文件后显示页面 ![GitHub Logo](../../figures/Web/trace.jpg) 说明: -- 操作说明:在当前页面可以通过键盘上的wasd四个键位操纵当前的时间轴进行缩放,w为放大,s为缩小,a为左移,d为右移。 +- 操作说明:在当前页面可以通过键盘上的 wasd 四个键位操纵当前的时间轴进行缩放,w 为放大,s 为缩小,a 为左移,d 为右移。 -## trace功能介绍 +## trace 功能介绍 -trace模块从上往下主要展示时间轴、cpu使用率、cpu使用情况、进程间通讯数据的方法调用情况、进程、线程和方法调用情况。 +trace 模块从上往下主要展示时间轴、cpu 使用率、cpu 使用情况、进程间通讯数据的方法调用情况、进程、线程和方法调用情况。 -### 时间轴和cpu使用率 +### 时间轴和 cpu 使用率 ![GitHub Logo](../../figures/Web/time.jpg) 最上方带刻度的为时间轴,主要展示当前抓取数据的总时长和时间刻度的分布情况,如上图所示,左下角展示总时长。 -中间区域展示的是抓取数据时间段内的cpu使用率,颜色越深代表cpu使用率越高,颜色越浅代表cpu使用率越低。 +中间区域展示的是抓取数据时间段内的 cpu 使用率,颜色越深代表 cpu 使用率越高,颜色越浅代表 cpu 使用率越低。 ![GitHub Logo](../../figures/Web/highlit.jpg) 在白色背景时间轴区域内可以点击后拖拽鼠标,可以对从鼠标按下到拖拽完成鼠标松开的区域内的数据进行筛选,高亮显示的部分为当前所选区域,如上图所示。 -### cpu使用情况 +### cpu 使用情况 ![GitHub Logo](../../figures/Web/cpu.jpg) -如上图所示,当前抓取数据有4个cpu工作,前四组数据对应的是当前调用cpu的线程和对应的进程情况,以颜色作为区分。后四组数据则为cpu的使用频率信息。鼠标移动到相应的线程上还会将当前选中的进程信息全部置为高亮,其他的进程会置灰,如下图所示。 +如上图所示,当前抓取数据有 4 个 cpu 工作,前四组数据对应的是当前调用 cpu 的线程和对应的进程情况,以颜色作为区分。后四组数据则为 cpu 的使用频率信息。鼠标移动到相应的线程上还会将当前选中的进程信息全部置为高亮,其他的进程会置灰,如下图所示。 ![GitHub Logo](../../figures/Web/gray.jpg) -#### cpu使用情况的框选功能 +#### cpu 使用情况的框选功能 -可以对cpu的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有六个tab页。 -CPU by thread的Tab页,主要显示了在框选时间区间内的进程名、进程号、线程名、线程号、总运行时长、平均运行时长和调度次数信息。 +可以对 cpu 的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,总共有六个 tab 页。 +CPU by thread 的 Tab 页,主要显示了在框选时间区间内的进程名、进程号、线程名、线程号、总运行时长、平均运行时长和调度次数信息。 ![GitHub Logo](../../figures/Web/cpubythread.jpg) -CPU by process的Tab页,主要显示了在框选时间区间内的进程名、进程号、总运行时长、平均运行时长和调度次数信息。 +CPU by process 的 Tab 页,主要显示了在框选时间区间内的进程名、进程号、总运行时长、平均运行时长和调度次数信息。 ![GitHub Logo](../../figures/Web/cpubyprocess.jpg) -CPU Usage的Tab页,主要显示了在框选时间区间内,该频率时间占比前三的信息。 +CPU Usage 的 Tab 页,主要显示了在框选时间区间内,该频率时间占比前三的信息。 ![GitHub Logo](../../figures/Web/cpusage.jpg) -Thread Switches的Tab页,按照状态>进程>线程,统计对应状态下的次数,持续时长,最小时长,平均时长,最大时长信息。 +Thread Switches 的 Tab 页,按照状态>进程>线程,统计对应状态下的次数,持续时长,最小时长,平均时长,最大时长信息。 ![GitHub Logo](../../figures/Web/threadswitches.jpg) -Thread States的Tab页,按进程>线程>状态的维度去统计,需要呈现该状态的线程名、进入该状态次数、该状态下时长、最小时长、平均时长、最大时长。 +Thread States 的 Tab 页,按进程>线程>状态的维度去统计,需要呈现该状态的线程名、进入该状态次数、该状态下时长、最小时长、平均时长、最大时长。 ![GitHub Logo](../../figures/Web/threadstates.jpg) -Sched Priority的Tab页,按优先级显示调度,显示框选范围内所有Running以及Running之前的Runnable线程的最小,最大,平均耗时。 +Sched Priority 的 Tab 页,按优先级显示调度,显示框选范围内所有 Running 以及 Running 之前的 Runnable 线程的最小,最大,平均耗时。 ![GitHub Logo](../../figures/Web/schedpritab.jpg) -Thread States、Thread Switches的2个Tab页,点击移动到某一行,鼠标会变成一个小手的标志,并且会高亮,点击一下,就会进入辅助信息界面,会将选中行的辅助信息展示出来,包括开始时间、进程、线程、线程状态、对应的CPU、优先级等信息如下图。 +Thread States、Thread Switches 的 2 个 Tab 页,点击移动到某一行,鼠标会变成一个小手的标志,并且会高亮,点击一下,就会进入辅助信息界面,会将选中行的辅助信息展示出来,包括开始时间、进程、线程、线程状态、对应的 CPU、优先级等信息如下图。 ![GitHub Logo](../../figures/Web/details.jpg) -#### cpu使用情况的单选功能 +#### cpu 使用情况的单选功能 -单选CPU使用情况数据会在选中的色块外层加上深色边框,能够突出当前选中色块,弹出层中会展示当前CPU上的进程名,线程名,开始时间的相对时间,开始时间的绝对时间,运行时长,线程结束状态信息。 +单选 CPU 使用情况数据会在选中的色块外层加上深色边框,能够突出当前选中色块,弹出层中会展示当前 CPU 上的进程名,线程名,开始时间的相对时间,开始时间的绝对时间,运行时长,线程结束状态信息。 ![GitHub Logo](../../figures/Web/cpuclick.jpg) ### 线程唤醒关系树 -线程唤醒关系树功能是点击GetWakeupList会以链式结构和表格分别在泳道图和tab上展示线程的唤醒关系树信息,点击GetWakeupList按钮旁边的星号按钮可以对唤醒树对应的泳道图一键收藏,对优先级最低且运行时长最长或者运行时长最长的线程会以红色字体高亮显示。 +线程唤醒关系树功能是点击 GetWakeupList 会以链式结构和表格分别在泳道图和 tab 上展示线程的唤醒关系树信息,点击 GetWakeupList 按钮旁边的星号按钮可以对唤醒树对应的泳道图一键收藏,对优先级最低且运行时长最长或者运行时长最长的线程会以红色字体高亮显示。 ![GitHub Logo](../../figures/Web/threadtree.jpg) ### 进程、线程和方法数据 -下图是进程数据,左边部分展示进程名称和id,右边显示线程切换关系,线程的调用方法,进程间内存信息等。 +下图是进程数据,左边部分展示进程名称和 id,右边显示线程切换关系,线程的调用方法,进程间内存信息等。 ![GitHub Logo](../../figures/Web/process.jpg) -点击进程名前面箭头可以展开对应的线程进行查看,展开后的线程如下图,如果存在堆内存占用情况,会显示出对应泳道图,如果出现两个名字和id一样的线程,则第一个为线程的使用情况,第二个为线程内的方法栈调用情况。 +点击进程名前面箭头可以展开对应的线程进行查看,展开后的线程如下图,如果存在堆内存占用情况,会显示出对应泳道图,如果出现两个名字和 id 一样的线程,则第一个为线程的使用情况,第二个为线程内的方法栈调用情况。 ![GitHub Logo](../../figures/Web/threadinfo.jpg) #### 进程、线程和方法数据的框选功能 -可以对线程的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,包含线程运行状态,线程调用栈的统计情况。当框选的数据中同时存在线程运行状态和线程调用栈数据,下方的弹出层中就会出现多个tab选项,可以进行切换。 +可以对线程的数据进行框选,框选后在最下方的弹出层中会展示框选数据的统计表格,包含线程运行状态,线程调用栈的统计情况。当框选的数据中同时存在线程运行状态和线程调用栈数据,下方的弹出层中就会出现多个 tab 选项,可以进行切换。 下图是线程运行状态框选统计信息,包括进程名、进程号、线程名、线程号、线程状态、状态持续时间、平均持续时间、该线程状态发生的次数。 ![GitHub Logo](../../figures/Web/threadselect.jpg) @@ -87,35 +87,28 @@ Thread States、Thread Switches的2个Tab页,点击移动到某一行,鼠标 #### 进程、线程和方法数据的单选功能 -单选线程的state数据时,会展示当前选中线程的状态数据,开始时间(相对和绝对时间)和持续时长,线程状态,所在进程名称,选中状态的前一个状态,选中状态的后一个状态。 +单选线程的 state 数据时,会展示当前选中线程的状态数据,开始时间(相对和绝对时间)和持续时长,线程状态,所在进程名称,选中状态的前一个状态,选中状态的后一个状态。 ![GitHub Logo](../../figures/Web/threadclick.jpg) 单选调用栈数据,单击方法会在选中的方法外层加上黑色边框,能够突出当前选中的方法,弹出层中会展示当前方法的名称、开始时间(相对和绝对时间)和运行时长信息,调用栈深度。 ![GitHub Logo](../../figures/Web/callstackclick.jpg) #### 线程的跳转功能 -点击画红框处的带箭头的标志,会从CPU的线程概览视图跳转到线程的详情视图,同时从线程的详情视图也能跳转到CPU的线程概览视图。 +点击画红框处的带箭头的标志,会从 CPU 的线程概览视图跳转到线程的详情视图,同时从线程的详情视图也能跳转到 CPU 的线程概览视图。 ![GitHub Logo](../../figures/Web/jumpthread.jpg) #### 获取频点的busy_time - 框选Cpu Frequency泳道的Tab页有GetBusyTime的按钮,该按钮获取每个频点在Cpu State等于0时的时间信息,体现频点的忙碌时间。 ![GitHub Logo](../../figures/Web/getbusytime.jpg) - #### CPU频点数据切割 - 框选区域内所有running状态的频点数据,以用户输入的某一方法作为切割依据,将频点数据以Single和Loop两种方式切割后展示在Tab标签页的表格中。 ![GitHub Logo](../../figures/Web/Singe_loop.jpg) - #### 关键路径标识 - 在ftrace数据中的cpu泳道的区域,在界面顶部增加json文件导入按钮,导入json文件后,根据线程号跟对应的时间,在cpu区域高亮该时间的线程色块,点击界面上的x,可以取消高亮。json格式如下: ![GitHub Logo](../../figures/Web/json.jpg) 导入json文件以后,会将ACCS0 [2716]线程对应时间点的slice色块高亮显示 ![GitHub Logo](../../figures/Web/keyslice.jpg) - ### trace的其他功能 - #### 小旗标志的功能 将选中数据的时间点通过小旗的方式在时间轴上展示,直观的展示选中数据的时间。 @@ -123,7 +116,7 @@ Thread States、Thread Switches的2个Tab页,点击移动到某一行,鼠标 #### 勾选功能 -框选某一区域,该区域左边会出现CheckBox的复选框,选中的区域的复选框会出现打勾的状态,可以取消勾选,也可以重新勾选。 +框选某一区域,该区域左边会出现 CheckBox 的复选框,选中的区域的复选框会出现打勾的状态,可以取消勾选,也可以重新勾选。 ![GitHub Logo](../../figures/Web/checkbox.jpg) #### 搜索功能 @@ -133,16 +126,16 @@ Thread States、Thread Switches的2个Tab页,点击移动到某一行,鼠标 在搜索框中输入调用栈的方法名,会跳转到对应的调用栈。 ![GitHub Logo](../../figures/Web/searchcallstack.jpg) -### Tab页信息和泳道图可跳转(点击和框选场景,框选类似搜索) +### Tab 页信息和泳道图可跳转(点击和框选场景,框选类似搜索) -泳道图高亮场景:框选Cpu Frequency 或者Cpu State泳道图后,弹出Cpu Frequency或Cpu State Tab页,在点击Tab页表格的行时,框选范围泳道图的当前行的Value值一样的部分上方会出现一条以圆点开头颜色比趋势图颜色同色但稍深的粗线条,如下图: +泳道图高亮场景:框选 Cpu Frequency 或者 Cpu State 泳道图后,弹出 Cpu Frequency 或 Cpu State Tab 页,在点击 Tab 页表格的行时,框选范围泳道图的当前行的 Value 值一样的部分上方会出现一条以圆点开头颜色比趋势图颜色同色但稍深的粗线条,如下图: ![GitHub Logo](../../figures/Web/Tabskill.jpg) -搜索场景:框选函数调用栈的泳道图,弹出Slices Tab页,点击表格行,会跳转到框选范围内的第一条调用栈的位置,点击下图Slices Tab页的Background concurrent copying GC调用栈。 +搜索场景:框选函数调用栈的泳道图,弹出 Slices Tab 页,点击表格行,会跳转到框选范围内的第一条调用栈的位置,点击下图 Slices Tab 页的 Background concurrent copying GC 调用栈。 ![GitHub Logo](../../figures/Web/Tabskillcalltack.jpg) -会在搜索栏显示出该调用栈的搜索结果,并且会跳转到框选范围内第一条Background concurrent copying GC调用栈的位置。 +会在搜索栏显示出该调用栈的搜索结果,并且会跳转到框选范围内第一条 Background concurrent copying GC 调用栈的位置。 ![GitHub Logo](../../figures/Web/Tabcallstackskip.jpg) -#### M键测量功能 +#### M 键测量功能 -放大trace中的色块,选中色块,键盘按下M,会出现像标尺一样的形状。 +放大 trace 中的色块,选中色块,键盘按下 M,会出现像标尺一样的形状。 ![GitHub Logo](../../figures/Web/M.jpg) diff --git a/ide/src/doc/md/quickstart_taskpool.md b/ide/src/doc/md/quickstart_taskpool.md index c33d53dfb..9b48d7b23 100644 --- a/ide/src/doc/md/quickstart_taskpool.md +++ b/ide/src/doc/md/quickstart_taskpool.md @@ -1,37 +1,37 @@ -# TaskPool抓取和展示说明 +# TaskPool 抓取和展示说明 -TaskPool分析模块主要展示应用程序使用taskpool时,任务的关联关系,任务调度开销和任务并发度分析情况,任务各阶段耗时情况,线程池的状态统计,队列任务数,任务是否超时。 +TaskPool 分析模块主要展示应用程序使用 taskpool 时,任务的关联关系,任务调度开销和任务并发度分析情况,任务各阶段耗时情况,线程池的状态统计,队列任务数,任务是否超时。 -## TaskPool的抓取 +## TaskPool 的抓取 -#### TaskPool的抓取配置参数 +#### TaskPool 的抓取配置参数 -打开Task pool开关抓取taskpool数据。 +打开 Task pool 开关抓取 taskpool 数据。 ![GitHub Logo](../../figures/Taskpool/taskpoolconfig.jpg) -### TaskPool展示说明 +### TaskPool 展示说明 -将抓取的taskpool文件导入到smartperf中,查看任务的关联关系等信息。 +将抓取的 taskpool 文件导入到 smartperf 中,查看任务的关联关系等信息。 ![GitHub Logo](../../figures/Taskpool/taskpoolrow.jpg) -### TaskPool的任务关联关系跟踪 +### TaskPool 的任务关联关系跟踪 -任务关联关系就是根据任务的executeId,把一个taskpool任务的各个执行的函数调用栈连接起来,用于表示一个任务从开始分发到执行,再到最后任务结束的整个过程。 +任务关联关系就是根据任务的 executeId,把一个 taskpool 任务的各个执行的函数调用栈连接起来,用于表示一个任务从开始分发到执行,再到最后任务结束的整个过程。 ![GitHub Logo](../../figures/Taskpool/taskpoolrelation.jpg) -如上图所示,点击H:Task Perform: taskId : 2, executeId : 2的调用栈会出现红色连线,红色连线展示了executeId是2的任务的关联关系,连接的调用栈分别是: +如上图所示,点击 H:Task Perform: taskId : 2, executeId : 2 的调用栈会出现红色连线,红色连线展示了 executeId 是 2 的任务的关联关系,连接的调用栈分别是: - H:Task Allocation: taskId : 2, executeId : 2, priority : 1, executeState : 1:任务分发。 - H:Task Perform: taskId : 2, executeId : 2:任务执行。 - H:Task PerformTask End: taskId : 2, executeId : 2, performResult : Successful:任务返回。 -### TaskPool的并发度 +### TaskPool 的并发度 -点选或者框选任务状态为执行会进行任务并发度展示,如图所示并发度是3。 +点选或者框选任务状态为执行会进行任务并发度展示,如图所示并发度是 3。 ![GitHub Logo](../../figures/Taskpool/taskpoolconcurrency.jpg) -### TaskPool泳道图的点选功能 +### TaskPool 泳道图的点选功能 -点选taskpool的Slice,展示该taskpool信息的tab页。 +点选 taskpool 的 Slice,展示该 taskpool 信息的 tab 页。 ![GitHub Logo](../../figures/Taskpool/taskpoolselect.jpg) - Name: 任务调用栈名称。 @@ -39,9 +39,9 @@ TaskPool分析模块主要展示应用程序使用taskpool时,任务的关联 - Duration:任务调用栈持续时间。 - depth:调用栈层级。 -### TaskPool泳道图的框选功能 +### TaskPool 泳道图的框选功能 -框选taskpool的泳道图,展示Frames的tab页。 +框选 taskpool 的泳道图,展示 Frames 的 tab 页。 ![GitHub Logo](../../figures/Taskpool/taskpooldrag.jpg) - Execute Id: 任务id。 @@ -50,12 +50,12 @@ TaskPool分析模块主要展示应用程序使用taskpool时,任务的关联 - Execution Time(ms):执行耗时(任务执行的duration)。 - Return Time(ms):返回耗时(任务返回的结束时间 – 任务执行的结束时间)。 -### TaskPool的队列任务数和线程池里线程状态统计 +### TaskPool 的队列任务数和线程池里线程状态统计 ![GitHub Logo](../../figures/Taskpool/taskpoolnum.jpg) -如上图,H:threadNum,H:runningThreadNum,H:idleThreadNum,H:timeoutThreadNum是线程池里线程状态统计,H:taskNum是队列任务数。 +如上图,H:threadNum,H:runningThreadNum,H:idleThreadNum,H:timeoutThreadNum 是线程池里线程状态统计,H:taskNum 是队列任务数。 -### TaskPool的任务超时退出 +### TaskPool 的任务超时退出 -在带有H:Thread Timeout Exit的调用栈的泳道图会采用黄色圆圈,中间为白色反叹号标记,代表任务超时退出。 +在带有 H:Thread Timeout Exit 的调用栈的泳道图会采用黄色圆圈,中间为白色反叹号标记,代表任务超时退出。 ![GitHub Logo](../../figures/Taskpool/taskpoolexit.jpg) diff --git a/ide/src/doc/quickstart_Application_operation_skills.html b/ide/src/doc/quickstart_Application_operation_skills.html index 487baa40f..2ecbbf6fc 100644 --- a/ide/src/doc/quickstart_Application_operation_skills.html +++ b/ide/src/doc/quickstart_Application_operation_skills.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_Frametimeline.html b/ide/src/doc/quickstart_Frametimeline.html index 2e4c6340f..f52ac9b47 100644 --- a/ide/src/doc/quickstart_Frametimeline.html +++ b/ide/src/doc/quickstart_Frametimeline.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_Import_so.html b/ide/src/doc/quickstart_Import_so.html index 4e62e000f..fa16d8796 100644 --- a/ide/src/doc/quickstart_Import_so.html +++ b/ide/src/doc/quickstart_Import_so.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_Js_memory.html b/ide/src/doc/quickstart_Js_memory.html index 7d5eb9904..b2ef07c0b 100644 --- a/ide/src/doc/quickstart_Js_memory.html +++ b/ide/src/doc/quickstart_Js_memory.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_ability_monitor.html b/ide/src/doc/quickstart_ability_monitor.html index 11e39ffc6..b74904ec3 100644 --- a/ide/src/doc/quickstart_ability_monitor.html +++ b/ide/src/doc/quickstart_ability_monitor.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_animation.html b/ide/src/doc/quickstart_animation.html index f6cfb8db7..29ab5dfdf 100644 --- a/ide/src/doc/quickstart_animation.html +++ b/ide/src/doc/quickstart_animation.html @@ -801,7 +801,7 @@
  • -AnimationAnalysis:动效配置项的总开关。解析时请打开对应的Flags标记(Disabled切换为Enabled)。
    +Animation effect:动效配置项的总开关。解析时请打开对应的Flags标记(Disabled切换为Enabled)。
     
diff --git a/ide/src/doc/quickstart_app_startup.html b/ide/src/doc/quickstart_app_startup.html index d3d3afa29..6f03b5c92 100644 --- a/ide/src/doc/quickstart_app_startup.html +++ b/ide/src/doc/quickstart_app_startup.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_arkts.html b/ide/src/doc/quickstart_arkts.html index e921ac7ca..f88fdfd48 100644 --- a/ide/src/doc/quickstart_arkts.html +++ b/ide/src/doc/quickstart_arkts.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_bio.html b/ide/src/doc/quickstart_bio.html index b2277c98b..a378d2ab1 100644 --- a/ide/src/doc/quickstart_bio.html +++ b/ide/src/doc/quickstart_bio.html @@ -1,4 +1,4 @@ - + @@ -1070,9 +1070,9 @@ Hide System so:隐藏系统库文件 。

点击Disk I/O Latency Calltree左下角的柱状图的图标,会切换到火焰图页面。
GitHub Logo
- 进入到火焰图页面,火焰图的展示跟 Disk I/O Latency Calltree 的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和Duration时长。
+ 进入到火焰图页面,火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和Duration时长。
GitHub Logo
- 鼠标点击火焰图,会进入下一级界面,点击上级则返回上一级界面。
+ 鼠标左键火焰图,会进入下一级界面,右键回到上一级。
GitHub Logo

diff --git a/ide/src/doc/quickstart_device_record.html b/ide/src/doc/quickstart_device_record.html index 7883afefe..df214c61e 100644 --- a/ide/src/doc/quickstart_device_record.html +++ b/ide/src/doc/quickstart_device_record.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_filesystem.html b/ide/src/doc/quickstart_filesystem.html index 9a781585a..f95185d7d 100644 --- a/ide/src/doc/quickstart_filesystem.html +++ b/ide/src/doc/quickstart_filesystem.html @@ -1,4 +1,4 @@ - + @@ -1172,9 +1172,9 @@ Hide System so:隐藏系统库文件。

点击FileSystem Calltre左下角的柱状图的图标,会切换到火焰图页面。
GitHub Logo
- 进入到火焰图页面,火焰图的展示跟 Filesystem Calltree 的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和Duration时长。
+ 进入到火焰图页面,火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称和Duration时长。
GitHub Logo
- 鼠标点击火焰图,会进入下一级界面,点击上级则返回上一级界面。
+ 鼠标左键火焰图,会进入下一级界面,右键回到上一级。
GitHub Logo

diff --git a/ide/src/doc/quickstart_hilog.html b/ide/src/doc/quickstart_hilog.html index 1144ba53a..3eee1b295 100644 --- a/ide/src/doc/quickstart_hilog.html +++ b/ide/src/doc/quickstart_hilog.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_hiperf.html b/ide/src/doc/quickstart_hiperf.html index abe212d4e..b15b688bd 100644 --- a/ide/src/doc/quickstart_hiperf.html +++ b/ide/src/doc/quickstart_hiperf.html @@ -1,4 +1,4 @@ - + @@ -1013,7 +1013,7 @@ Hide System so:隐藏系统库文件。

点击Perf Profile左下角的柱状图的图标,会切换到火焰图页面。
GitHub Logo
- 进入到火焰图页面,火焰图的展示跟 Perf Profile 的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称,lib,addr,Count,%in + 进入到火焰图页面,火焰图的展示跟Callinfo的tab页的调用栈显示一致,鼠标放到色块上,悬浮框可以显示调用栈名称,lib,addr,Count,%in current thread,%in current process,&in all process。
GitHub Logo

diff --git a/ide/src/doc/quickstart_hisystemevent.html b/ide/src/doc/quickstart_hisystemevent.html index 38d2e7e8c..e723184ee 100644 --- a/ide/src/doc/quickstart_hisystemevent.html +++ b/ide/src/doc/quickstart_hisystemevent.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_keywords_shortcuts.html b/ide/src/doc/quickstart_keywords_shortcuts.html index 8befd108f..64ccd0e9f 100644 --- a/ide/src/doc/quickstart_keywords_shortcuts.html +++ b/ide/src/doc/quickstart_keywords_shortcuts.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_memory_template.html b/ide/src/doc/quickstart_memory_template.html index 9fc474dd1..4b4f3cf39 100644 --- a/ide/src/doc/quickstart_memory_template.html +++ b/ide/src/doc/quickstart_memory_template.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_native_memory.html b/ide/src/doc/quickstart_native_memory.html index 0d5c255da..5f6d8223a 100644 --- a/ide/src/doc/quickstart_native_memory.html +++ b/ide/src/doc/quickstart_native_memory.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_page_fault.html b/ide/src/doc/quickstart_page_fault.html index 035e928e3..5ed0a8c70 100644 --- a/ide/src/doc/quickstart_page_fault.html +++ b/ide/src/doc/quickstart_page_fault.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_parsing_ability.html b/ide/src/doc/quickstart_parsing_ability.html index ca7f4a697..cfc00fe07 100644 --- a/ide/src/doc/quickstart_parsing_ability.html +++ b/ide/src/doc/quickstart_parsing_ability.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_schedulinganalysis.html b/ide/src/doc/quickstart_schedulinganalysis.html index 1e227812d..d22311103 100644 --- a/ide/src/doc/quickstart_schedulinganalysis.html +++ b/ide/src/doc/quickstart_schedulinganalysis.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_sdk.html b/ide/src/doc/quickstart_sdk.html index 9e5d59a6a..f47806089 100644 --- a/ide/src/doc/quickstart_sdk.html +++ b/ide/src/doc/quickstart_sdk.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_smartperflinux_compile_guide.html b/ide/src/doc/quickstart_smartperflinux_compile_guide.html index af87fd2cc..33ef905f5 100644 --- a/ide/src/doc/quickstart_smartperflinux_compile_guide.html +++ b/ide/src/doc/quickstart_smartperflinux_compile_guide.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_sql_metrics.html b/ide/src/doc/quickstart_sql_metrics.html index d4a1837b3..53aec19df 100644 --- a/ide/src/doc/quickstart_sql_metrics.html +++ b/ide/src/doc/quickstart_sql_metrics.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_systemtrace.html b/ide/src/doc/quickstart_systemtrace.html index 60a04ab98..2f642ec14 100644 --- a/ide/src/doc/quickstart_systemtrace.html +++ b/ide/src/doc/quickstart_systemtrace.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_taskpool.html b/ide/src/doc/quickstart_taskpool.html index 04ddcf54d..26484e695 100644 --- a/ide/src/doc/quickstart_taskpool.html +++ b/ide/src/doc/quickstart_taskpool.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/doc/quickstart_web_record.html b/ide/src/doc/quickstart_web_record.html index bd86250b9..3ac9c612b 100644 --- a/ide/src/doc/quickstart_web_record.html +++ b/ide/src/doc/quickstart_web_record.html @@ -1,4 +1,4 @@ - + diff --git a/ide/src/figures/deploy/chomd+x.png b/ide/src/figures/deploy/chomd+x.png new file mode 100644 index 0000000000000000000000000000000000000000..e2781fc8e4fe005376d85b18ca220a5c6ef8a5e5 GIT binary patch literal 47605 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
- - -
- -
-
-
-
- + +
+ + +
+ +
+
+
+ +
`; } } diff --git a/ide/src/trace/component/Utils.ts b/ide/src/trace/component/Utils.ts index 83f9faf1a..60880a902 100644 --- a/ide/src/trace/component/Utils.ts +++ b/ide/src/trace/component/Utils.ts @@ -15,8 +15,8 @@ import { type JsCpuProfilerChartFrame } from '../bean/JsStruct'; import { type SnapshotStruct } from '../database/ui-worker/ProcedureWorkerSnapshot'; import { type RangeSelectStruct, TraceRow } from './trace/base/TraceRow'; -import { warn } from '../../log/Log'; import { KeyPathStruct } from '../bean/KeyPathStruct'; +import { warn } from '../../log/Log'; export function setSelectState( data: JsCpuProfilerChartFrame, @@ -46,6 +46,9 @@ export function setSelectState( data.isSelect = true; if (data.children.length > 0) { for (let child of data.children) { + if (child === null) { + continue; + } if (frameSelectDataIdArr.includes(child.id)) { setSelectState(child, frameSelectDataIdArr, data); } @@ -58,7 +61,7 @@ export function intersectData(row: TraceRow): any[] { Math.max(snapshotStruct.startNs! + snapshotStruct.dur!, rangeSelectStruct!.endNS || 0) - Math.min(snapshotStruct.startNs!, rangeSelectStruct!.startNS || 0) < snapshotStruct.dur! + (rangeSelectStruct!.endNS || 0) - (rangeSelectStruct!.startNS || 0); - let intersectData = row.dataList.filter((struct: SnapshotStruct) => { + let intersectData = row.dataListCache.filter((struct: SnapshotStruct) => { return isIntersect(struct, TraceRow.rangeSelectObject!); }); return intersectData; diff --git a/ide/src/trace/component/chart/PerfDataQuery.ts b/ide/src/trace/component/chart/PerfDataQuery.ts index 60764e078..929a5e646 100644 --- a/ide/src/trace/component/chart/PerfDataQuery.ts +++ b/ide/src/trace/component/chart/PerfDataQuery.ts @@ -13,7 +13,7 @@ * limitations under the License. */ -import { queryPerfFiles } from '../../database/SqlLite'; +import { queryPerfFiles, queryPerfCallChainName } from '../../database/SqlLite'; import { PerfCall, PerfFile } from '../../bean/PerfProfile'; import { info } from '../../../log/Log'; import { SpHiPerf } from './SpHiPerf'; @@ -42,9 +42,8 @@ export class PerfDataQuery { this.filesData[file.fileId].push(file); }); const data = { - fValue : SpHiPerf.stringResult?.fValue, - dataDict : SpSystemTrace.DATA_DICT - } + fValue: SpHiPerf.stringResult?.fValue, + }; let results = await new Promise((resolve, reject) => { procedurePool.submitWithName('logic0', 'perf-init', data, undefined, (res: any) => { resolve(res); diff --git a/ide/src/trace/component/chart/SpAbilityMonitorChart.ts b/ide/src/trace/component/chart/SpAbilityMonitorChart.ts index aa64627df..17c35034c 100644 --- a/ide/src/trace/component/chart/SpAbilityMonitorChart.ts +++ b/ide/src/trace/component/chart/SpAbilityMonitorChart.ts @@ -16,27 +16,13 @@ import { SpSystemTrace } from '../SpSystemTrace'; import { queryAbilityExits, - queryBytesInAbilityData, - queryBytesOutAbilityData, - queryBytesReadAbilityData, - queryBytesWrittenAbilityData, - queryCachedFilesAbilityData, - queryCompressedAbilityData, - queryCpuAbilityData, queryCPuAbilityMaxData, - queryCpuAbilitySystemData, - queryCpuAbilityUserData, queryDiskIoMaxData, queryDmaAbilityData, queryGpuMemoryAbilityData, queryMemoryMaxData, - queryMemoryUsedAbilityData, queryNetWorkMaxData, - queryPacketsInAbilityData, - queryPacketsOutAbilityData, queryPurgeableSysData, - queryReadAbilityData, - queryWrittenAbilityData, } from '../../database/SqlLite'; import { info } from '../../../log/Log'; import { TraceRow } from '../trace/base/TraceRow'; @@ -52,7 +38,19 @@ import { } from '../../database/ui-worker/ProcedureWorkerNetworkAbility'; import { renders } from '../../database/ui-worker/ProcedureWorker'; import { type SnapshotRender, SnapshotStruct } from '../../database/ui-worker/ProcedureWorkerSnapshot'; - +import { + abilityBytesInTraceDataSender, + abilityBytesReadDataSender, + abilityMemoryUsedDataSender, + cpuAbilityUserDataSender, +} from '../../database/data-trafic/AbilityMonitorSender'; +import { + abilityDmaDataSender, + abilityGpuMemoryDataSender, + abilityPurgeableDataSender, +} from '../../database/data-trafic/VmTrackerDataSender'; +import { MemoryConfig } from '../../bean/MemoryConfig'; +import { resetAbility } from '../../database/data-trafic/VmTrackerDataReceiver'; export class SpAbilityMonitorChart { private trace: SpSystemTrace; constructor(trace: SpSystemTrace) { @@ -100,8 +98,16 @@ export class SpAbilityMonitorChart { if (this.hasTable(result, 'trace_network')) { await this.initNetworkAbility(processRow); } + resetAbility(); // 初始化PurgeableToTal和PurgeablePin泳道图 - await this.initPurgeableAbility(processRow); + let totalDataList = await queryPurgeableSysData(false); + let pinDataList = await queryPurgeableSysData(true); + if (totalDataList.length > 0) { + await this.initPurgeableTotal(processRow); + } + if (pinDataList.length > 0) { + await this.initPurgeablePin(processRow); + } await this.initDmaAbility(processRow); await this.initGpuMemoryAbility(processRow); let durTime = new Date().getTime() - time; @@ -114,7 +120,7 @@ export class SpAbilityMonitorChart { }); } - private initAbilityRow = () => { + private initAbilityRow = (): TraceRow => { let abilityRow = TraceRow.skeleton(); abilityRow.rowId = 'abilityMonitor'; abilityRow.rowType = TraceRow.ROW_TYPE_MONITOR; @@ -124,8 +130,8 @@ export class SpAbilityMonitorChart { abilityRow.name = 'Ability Monitor'; abilityRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; abilityRow.selectChangeHandler = this.trace.selectChangeHandler; - abilityRow.supplier = () => new Promise>((resolve) => resolve([])); - abilityRow.onThreadHandler = (useCache) => { + abilityRow.supplier = (): Promise => new Promise>((resolve) => resolve([])); + abilityRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (abilityRow.currentContext) { context = abilityRow.currentContext; @@ -145,13 +151,13 @@ export class SpAbilityMonitorChart { abilityRow ); } - abilityRow.canvasRestore(context); + abilityRow.canvasRestore(context, this.trace); }; this.trace.rowsEL?.appendChild(abilityRow); return abilityRow; }; - private initCpuAbility = async (processRow: TraceRow) => { + private initCpuAbility = async (processRow: TraceRow): Promise => { let time = new Date().getTime(); let cpuMaxData = await queryCPuAbilityMaxData(); let hasTotal = false; @@ -181,15 +187,26 @@ export class SpAbilityMonitorChart { traceRow.style.width = `100%`; traceRow.setAttribute('children', ''); traceRow.name = `CPU ${cpuNameList[0]} Load`; - traceRow.supplier = () => queryCpuAbilityData(); - traceRow.focusHandler = (ev) => { + traceRow.supplierFrame = (): Promise => + cpuAbilityUserDataSender(traceRow, 'CpuAbilityMonitorData').then((res): CpuAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + }); + traceRow.focusHandler = (ev): void => { let monitorCpuTip = (CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2) + '%'; this.trace?.displayTip(traceRow, CpuAbilityMonitorStruct.hoverCpuAbilityStruct, `${monitorCpuTip}`); }; - traceRow.findHoverStruct = () => { + traceRow.findHoverStruct = (): void => { CpuAbilityMonitorStruct.hoverCpuAbilityStruct = traceRow.getHoverStruct(); }; - traceRow.onThreadHandler = (useCache) => { + traceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (traceRow.currentContext) { context = traceRow.currentContext; @@ -207,7 +224,7 @@ export class SpAbilityMonitorChart { }, traceRow ); - traceRow.canvasRestore(context); + traceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(traceRow); let userTraceRow = TraceRow.skeleton(); @@ -221,8 +238,19 @@ export class SpAbilityMonitorChart { userTraceRow.selectChangeHandler = this.trace.selectChangeHandler; userTraceRow.setAttribute('children', ''); userTraceRow.name = `CPU ${cpuNameList[1]} Load`; - userTraceRow.supplier = () => queryCpuAbilityUserData(); - userTraceRow.focusHandler = (ev) => { + userTraceRow.supplierFrame = (): Promise => + cpuAbilityUserDataSender(userTraceRow, 'CpuAbilityUserData').then((res): CpuAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + }); + userTraceRow.focusHandler = (ev): void => { let monitorCpuTip = (CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2) + '%'; this.trace?.displayTip( userTraceRow, @@ -230,10 +258,10 @@ export class SpAbilityMonitorChart { `${monitorCpuTip}` ); }; - userTraceRow.findHoverStruct = () => { + userTraceRow.findHoverStruct = (): void => { CpuAbilityMonitorStruct.hoverCpuAbilityStruct = userTraceRow.getHoverStruct(); }; - userTraceRow.onThreadHandler = (useCache) => { + userTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (userTraceRow.currentContext) { context = userTraceRow.currentContext; @@ -251,7 +279,7 @@ export class SpAbilityMonitorChart { }, userTraceRow ); - userTraceRow.canvasRestore(context); + userTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(userTraceRow); let sysTraceRow = TraceRow.skeleton(); @@ -265,8 +293,19 @@ export class SpAbilityMonitorChart { sysTraceRow.selectChangeHandler = this.trace.selectChangeHandler; sysTraceRow.setAttribute('children', ''); sysTraceRow.name = `CPU ${cpuNameList[2]} Load`; - sysTraceRow.supplier = () => queryCpuAbilitySystemData(); - sysTraceRow.focusHandler = (ev) => { + sysTraceRow.supplierFrame = (): Promise => + cpuAbilityUserDataSender(sysTraceRow, 'CpuAbilitySystemData').then((res): CpuAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + }); + sysTraceRow.focusHandler = (ev): void => { let monitorCpuTip = (CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2) + '%'; this.trace?.displayTip( sysTraceRow, @@ -274,10 +313,10 @@ export class SpAbilityMonitorChart { `${monitorCpuTip}` ); }; - sysTraceRow.findHoverStruct = () => { + sysTraceRow.findHoverStruct = (): void => { CpuAbilityMonitorStruct.hoverCpuAbilityStruct = sysTraceRow.getHoverStruct(); }; - sysTraceRow.onThreadHandler = (useCache) => { + sysTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (sysTraceRow.currentContext) { context = sysTraceRow.currentContext; @@ -295,14 +334,14 @@ export class SpAbilityMonitorChart { }, sysTraceRow ); - sysTraceRow.canvasRestore(context); + sysTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(sysTraceRow); let durTime = new Date().getTime() - time; info('The time to load the Ability Cpu is: ', durTime); }; - private initMemoryAbility = async (processRow: TraceRow) => { + private initMemoryAbility = async (processRow: TraceRow): Promise => { let time = new Date().getTime(); // sys.mem.total sys.mem.cached sys.mem.swap.total let memoryNameList: Array = ['MemoryTotal', 'Cached', 'SwapTotal']; @@ -321,18 +360,32 @@ export class SpAbilityMonitorChart { memoryUsedTraceRow.style.width = `100%`; memoryUsedTraceRow.setAttribute('children', ''); memoryUsedTraceRow.name = memoryNameList[0]; - memoryUsedTraceRow.supplier = () => queryMemoryUsedAbilityData(memoryTotalId); - memoryUsedTraceRow.focusHandler = (ev) => { + memoryUsedTraceRow.supplierFrame = (): Promise => { + return abilityMemoryUsedDataSender(memoryTotalId, memoryUsedTraceRow).then( + (res): MemoryAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + } + ); + }; + memoryUsedTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( memoryUsedTraceRow, MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct, `${Utils.getBinaryKBWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.value || 0)}` ); }; - memoryUsedTraceRow.findHoverStruct = () => { + memoryUsedTraceRow.findHoverStruct = (): void => { MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = memoryUsedTraceRow.getHoverStruct(); }; - memoryUsedTraceRow.onThreadHandler = (useCache) => { + memoryUsedTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (memoryUsedTraceRow.currentContext) { context = memoryUsedTraceRow.currentContext; @@ -350,7 +403,7 @@ export class SpAbilityMonitorChart { }, memoryUsedTraceRow ); - memoryUsedTraceRow.canvasRestore(context); + memoryUsedTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(memoryUsedTraceRow); let cached = await queryMemoryMaxData('sys.mem.cached'); @@ -368,18 +421,29 @@ export class SpAbilityMonitorChart { cachedFilesTraceRow.style.width = `100%`; cachedFilesTraceRow.setAttribute('children', ''); cachedFilesTraceRow.name = memoryNameList[1]; - cachedFilesTraceRow.supplier = () => queryCachedFilesAbilityData(cachedId); - cachedFilesTraceRow.focusHandler = (ev) => { + cachedFilesTraceRow.supplierFrame = (): Promise => + abilityMemoryUsedDataSender(cachedId, cachedFilesTraceRow).then((res): MemoryAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + }); + cachedFilesTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( cachedFilesTraceRow, MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct, `${Utils.getBinaryKBWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.value || 0)}` ); }; - cachedFilesTraceRow.findHoverStruct = () => { + cachedFilesTraceRow.findHoverStruct = (): void => { MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = cachedFilesTraceRow.getHoverStruct(); }; - cachedFilesTraceRow.onThreadHandler = (useCache) => { + cachedFilesTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (cachedFilesTraceRow.currentContext) { context = cachedFilesTraceRow.currentContext; @@ -397,7 +461,7 @@ export class SpAbilityMonitorChart { }, cachedFilesTraceRow ); - cachedFilesTraceRow.canvasRestore(context); + cachedFilesTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(cachedFilesTraceRow); let swap = await queryMemoryMaxData('sys.mem.swap.total'); @@ -415,18 +479,29 @@ export class SpAbilityMonitorChart { compressedTraceRow.style.width = `100%`; compressedTraceRow.setAttribute('children', ''); compressedTraceRow.name = memoryNameList[2]; - compressedTraceRow.supplier = () => queryCompressedAbilityData(swapId); - compressedTraceRow.focusHandler = (ev) => { + compressedTraceRow.supplierFrame = (): Promise => + abilityMemoryUsedDataSender(swapId, compressedTraceRow).then((res): MemoryAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + }); + compressedTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( compressedTraceRow, MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct, `${Utils.getBinaryKBWithUnit(MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct?.value || 0)}` ); }; - compressedTraceRow.findHoverStruct = () => { + compressedTraceRow.findHoverStruct = (): void => { MemoryAbilityMonitorStruct.hoverMemoryAbilityStruct = compressedTraceRow.getHoverStruct(); }; - compressedTraceRow.onThreadHandler = (useCache) => { + compressedTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (compressedTraceRow.currentContext) { context = compressedTraceRow.currentContext; @@ -444,14 +519,14 @@ export class SpAbilityMonitorChart { }, compressedTraceRow ); - compressedTraceRow.canvasRestore(context); + compressedTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(compressedTraceRow); let durTime = new Date().getTime() - time; info('The time to load the Ability Memory is: ', durTime); }; - private initDiskAbility = async (processRow: TraceRow) => { + private initDiskAbility = async (processRow: TraceRow): Promise => { let time = new Date().getTime(); let maxList = await queryDiskIoMaxData(); let maxBytesRead = maxList[0].bytesRead; @@ -468,18 +543,29 @@ export class SpAbilityMonitorChart { bytesReadTraceRow.style.width = `100%`; bytesReadTraceRow.setAttribute('children', ''); bytesReadTraceRow.name = 'Disk ' + diskIONameList[0]; - bytesReadTraceRow.supplier = () => queryBytesReadAbilityData(); - bytesReadTraceRow.focusHandler = (ev) => { + bytesReadTraceRow.supplierFrame = (): Promise => + abilityBytesReadDataSender(bytesReadTraceRow, 'AbilityBytesReadData').then((res): DiskAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + }); + bytesReadTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( bytesReadTraceRow, DiskAbilityMonitorStruct.hoverDiskAbilityStruct, `${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S` ); }; - bytesReadTraceRow.findHoverStruct = () => { + bytesReadTraceRow.findHoverStruct = (): void => { DiskAbilityMonitorStruct.hoverDiskAbilityStruct = bytesReadTraceRow.getHoverStruct(); }; - bytesReadTraceRow.onThreadHandler = (useCache) => { + bytesReadTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (bytesReadTraceRow.currentContext) { context = bytesReadTraceRow.currentContext; @@ -497,7 +583,7 @@ export class SpAbilityMonitorChart { }, bytesReadTraceRow ); - bytesReadTraceRow.canvasRestore(context); + bytesReadTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(bytesReadTraceRow); let maxBytesWrite = maxList[0].bytesWrite; @@ -513,18 +599,31 @@ export class SpAbilityMonitorChart { bytesWrittenTraceRow.style.width = `100%`; bytesWrittenTraceRow.setAttribute('children', ''); bytesWrittenTraceRow.name = 'Disk ' + diskIONameList[1]; - bytesWrittenTraceRow.supplier = () => queryBytesWrittenAbilityData(); - bytesWrittenTraceRow.focusHandler = (ev) => { + bytesWrittenTraceRow.supplierFrame = (): Promise => + abilityBytesReadDataSender(bytesWrittenTraceRow, 'AbilityBytesWrittenData').then( + (res): DiskAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + } + ); + bytesWrittenTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( bytesWrittenTraceRow, DiskAbilityMonitorStruct.hoverDiskAbilityStruct, `${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S` ); }; - bytesWrittenTraceRow.findHoverStruct = () => { + bytesWrittenTraceRow.findHoverStruct = (): void => { DiskAbilityMonitorStruct.hoverDiskAbilityStruct = bytesWrittenTraceRow.getHoverStruct(); }; - bytesWrittenTraceRow.onThreadHandler = (useCache) => { + bytesWrittenTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (bytesWrittenTraceRow.currentContext) { context = bytesWrittenTraceRow.currentContext; @@ -542,7 +641,7 @@ export class SpAbilityMonitorChart { }, bytesWrittenTraceRow ); - bytesWrittenTraceRow.canvasRestore(context); + bytesWrittenTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(bytesWrittenTraceRow); let maxReadOps = maxList[0].readOps; @@ -558,18 +657,29 @@ export class SpAbilityMonitorChart { readOpsTraceRow.style.width = `100%`; readOpsTraceRow.setAttribute('children', ''); readOpsTraceRow.name = 'Disk ' + diskIONameList[2]; - readOpsTraceRow.supplier = () => queryReadAbilityData(); - readOpsTraceRow.focusHandler = (ev) => { + readOpsTraceRow.supplierFrame = (): Promise => + abilityBytesReadDataSender(readOpsTraceRow, 'AbilityReadOpsData').then((res): DiskAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + }); + readOpsTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( readOpsTraceRow, DiskAbilityMonitorStruct.hoverDiskAbilityStruct, `${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S` ); }; - readOpsTraceRow.findHoverStruct = () => { + readOpsTraceRow.findHoverStruct = (): void => { DiskAbilityMonitorStruct.hoverDiskAbilityStruct = readOpsTraceRow.getHoverStruct(); }; - readOpsTraceRow.onThreadHandler = (useCache) => { + readOpsTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (readOpsTraceRow.currentContext) { context = readOpsTraceRow.currentContext; @@ -587,7 +697,7 @@ export class SpAbilityMonitorChart { }, readOpsTraceRow ); - readOpsTraceRow.canvasRestore(context); + readOpsTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(readOpsTraceRow); let maxWriteOps = maxList[0].writeOps; @@ -603,18 +713,31 @@ export class SpAbilityMonitorChart { writtenOpsTraceRow.style.width = `100%`; writtenOpsTraceRow.setAttribute('children', ''); writtenOpsTraceRow.name = 'Disk ' + diskIONameList[3]; - writtenOpsTraceRow.supplier = () => queryWrittenAbilityData(); - writtenOpsTraceRow.focusHandler = (ev) => { + writtenOpsTraceRow.supplierFrame = (): Promise => + abilityBytesReadDataSender(writtenOpsTraceRow, 'AbilityWrittenOpsData').then( + (res): DiskAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + } + ); + writtenOpsTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( writtenOpsTraceRow, DiskAbilityMonitorStruct.hoverDiskAbilityStruct, `${DiskAbilityMonitorStruct.hoverDiskAbilityStruct?.value || '0'} KB/S` ); }; - writtenOpsTraceRow.findHoverStruct = () => { + writtenOpsTraceRow.findHoverStruct = (): void => { DiskAbilityMonitorStruct.hoverDiskAbilityStruct = writtenOpsTraceRow.getHoverStruct(); }; - writtenOpsTraceRow.onThreadHandler = (useCache) => { + writtenOpsTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (writtenOpsTraceRow.currentContext) { context = writtenOpsTraceRow.currentContext; @@ -632,14 +755,14 @@ export class SpAbilityMonitorChart { }, writtenOpsTraceRow ); - writtenOpsTraceRow.canvasRestore(context); + writtenOpsTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(writtenOpsTraceRow); let durTime = new Date().getTime() - time; info('The time to load the Ability DiskIO is: ', durTime); }; - private initNetworkAbility = async (processRow: TraceRow) => { + private initNetworkAbility = async (processRow: TraceRow): Promise => { let time = new Date().getTime(); let maxList = await queryNetWorkMaxData(); let maxBytesIn = maxList[0].maxIn; @@ -656,18 +779,31 @@ export class SpAbilityMonitorChart { bytesInTraceRow.style.width = `100%`; bytesInTraceRow.setAttribute('children', ''); bytesInTraceRow.name = 'Network ' + networkNameList[0]; - bytesInTraceRow.supplier = () => queryBytesInAbilityData(); - bytesInTraceRow.focusHandler = (ev) => { + bytesInTraceRow.supplierFrame = (): Promise => + abilityBytesInTraceDataSender(bytesInTraceRow, 'AbilityBytesInTraceData').then( + (res): NetworkAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + } + ); + bytesInTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( bytesInTraceRow, NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, `${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.value || 0)}` ); }; - bytesInTraceRow.findHoverStruct = () => { + bytesInTraceRow.findHoverStruct = (): void => { NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = bytesInTraceRow.getHoverStruct(); }; - bytesInTraceRow.onThreadHandler = (useCache) => { + bytesInTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (bytesInTraceRow.currentContext) { context = bytesInTraceRow.currentContext; @@ -685,7 +821,7 @@ export class SpAbilityMonitorChart { }, bytesInTraceRow ); - bytesInTraceRow.canvasRestore(context); + bytesInTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(bytesInTraceRow); let bytesOutTraceRow = TraceRow.skeleton(); @@ -701,18 +837,31 @@ export class SpAbilityMonitorChart { bytesOutTraceRow.style.width = `100%`; bytesOutTraceRow.setAttribute('children', ''); bytesOutTraceRow.name = 'Network ' + networkNameList[1]; - bytesOutTraceRow.supplier = () => queryBytesOutAbilityData(); - bytesOutTraceRow.focusHandler = (ev) => { + bytesOutTraceRow.supplierFrame = (): Promise => + abilityBytesInTraceDataSender(bytesOutTraceRow, 'AbilityBytesOutTraceData').then( + (res): NetworkAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + } + ); + bytesOutTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( bytesOutTraceRow, NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, `${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.value || 0)}` ); }; - bytesOutTraceRow.findHoverStruct = () => { + bytesOutTraceRow.findHoverStruct = (): void => { NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = bytesOutTraceRow.getHoverStruct(); }; - bytesOutTraceRow.onThreadHandler = (useCache) => { + bytesOutTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (bytesOutTraceRow.currentContext) { context = bytesOutTraceRow.currentContext; @@ -730,7 +879,7 @@ export class SpAbilityMonitorChart { }, bytesOutTraceRow ); - bytesOutTraceRow.canvasRestore(context); + bytesOutTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(bytesOutTraceRow); let packetInTraceRow = TraceRow.skeleton(); @@ -746,18 +895,31 @@ export class SpAbilityMonitorChart { packetInTraceRow.style.width = `100%`; packetInTraceRow.setAttribute('children', ''); packetInTraceRow.name = 'Network ' + networkNameList[2]; - packetInTraceRow.supplier = () => queryPacketsInAbilityData(); - packetInTraceRow.focusHandler = (ev) => { + packetInTraceRow.supplierFrame = (): Promise => + abilityBytesInTraceDataSender(packetInTraceRow, 'AbilityPacketInTraceData').then( + (res): NetworkAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + } + ); + packetInTraceRow.focusHandler = (ev): void => { this.trace?.displayTip( packetInTraceRow, NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct, `${Utils.getBinaryByteWithUnit(NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct?.value || 0)}` ); }; - packetInTraceRow.findHoverStruct = () => { + packetInTraceRow.findHoverStruct = (): void => { NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = packetInTraceRow.getHoverStruct(); }; - packetInTraceRow.onThreadHandler = (useCache) => { + packetInTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (packetInTraceRow.currentContext) { context = packetInTraceRow.currentContext; @@ -775,7 +937,7 @@ export class SpAbilityMonitorChart { }, packetInTraceRow ); - packetInTraceRow.canvasRestore(context); + packetInTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(packetInTraceRow); let packetOutTraceRow = TraceRow.skeleton(); @@ -791,8 +953,21 @@ export class SpAbilityMonitorChart { packetOutTraceRow.style.width = `100%`; packetOutTraceRow.setAttribute('children', ''); packetOutTraceRow.name = 'Network ' + networkNameList[3]; - packetOutTraceRow.supplier = () => queryPacketsOutAbilityData(); - packetOutTraceRow.focusHandler = (ev) => { + packetOutTraceRow.supplierFrame = (): Promise => + abilityBytesInTraceDataSender(packetOutTraceRow, 'AbilityPacketsOutTraceData').then( + (res): NetworkAbilityMonitorStruct[] => { + let endNS = TraceRow.range?.endNS || 0; + res.forEach((it, i) => { + if (i === res.length - 1) { + it.dur = (endNS || 0) - (it.startNS || 0); + } else { + it.dur = (res[i + 1].startNS || 0) - (it.startNS || 0); + } + }); + return res; + } + ); + packetOutTraceRow.focusHandler = (ev): void => { if (NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct) { this.trace?.displayTip( packetOutTraceRow, @@ -801,10 +976,10 @@ export class SpAbilityMonitorChart { ); } }; - packetOutTraceRow.findHoverStruct = () => { + packetOutTraceRow.findHoverStruct = (): void => { NetworkAbilityMonitorStruct.hoverNetworkAbilityStruct = packetOutTraceRow.getHoverStruct(); }; - packetOutTraceRow.onThreadHandler = (useCache) => { + packetOutTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (packetOutTraceRow.currentContext) { context = packetOutTraceRow.currentContext; @@ -822,173 +997,70 @@ export class SpAbilityMonitorChart { }, packetOutTraceRow ); - packetOutTraceRow.canvasRestore(context); + packetOutTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(packetOutTraceRow); let durTime = new Date().getTime() - time; info('The time to load the Ability Network is: ', durTime); }; - private initPurgeableAbility = async (processRow: TraceRow): Promise => { - let time = new Date().getTime(); - let purgeableTotalData = await queryPurgeableSysData(); - if (purgeableTotalData.length > 0) { - for (let i = 0; i < purgeableTotalData.length; i++) { - purgeableTotalData[i].name = 'Snapshot' + i; - } - let totalTraceRow = TraceRow.skeleton(); - totalTraceRow.rowParentId = `abilityMonitor`; - totalTraceRow.rowHidden = !processRow.expansion; - totalTraceRow.rowId = 'System Purgeable Total'; - totalTraceRow.rowType = TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY; - totalTraceRow.style.height = '40px'; - totalTraceRow.style.width = `100%`; - totalTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; - totalTraceRow.selectChangeHandler = this.trace.selectChangeHandler; - totalTraceRow.setAttribute('children', ''); - totalTraceRow.name = `Purgeable Total`; - totalTraceRow.addTemplateTypes('Memory'); - totalTraceRow.supplier = () => new Promise>((resolve): void => resolve(purgeableTotalData)); - totalTraceRow.focusHandler = (ev): void => { - this.trace?.displayTip( - totalTraceRow, - SnapshotStruct.hoverSnapshotStruct, - `Name: ${SnapshotStruct.hoverSnapshotStruct?.name || ''} - Value: ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}` - ); - }; - totalTraceRow.findHoverStruct = (): void => { - SnapshotStruct.hoverSnapshotStruct = totalTraceRow.getHoverStruct(); - }; - totalTraceRow.onThreadHandler = (useCache): void => { - let context: CanvasRenderingContext2D; - if (totalTraceRow.currentContext) { - context = totalTraceRow.currentContext; - } else { - context = totalTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; - } - totalTraceRow.canvasSave(context); - (renders.snapshot as SnapshotRender).renderMainThread( - { - context: context, - useCache: useCache, - type: `snapshot`, - }, - totalTraceRow - ); - totalTraceRow.canvasRestore(context); - }; - processRow.addChildTraceRow(totalTraceRow); - } - let purgeablePinData = await queryPurgeableSysData(true); - if (purgeablePinData.length > 0) { - for (let i = 0; i < purgeablePinData.length; i++) { - purgeablePinData[i].name = 'Snapshot' + i; - } - let pinTraceRow = TraceRow.skeleton(); - pinTraceRow.rowParentId = `abilityMonitor`; - pinTraceRow.rowHidden = !processRow.expansion; - pinTraceRow.rowId = 'System Purgeable Pin'; - pinTraceRow.rowType = TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY; - pinTraceRow.style.height = '40px'; - pinTraceRow.style.width = `100%`; - pinTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; - pinTraceRow.selectChangeHandler = this.trace.selectChangeHandler; - pinTraceRow.setAttribute('children', ''); - pinTraceRow.name = `Purgeable Pin`; - pinTraceRow.supplier = () => new Promise>((resolve): void => resolve(purgeablePinData)); - pinTraceRow.focusHandler = (ev): void => { - this.trace?.displayTip( - pinTraceRow, - SnapshotStruct.hoverSnapshotStruct, - `Name: ${SnapshotStruct.hoverSnapshotStruct?.name || ''} - Value: ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}` - ); - }; - pinTraceRow.findHoverStruct = () => { - SnapshotStruct.hoverSnapshotStruct = pinTraceRow.getHoverStruct(); - }; - pinTraceRow.onThreadHandler = (useCache): void => { - let context: CanvasRenderingContext2D; - if (pinTraceRow.currentContext) { - context = pinTraceRow.currentContext; - } else { - context = pinTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; - } - pinTraceRow.canvasSave(context); - (renders.snapshot as SnapshotRender).renderMainThread( - { - context: context, - useCache: useCache, - type: `snapshot`, - }, - pinTraceRow - ); - pinTraceRow.canvasRestore(context); - }; - processRow.addChildTraceRow(pinTraceRow); - } + private async initPurgeableTotal(processRow: TraceRow): Promise { + let snapshotDur = MemoryConfig.getInstance().snapshotDur; + let totalTraceRow = this.initTraceRow( + 'System Purgeable Total', + 'Purgeable Total', + TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY, + processRow + ); + totalTraceRow.supplierFrame = (): Promise => + new Promise>((resolve): void => + resolve( + abilityPurgeableDataSender(totalTraceRow, snapshotDur, false).then((res: any[]) => { + this.setName(res); + return res; + }) + ) + ); + processRow.addChildTraceRow(totalTraceRow); + } - let durTime = new Date().getTime() - time; - info('The time to load the Ability Purgeable is: ', durTime); - }; + private async initPurgeablePin(processRow: TraceRow): Promise { + let snapshotDur = MemoryConfig.getInstance().snapshotDur; + let pinTraceRow = this.initTraceRow( + 'System Purgeable Pin', + 'Purgeable Pin', + TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY, + processRow + ); + pinTraceRow.supplierFrame = (): Promise => + new Promise>((resolve): void => + resolve( + abilityPurgeableDataSender(pinTraceRow, snapshotDur, true).then((res: any[]) => { + this.setName(res); + return res; + }) + ) + ); + processRow.addChildTraceRow(pinTraceRow); + } /** * DMA * @param processRow */ private initDmaAbility = async (processRow: TraceRow): Promise => { - let dmaAbilityData = await queryDmaAbilityData(); - for (let i = 0; i < dmaAbilityData.length; i++) { - dmaAbilityData[i].name = 'snapshot' + i; - } - let time = new Date().getTime(); - let dmaTraceRow = TraceRow.skeleton(); - dmaTraceRow.rowParentId = `abilityMonitor`; - dmaTraceRow.rowHidden = !processRow.expansion; - dmaTraceRow.rowId = 'abilityMonitorDma'; - dmaTraceRow.rowType = TraceRow.ROW_TYPE_DMA_ABILITY; - dmaTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; - dmaTraceRow.selectChangeHandler = this.trace.selectChangeHandler; - dmaTraceRow.style.height = '40px'; - dmaTraceRow.style.width = `100%`; - dmaTraceRow.setAttribute('children', ''); - dmaTraceRow.name = 'DMA'; - dmaTraceRow.addTemplateTypes('Memory'); - dmaTraceRow.supplier = (): Promise => new Promise>((resolve): void => resolve(dmaAbilityData)); - //文字悬浮提示 - dmaTraceRow.focusHandler = (ev): void => { - this.trace?.displayTip( - dmaTraceRow, - SnapshotStruct.hoverSnapshotStruct, - `${SnapshotStruct.hoverSnapshotStruct?.name || ''} - ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}` + let snapshotDur = MemoryConfig.getInstance().snapshotDur; + let dmaTraceRow = this.initTraceRow('abilityMonitorDma', 'DMA', TraceRow.ROW_TYPE_DMA_ABILITY, processRow); + dmaTraceRow.supplierFrame = (): Promise => + new Promise>((resolve): void => + resolve( + abilityDmaDataSender(dmaTraceRow, snapshotDur).then((res: any[]) => { + this.setName(res); + return res; + }) + ) ); - }; - dmaTraceRow.findHoverStruct = (): void => { - SnapshotStruct.hoverSnapshotStruct = dmaTraceRow.getHoverStruct(); - }; - dmaTraceRow.onThreadHandler = (useCache): void => { - let context: CanvasRenderingContext2D; - if (dmaTraceRow.currentContext) { - context = dmaTraceRow.currentContext; - } else { - context = dmaTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; - } - dmaTraceRow.canvasSave(context); - (renders.snapshot as SnapshotRender).renderMainThread( - { - context: context, - useCache: useCache, - type: 'snapshot', - }, - dmaTraceRow! - ); - dmaTraceRow.canvasRestore(context); - }; processRow.addChildTraceRow(dmaTraceRow); - let durTime = new Date().getTime() - time; - info('The time to load the Ability Dma is: ', durTime); }; /** @@ -996,57 +1068,84 @@ export class SpAbilityMonitorChart { * @param processRow */ private initGpuMemoryAbility = async (processRow: TraceRow): Promise => { - let gpuMemoryAbilityData = await queryGpuMemoryAbilityData(); - for (let i = 0; i < gpuMemoryAbilityData.length; i++) { - gpuMemoryAbilityData[i].name = 'snapshot' + i; - } - let time = new Date().getTime(); - let gpuMemoryTraceRow = TraceRow.skeleton(); - gpuMemoryTraceRow.rowParentId = `abilityMonitor`; - gpuMemoryTraceRow.rowHidden = !processRow.expansion; - gpuMemoryTraceRow.rowId = 'abilityMonitorGpuMemory'; - gpuMemoryTraceRow.rowType = TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY; - gpuMemoryTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; - gpuMemoryTraceRow.selectChangeHandler = this.trace.selectChangeHandler; - gpuMemoryTraceRow.style.height = '40px'; - gpuMemoryTraceRow.style.width = `100%`; - gpuMemoryTraceRow.setAttribute('children', ''); - gpuMemoryTraceRow.name = 'Skia Gpu Memory'; - gpuMemoryTraceRow.addTemplateTypes('Memory'); - gpuMemoryTraceRow.supplier = (): Promise => - new Promise>((resolve): void => resolve(gpuMemoryAbilityData)); - //文字悬浮提示 - gpuMemoryTraceRow.focusHandler = (ev): void => { - this.trace?.displayTip( - gpuMemoryTraceRow, - SnapshotStruct.hoverSnapshotStruct, - `${SnapshotStruct.hoverSnapshotStruct?.name || ''} - ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}` + let snapshotDur = MemoryConfig.getInstance().snapshotDur; + let gpuMemoryTraceRow = this.initTraceRow( + 'abilityMonitorGpuMemory', + 'Skia Gpu Memory', + TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY, + processRow + ); + gpuMemoryTraceRow.supplierFrame = (): Promise => + new Promise>((resolve): void => + resolve( + abilityGpuMemoryDataSender(gpuMemoryTraceRow, snapshotDur).then((res: any[]) => { + this.setName(res); + return res; + }) + ) ); + processRow.addChildTraceRow(gpuMemoryTraceRow); + }; + + private initTraceRow( + rowId: string, + rowName: string, + type: string, + processRow: TraceRow + ): TraceRow { + let abilityMonitor = TraceRow.skeleton(); + abilityMonitor.rowParentId = 'abilityMonitor'; + abilityMonitor.rowHidden = !processRow.expansion; + abilityMonitor.rowId = rowId; + abilityMonitor.rowType = type; + abilityMonitor.favoriteChangeHandler = this.trace.favoriteChangeHandler; + abilityMonitor.selectChangeHandler = this.trace.selectChangeHandler; + abilityMonitor.style.height = '40px'; + abilityMonitor.style.width = '100%'; + abilityMonitor.setAttribute('children', ''); + abilityMonitor.name = rowName; + abilityMonitor.addTemplateTypes('Memory'); + abilityMonitor.focusHandler = (): void => { + this.showTip(abilityMonitor); }; - gpuMemoryTraceRow.findHoverStruct = (): void => { - SnapshotStruct.hoverSnapshotStruct = gpuMemoryTraceRow.getHoverStruct(); + abilityMonitor.findHoverStruct = () => { + SnapshotStruct.hoverSnapshotStruct = abilityMonitor.getHoverStruct(); }; - gpuMemoryTraceRow.onThreadHandler = (useCache) => { + abilityMonitor.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; - if (gpuMemoryTraceRow.currentContext) { - context = gpuMemoryTraceRow.currentContext; + if (abilityMonitor.currentContext) { + context = abilityMonitor.currentContext; } else { - context = gpuMemoryTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + context = abilityMonitor.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } - gpuMemoryTraceRow.canvasSave(context); + abilityMonitor.canvasSave(context); (renders.snapshot as SnapshotRender).renderMainThread( { context: context, useCache: useCache, type: 'snapshot', }, - gpuMemoryTraceRow! + abilityMonitor ); - gpuMemoryTraceRow.canvasRestore(context); + abilityMonitor.canvasRestore(context, this.trace); }; - processRow.addChildTraceRow(gpuMemoryTraceRow); - let durTime = new Date().getTime() - time; - info('The time to load the Ability Dma is: ', durTime); - }; + return abilityMonitor; + } + + private showTip(traceRow: TraceRow): void { + this.trace?.displayTip( + traceRow, + SnapshotStruct.hoverSnapshotStruct, + `Name: ${SnapshotStruct.hoverSnapshotStruct?.name || ''} + Size: ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}` + ); + } + + private setName(data: Array): void { + if (data.length > 0) { + data.forEach((item, index) => { + item.name = `SnapShot ${index}`; + }); + } + } } diff --git a/ide/src/trace/component/chart/SpAllAppStartups.ts b/ide/src/trace/component/chart/SpAllAppStartups.ts index 0046a27e0..917f44efe 100644 --- a/ide/src/trace/component/chart/SpAllAppStartups.ts +++ b/ide/src/trace/component/chart/SpAllAppStartups.ts @@ -126,7 +126,7 @@ export class SpAllAppStartupsChart { }, row ); - row.canvasRestore(context); + row.canvasRestore(context, this.trace); }; SpAllAppStartupsChart.trace.rowsEL?.appendChild(row); } diff --git a/ide/src/trace/component/chart/SpArkTsChart.ts b/ide/src/trace/component/chart/SpArkTsChart.ts index 678660d01..1628694fb 100644 --- a/ide/src/trace/component/chart/SpArkTsChart.ts +++ b/ide/src/trace/component/chart/SpArkTsChart.ts @@ -27,9 +27,19 @@ import { Utils } from '../trace/base/Utils'; import { type JsCpuProfilerChartFrame } from '../../bean/JsStruct'; import { type JsCpuProfilerRender, JsCpuProfilerStruct } from '../../database/ui-worker/ProcedureWorkerCpuProfiler'; import { ns2s } from '../../database/ui-worker/ProcedureWorkerCommon'; -import { queryJsCpuProfilerConfig, queryJsCpuProfilerData, queryJsMemoryData } from '../../database/SqlLite'; +import { + queryAllSnapshotNames, + queryJsCpuProfilerConfig, + queryJsCpuProfilerData, + queryJsMemoryData, +} from '../../database/SqlLite'; +import { + cpuProfilerDataSender +} from '../../database/data-trafic/ArkTsSender'; + const TYPE_SNAPSHOT = 0; const TYPE_TIMELINE = 1; +const LAMBDA_FUNCTION_NAME = '(anonymous)'; export class SpArkTsChart implements ParseListener { private trace: SpSystemTrace; private folderRow: TraceRow | undefined; @@ -39,6 +49,7 @@ export class SpArkTsChart implements ParseListener { private loadJsDatabase: LoadDatabase; private allCombineDataMap = new Map(); private process: string = ''; + constructor(trace: SpSystemTrace) { this.trace = trace; this.loadJsDatabase = LoadDatabase.getInstance(); @@ -65,7 +76,8 @@ export class SpArkTsChart implements ParseListener { this.folderRow.addTemplateTypes('ArkTs'); this.folderRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; this.folderRow.selectChangeHandler = this.trace.selectChangeHandler; - this.folderRow.supplier = (): Promise> => new Promise>((resolve) => resolve([])); + this.folderRow.supplierFrame = (): Promise> => + new Promise>((resolve) => resolve([])); this.folderRow.onThreadHandler = (useCache): void => { this.folderRow!.canvasSave(this.trace.canvasPanelCtx!); if (this.folderRow!.expansion) { @@ -80,7 +92,7 @@ export class SpArkTsChart implements ParseListener { this.folderRow! ); } - this.folderRow!.canvasRestore(this.trace.canvasPanelCtx!); + this.folderRow!.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; this.trace.rowsEL?.appendChild(this.folderRow); if (this.folderRow && jsConfig[0].type !== -1 && jsMemory.length > 0) { @@ -97,10 +109,38 @@ export class SpArkTsChart implements ParseListener { await this.initJsCpuChart(); } if ((this.heapSnapshotRow || this.heapTimelineRow) && jsMemory.length > 0) { - await this.initJsMemoryChartData(); + await this.loadJsDatabase.loadDatabase(this); } if (this.jsCpuProfilerRow && jsCpu.length > 0) { - await this.initJsCpuProfilerChartData(); + this.jsCpuProfilerRow!.supplierFrame = (): Promise> => { + return cpuProfilerDataSender(this.jsCpuProfilerRow!).then((res: any) => { + let maxHeight = res.maxDepth * 20; + this.jsCpuProfilerRow!.style.height = `${maxHeight}px`; + if (res.dataList.length > 0) { + this.allCombineDataMap = new Map(); + for (let data of res.dataList) { + this.allCombineDataMap.set(data.id, data); + SpSystemTrace.jsProfilerMap.set(data.id, data); + } + res.dataList.forEach((data: any) => { + data.children = []; + if (data.childrenIds.length > 0) { + for (let id of data.childrenIds) { + let child = SpSystemTrace.jsProfilerMap.get(Number(id)); + data.children.push(child); + } + } + data.name = SpSystemTrace.DATA_DICT.get(data.nameId) || LAMBDA_FUNCTION_NAME; + data.url = SpSystemTrace.DATA_DICT.get(data.urlId) || 'unknown'; + if (data.url && data.url !== 'unknown') { + let dirs = data.url.split('/'); + data.scriptName = dirs.pop() || ''; + } + }); + } + return res.dataList; + }); + }; } } } @@ -155,13 +195,6 @@ export class SpArkTsChart implements ParseListener { this.folderRow!.addChildTraceRow(this.heapSnapshotRow); } - private initJsMemoryChartData = async (): Promise => { - let time = new Date().getTime(); - await this.loadJsDatabase.loadDatabase(this); - let durTime = new Date().getTime() - time; - info('The time to load the js Memory data is: ', durTime); - }; - public async parseDone(fileModule: Array): Promise { if (fileModule.length > 0) { let heapFile = HeapDataInterface.getInstance().getFileStructs(); @@ -170,7 +203,7 @@ export class SpArkTsChart implements ParseListener { if (file.type === TYPE_TIMELINE) { let samples = HeapDataInterface.getInstance().getSamples(file.id); this.heapTimelineRow!.rowId = `heaptimeline` + file.id; - this.heapTimelineRow!.supplier = (): Promise => new Promise((resolve) => resolve(samples)); + this.heapTimelineRow!.supplierFrame = (): Promise => new Promise((resolve) => resolve(samples)); this.heapTimelineRow!.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (this.heapTimelineRow?.currentContext) { @@ -188,10 +221,10 @@ export class SpArkTsChart implements ParseListener { }, this.heapTimelineRow! ); - this.heapTimelineRow!.canvasRestore(context); + this.heapTimelineRow!.canvasRestore(context, this.trace); }; } else if (file.type === TYPE_SNAPSHOT) { - this.heapSnapshotRow!.supplier = (): Promise> => + this.heapSnapshotRow!.supplierFrame = (): Promise> => new Promise>((resolve) => resolve(heapFile)); this.heapSnapshotRow!.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; @@ -209,34 +242,12 @@ export class SpArkTsChart implements ParseListener { }, this.heapSnapshotRow! ); - this.heapSnapshotRow!.canvasRestore(context); + this.heapSnapshotRow!.canvasRestore(context, this.trace); }; } } } - private async initJsCpuProfilerChartData() { - procedurePool.submitWithName( - 'logic1', - 'jsCpuProfiler-init', - SpSystemTrace.DATA_DICT, - undefined, - (res: Array) => { - let allCombineData: Array = []; - this.getAllCombineData(res, allCombineData); - this.allCombineDataMap = new Map(); - for (let data of allCombineData) { - this.allCombineDataMap.set(data.id, data); - } - let max = Math.max(...allCombineData.map((it) => it.depth || 0)) + 1; - let maxHeight = max * 20; - this.jsCpuProfilerRow!.style.height = `${maxHeight}px`; - this.jsCpuProfilerRow!.supplier = (): Promise> => - new Promise>((resolve) => resolve(allCombineData)); - } - ); - } - private initJsCpuChart = async (): Promise => { this.jsCpuProfilerRow = TraceRow.skeleton(); this.jsCpuProfilerRow.rowParentId = this.process; @@ -282,20 +293,8 @@ export class SpArkTsChart implements ParseListener { }, this.jsCpuProfilerRow! ); - this.jsCpuProfilerRow!.canvasRestore(context); + this.jsCpuProfilerRow!.canvasRestore(context, this.trace); }; this.folderRow!.addChildTraceRow(this.jsCpuProfilerRow); }; - - private getAllCombineData( - combineData: Array, - allCombineData: Array - ): void { - for (let data of combineData) { - allCombineData.push(data); - if (data.children.length > 0) { - this.getAllCombineData(data.children, allCombineData); - } - } - } } diff --git a/ide/src/trace/component/chart/SpChartManager.ts b/ide/src/trace/component/chart/SpChartManager.ts index 480f6d886..5f5bf3306 100644 --- a/ide/src/trace/component/chart/SpChartManager.ts +++ b/ide/src/trace/component/chart/SpChartManager.ts @@ -33,7 +33,7 @@ import { SpAbilityMonitorChart } from './SpAbilityMonitorChart'; import { SpProcessChart } from './SpProcessChart'; import { perfDataQuery } from './PerfDataQuery'; import { SpVirtualMemChart } from './SpVirtualMemChart'; -import { SpFileSystemChart } from './SpFileSystemChart'; +import { SpEBPFChart } from './SpEBPFChart'; import { SpSdkChart } from './SpSdkChart'; import { SpHiSysEnergyChart } from './SpHiSysEnergyChart'; import { VmTrackerChart } from './SpVmTrackerChart'; @@ -50,6 +50,7 @@ import { FlagsConfig } from '../SpFlags'; import { SpLogChart } from './SpLogChart'; import { SpHiSysEventChart } from './SpHiSysEventChart'; import { SpAllAppStartupsChart } from './SpAllAppStartups'; +import {procedurePool} from "../../database/Procedure"; import { SpSegmentationChart } from './SpSegmentationChart'; export class SpChartManager { @@ -64,7 +65,7 @@ export class SpChartManager { private nativeMemory: SpNativeMemoryChart; private abilityMonitor: SpAbilityMonitorChart; private process: SpProcessChart; - private fileSystem: SpFileSystemChart; + private fileSystem: SpEBPFChart; private sdkChart: SpSdkChart; private hiSyseventChart: SpHiSysEnergyChart; private smapsChart: VmTrackerChart; @@ -80,7 +81,7 @@ export class SpChartManager { constructor(trace: SpSystemTrace) { this.trace = trace; this.perf = new SpHiPerf(trace); - this.fileSystem = new SpFileSystemChart(trace); + this.fileSystem = new SpEBPFChart(trace); this.cpu = new SpCpuChart(trace); this.freq = new SpFreqChart(trace); this.virtualMemChart = new SpVirtualMemChart(trace); @@ -113,6 +114,7 @@ export class SpChartManager { } await this.initTraceConfig(); dict.map((d) => SpSystemTrace.DATA_DICT.set(d['id'], d['data'])); + await this.cacheDataDictToWorker(); SpSystemTrace.DATA_TASK_POOL_CALLSTACK.clear(); let taskPoolCallStack = await queryTaskPoolCallStack(); taskPoolCallStack.map((d) => SpSystemTrace.DATA_TASK_POOL_CALLSTACK.set(d.id, d)); @@ -137,16 +139,22 @@ export class SpChartManager { info('initData Cpu Rate Data initialized'); progress('cpu freq', 80); await this.freq.init(); + info('initData Cpu Freq Data initialized'); await this.logChart.init(); + info('initData logChart Data initialized'); await this.spHiSysEvent.init(); + info('initData HiSysEvent Data initialized'); progress('Clock init', 82); await this.clockChart.init(); + info('initData Clock Data initialized'); progress('Irq init', 84); await this.irqChart.init(); - info('initData Cpu Freq Data initialized'); + info('initData Irq Data initialized'); progress('SpSegmentationChart inin', 84.5); await this.spSegmentationChart.init(); + info('initData Segmentation initialized'); await this.virtualMemChart.init(); + info('initData virtualMemChart initialized'); progress('fps', 85); await this.fps.init(); info('initData FPS Data initialized'); @@ -155,8 +163,10 @@ export class SpChartManager { info('initData Native Memory Data initialized'); progress('ability monitor', 88); await this.abilityMonitor.init(); + info('initData abilityMonitor Data initialized'); progress('hiSysevent', 88.2); await this.hiSyseventChart.init(); + info('initData Energy Data initialized'); progress('vm tracker', 88.4); await this.smapsChart.init(); info('initData vm tracker Data initialized'); @@ -188,6 +198,7 @@ export class SpChartManager { SpSystemTrace.DATA_DICT.clear(); let dict = await queryDataDICT(); dict.map((d) => SpSystemTrace.DATA_DICT.set(d['id'], d['data'])); + await this.cacheDataDictToWorker(); await perfDataQuery.initPerfCache(); await this.nativeMemory.initNativeMemory(); await this.fileSystem.initFileCallchain(); @@ -219,9 +230,9 @@ export class SpChartManager { this.trace.timerShaftEL.totalNS = total; this.trace.timerShaftEL.getRangeRuler()!.drawMark = true; this.trace.timerShaftEL.setRangeNS(0, total); - (window as any).recordStartNS = startNS; - (window as any).recordEndNS = endNS; - (window as any).totalNS = total; + window.recordStartNS = startNS; + window.recordEndNS = endNS; + window.totalNS = total; this.trace.timerShaftEL.loadComplete = true; } }; @@ -240,6 +251,20 @@ export class SpChartManager { } }); }; + + async cacheDataDictToWorker(): Promise { + return new Promise((resolve) => { + procedurePool.submitWithName( + 'logic0', + 'cache-data-dict', + { dataDict: SpSystemTrace.DATA_DICT }, + undefined, + (res: any) => { + resolve(); + } + ); + }); + } } export const FolderSupplier = () => { @@ -260,6 +285,6 @@ export const FolderThreadHandler = (row: TraceRow, trace: SpSystemTrace) => row ); } - row.canvasRestore(trace.canvasPanelCtx!); + row.canvasRestore(trace.canvasPanelCtx!, trace); }; }; diff --git a/ide/src/trace/component/chart/SpClockChart.ts b/ide/src/trace/component/chart/SpClockChart.ts index 74c4c2d4a..2d40ff685 100644 --- a/ide/src/trace/component/chart/SpClockChart.ts +++ b/ide/src/trace/component/chart/SpClockChart.ts @@ -22,6 +22,7 @@ import { ClockRender, ClockStruct } from '../../database/ui-worker/ProcedureWork import { ColorUtils } from '../trace/base/ColorUtils'; import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU'; import { Utils } from '../trace/base/Utils'; +import { clockDataSender } from '../../database/data-trafic/ClockDataSender'; export class SpClockChart { private trace: SpSystemTrace; @@ -59,27 +60,21 @@ export class SpClockChart { traceRow.setAttribute('children', ''); traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; traceRow.selectChangeHandler = this.trace.selectChangeHandler; - traceRow.supplier = () => { + traceRow.supplierFrame = () => { let promiseData = null; if (it.name.endsWith(' Frequency')) { - promiseData = queryClockFrequency(it.srcname); + promiseData = clockDataSender(it.srcname, 'clockFrequency', traceRow); } else if (isState) { - promiseData = queryClockState(it.srcname); + promiseData = clockDataSender(it.srcname, 'clockState', traceRow); } else if (isScreenState) { - promiseData = queryScreenState(); + promiseData = clockDataSender('', 'screenState', traceRow); } if (promiseData == null) { return new Promise>((resolve) => resolve([])); } else { - return promiseData.then((resultClock) => { + return promiseData.then((resultClock: Array) => { for (let j = 0; j < resultClock.length; j++) { - if (!isState) { - if (j == resultClock.length - 1) { - resultClock[j].dur = (TraceRow.range?.totalNS || 0) - (resultClock[j].startNS || 0); - } else { - resultClock[j].dur = (resultClock[j + 1].startNS || 0) - (resultClock[j].startNS || 0); - } - } + resultClock[j].type = 'measure'; if ((resultClock[j].value || 0) > maxValue) { maxValue = resultClock[j].value || 0; } @@ -93,6 +88,15 @@ export class SpClockChart { }); } }; + traceRow.getCacheData = (args: any): Promise> | undefined => { + if (it.name.endsWith(' Frequency')) { + return clockDataSender(it.srcname, 'clockFrequency', traceRow, args); + } else if (isState) { + return clockDataSender(it.srcname, 'clockState', traceRow, args); + } else if (isScreenState) { + return clockDataSender('', 'screenState', traceRow, args); + } + }; traceRow.focusHandler = (ev) => { this.trace?.displayTip( traceRow, @@ -123,7 +127,7 @@ export class SpClockChart { }, traceRow ); - traceRow.canvasRestore(context); + traceRow.canvasRestore(context, this.trace); }; folder.addChildTraceRow(traceRow); } @@ -157,7 +161,7 @@ export class SpClockChart { clockFolder ); } - clockFolder.canvasRestore(this.trace.canvasPanelCtx!); + clockFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; return clockFolder; } diff --git a/ide/src/trace/component/chart/SpCpuChart.ts b/ide/src/trace/component/chart/SpCpuChart.ts index 266169470..44a897884 100644 --- a/ide/src/trace/component/chart/SpCpuChart.ts +++ b/ide/src/trace/component/chart/SpCpuChart.ts @@ -27,7 +27,9 @@ import { procedurePool } from '../../database/Procedure'; import { CpuRender, CpuStruct } from '../../database/ui-worker/ProcedureWorkerCPU'; import { renders } from '../../database/ui-worker/ProcedureWorker'; import { Utils } from '../trace/base/Utils'; -import { KeyPathStruct } from '../../bean/KeyPathStruct'; +import { cpuDataSender } from '../../database/data-trafic/CpuDataSender'; +import { TraficEnum } from '../../database/data-trafic/QueryEnum'; +import {cpuList} from "../../database/data-trafic/AllMemoryCache"; export class SpCpuChart { private trace: SpSystemTrace; @@ -63,8 +65,12 @@ export class SpCpuChart { traceRow.name = `Cpu ${cpuId}`; traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; traceRow.selectChangeHandler = this.trace.selectChangeHandler; - traceRow.supplier = () => - queryCpuData(cpuId, TraceRow.range?.startNS || 0, TraceRow.range?.endNS || 0).then((res) => { + traceRow.supplierFrame = () => { + return cpuDataSender(cpuId, traceRow).then((res) => { + const filterList = SpSystemTrace.keyPathList.filter((item) => { + return item.cpu === cpuId; + }); + res.push(...filterList); res.forEach((it, i, arr) => { let p = Utils.PROCESS_MAP.get(it.processId!); let t = Utils.THREAD_MAP.get(it.tid!); @@ -77,27 +83,19 @@ export class SpCpuChart { it.processCmdLine = p; it.name = t; it.type = 'thread'; - if (i !== arr.length - 1) { - if (it.startTime! + it.dur! > arr[i + 1]!.startTime! || it.dur == -1) { - it.dur = arr[i + 1]!.startTime! - it.startTime!; - it.nofinish = true; - } - } else { - if (it.dur == -1) { - it.dur = TraceRow.range!.endNS - it.startTime!; - it.nofinish = true; - } - } }); return res; }); + }; traceRow.focusHandler = () => { this.trace?.displayTip( traceRow, CpuStruct.hoverCpuStruct, - `P:${CpuStruct.hoverCpuStruct?.processName || 'Process'} [${CpuStruct.hoverCpuStruct - ?.processId}]T:${CpuStruct.hoverCpuStruct?.name} [${CpuStruct.hoverCpuStruct - ?.tid}] [Prio:${CpuStruct.hoverCpuStruct?.priority || 0}]` + `P:${CpuStruct.hoverCpuStruct?.processName || 'Process'} [${ + CpuStruct.hoverCpuStruct?.processId + }]T:${CpuStruct.hoverCpuStruct?.name} [${CpuStruct.hoverCpuStruct?.tid}] [Prio:${ + CpuStruct.hoverCpuStruct?.priority || 0 + }]` ); }; traceRow.findHoverStruct = () => { @@ -113,14 +111,14 @@ export class SpCpuChart { traceRow.canvasSave(context); (renders['cpu-data'] as CpuRender).renderMainThread( { - cpuRenderContext: context, + ctx: context, useCache: useCache, type: `cpu-data-${i1}`, translateY: traceRow.translateY, }, traceRow ); - traceRow.canvasRestore(context); + traceRow.canvasRestore(context, this.trace); }; this.trace.rowsEL?.appendChild(traceRow); } @@ -133,7 +131,7 @@ export class SpCpuChart { initProcessThreadStateData = async (progress: Function) => { let time = new Date().getTime(); progress('StateProcessThread', 93); - procedurePool.submitWithName('logic1', 'spt-init', {}, undefined, (res: any) => {}); + procedurePool.submitWithName('logic0', 'spt-init', {}, undefined, (res: any) => {}); let durTime = new Date().getTime() - time; info('The time to load the first ProcessThreadState data is: ', durTime); }; @@ -142,7 +140,7 @@ export class SpCpuChart { let time = new Date().getTime(); progress('CPU Idle', 94); procedurePool.submitWithName( - 'logic1', + 'logic0', 'scheduling-getCpuIdle0', { endTs: (window as any).recordEndNS, @@ -165,7 +163,7 @@ export class SpCpuChart { initSchedulingPTData = async (progress: Function) => { let time = new Date().getTime(); progress('CPU Idle', 94); - procedurePool.submitWithName('logic1', 'scheduling-getProcessAndThread', {}, undefined, (res: any) => {}); + procedurePool.submitWithName('logic0', 'scheduling-getProcessAndThread', {}, undefined, (res: any) => {}); let durTime = new Date().getTime() - time; info('The time to load the first CPU Idle0 data is: ', durTime); }; @@ -173,7 +171,7 @@ export class SpCpuChart { initSchedulingFreqData = async (progress: Function) => { let time = new Date().getTime(); progress('CPU Scheduling Freq', 94); - procedurePool.submitWithName('logic1', 'scheduling-initFreqData', {}, undefined, (res: any) => {}); + procedurePool.submitWithName('logic0', 'scheduling-initFreqData', {}, undefined, (res: any) => {}); let durTime = new Date().getTime() - time; info('The time to load the first CPU Idle0 data is: ', durTime); }; diff --git a/ide/src/trace/component/chart/SpFileSystemChart.ts b/ide/src/trace/component/chart/SpEBPFChart.ts similarity index 77% rename from ide/src/trace/component/chart/SpFileSystemChart.ts rename to ide/src/trace/component/chart/SpEBPFChart.ts index 02e1badb2..7bdde56de 100644 --- a/ide/src/trace/component/chart/SpFileSystemChart.ts +++ b/ide/src/trace/component/chart/SpEBPFChart.ts @@ -23,13 +23,14 @@ import { getFileSysVirtualMemoryChartData, hasFileSysData, } from '../../database/SqlLite'; -import { FileSysChartStruct, FileSystemRender } from '../../database/ui-worker/ProcedureWorkerFileSystem'; +import { EBPFChartStruct, EBPFRender } from '../../database/ui-worker/ProcedureWorkerEBPF'; import { ColorUtils } from '../trace/base/ColorUtils'; import { Utils } from '../trace/base/Utils'; import { renders } from '../../database/ui-worker/ProcedureWorker'; import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU'; +import { diskIoSender, fileSysVMSender, fileSystemSender } from '../../database/data-trafic/EBPFSender'; -export class SpFileSystemChart { +export class SpEBPFChart { private trace: SpSystemTrace; constructor(trace: SpSystemTrace) { @@ -62,7 +63,7 @@ export class SpFileSystemChart { async initFileCallchain() { return new Promise((resolve, reject) => { - procedurePool.submitWithName('logic0', 'fileSystem-init', SpSystemTrace.DATA_DICT, undefined, (res: any) => { + procedurePool.submitWithName('logic0', 'fileSystem-init', null, undefined, (res: any) => { resolve(res); }); }); @@ -80,7 +81,7 @@ export class SpFileSystemChart { fsFolder.addTemplateTypes('HiEBpf'); fsFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler; fsFolder.selectChangeHandler = this.trace.selectChangeHandler; - fsFolder.supplier = () => new Promise>((resolve) => resolve([])); + fsFolder.supplierFrame = () => new Promise>((resolve) => resolve([])); fsFolder.onThreadHandler = (useCache) => { fsFolder.canvasSave(this.trace.canvasPanelCtx!); if (fsFolder.expansion) { @@ -95,14 +96,14 @@ export class SpFileSystemChart { fsFolder ); } - fsFolder.canvasRestore(this.trace.canvasPanelCtx!); + fsFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; this.trace.rowsEL?.appendChild(fsFolder); return fsFolder; } async initLogicalRead(folder: TraceRow) { - let logicalReadRow = TraceRow.skeleton(); + let logicalReadRow = TraceRow.skeleton(); logicalReadRow.rowId = `FileSystemLogicalRead`; logicalReadRow.index = 1; logicalReadRow.rowType = TraceRow.ROW_TYPE_FILE_SYSTEM; @@ -111,12 +112,16 @@ export class SpFileSystemChart { logicalReadRow.style.height = '40px'; logicalReadRow.setAttribute('children', ''); logicalReadRow.name = `FileSystem Logical Read`; - logicalReadRow.supplier = () => getFileSysChartDataByType(2); + logicalReadRow.supplierFrame = () => { + return fileSystemSender(2, TraceRow.range?.scale || 50, logicalReadRow).then((res: Array) => { + return res; + }); + }; logicalReadRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; logicalReadRow.selectChangeHandler = this.trace.selectChangeHandler; logicalReadRow.focusHandler = () => this.focusHandler(logicalReadRow); logicalReadRow.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = logicalReadRow.getHoverStruct(false); + EBPFChartStruct.hoverEBPFStruct = logicalReadRow.getHoverStruct(false); }; logicalReadRow.onThreadHandler = (useCache) => { let context: CanvasRenderingContext2D; @@ -126,7 +131,7 @@ export class SpFileSystemChart { context = logicalReadRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } logicalReadRow.canvasSave(context); - (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( + (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as EBPFRender).renderMainThread( { context: context, useCache: useCache, @@ -135,13 +140,13 @@ export class SpFileSystemChart { }, logicalReadRow ); - logicalReadRow.canvasRestore(context); + logicalReadRow.canvasRestore(context, this.trace); }; folder.addChildTraceRow(logicalReadRow); } async initLogicalWrite(folder: TraceRow) { - let logicalWriteRow = TraceRow.skeleton(); + let logicalWriteRow = TraceRow.skeleton(); logicalWriteRow.rowId = `FileSystemLogicalWrite`; logicalWriteRow.index = 2; logicalWriteRow.rowType = TraceRow.ROW_TYPE_FILE_SYSTEM; @@ -150,12 +155,16 @@ export class SpFileSystemChart { logicalWriteRow.style.height = '40px'; logicalWriteRow.setAttribute('children', ''); logicalWriteRow.name = `FileSystem Logical Write`; - logicalWriteRow.supplier = () => getFileSysChartDataByType(3); + logicalWriteRow.supplierFrame = () => { + return fileSystemSender(3, TraceRow.range?.scale || 50, logicalWriteRow).then((res: Array) => { + return res; + }); + }; logicalWriteRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; logicalWriteRow.selectChangeHandler = this.trace.selectChangeHandler; logicalWriteRow.focusHandler = () => this.focusHandler(logicalWriteRow); logicalWriteRow.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = logicalWriteRow.getHoverStruct(false); + EBPFChartStruct.hoverEBPFStruct = logicalWriteRow.getHoverStruct(false); }; logicalWriteRow.onThreadHandler = (useCache) => { let context: CanvasRenderingContext2D; @@ -165,7 +174,7 @@ export class SpFileSystemChart { context = logicalWriteRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } logicalWriteRow.canvasSave(context); - (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( + (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as EBPFRender).renderMainThread( { context: context, useCache: useCache, @@ -174,13 +183,13 @@ export class SpFileSystemChart { }, logicalWriteRow ); - logicalWriteRow.canvasRestore(context); + logicalWriteRow.canvasRestore(context, this.trace); }; folder.addChildTraceRow(logicalWriteRow); } async initDiskIOLatency(folder: TraceRow) { - let diskIoRow = TraceRow.skeleton(); + let diskIoRow = TraceRow.skeleton(); diskIoRow.rowId = `FileSystemDiskIOLatency`; diskIoRow.index = 4; diskIoRow.rowType = TraceRow.ROW_TYPE_FILE_SYSTEM; @@ -190,12 +199,18 @@ export class SpFileSystemChart { diskIoRow.style.width = `100%`; diskIoRow.setAttribute('children', ''); diskIoRow.name = `Disk I/O Latency`; - diskIoRow.supplier = () => getDiskIOLatencyChartDataByProcess(true, 0, [1, 2, 3, 4]); + diskIoRow.supplierFrame = () => { + return diskIoSender(true, 0, [1, 2, 3, 4], TraceRow.range?.scale || 50, diskIoRow).then( + (res: Array) => { + return res; + } + ); + }; diskIoRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; diskIoRow.selectChangeHandler = this.trace.selectChangeHandler; diskIoRow.focusHandler = () => this.focusHandler(diskIoRow); diskIoRow.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = diskIoRow.getHoverStruct(false); + EBPFChartStruct.hoverEBPFStruct = diskIoRow.getHoverStruct(false); }; diskIoRow.onThreadHandler = (useCache) => { let context: CanvasRenderingContext2D; @@ -205,7 +220,7 @@ export class SpFileSystemChart { context = diskIoRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } diskIoRow.canvasSave(context); - (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( + (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as EBPFRender).renderMainThread( { context: context, useCache: useCache, @@ -214,7 +229,7 @@ export class SpFileSystemChart { }, diskIoRow ); - diskIoRow.canvasRestore(context); + diskIoRow.canvasRestore(context, this.trace); }; folder.addChildTraceRow(diskIoRow); } @@ -223,7 +238,7 @@ export class SpFileSystemChart { let processes = (await getDiskIOProcess()) || []; for (let i = 0, len = processes.length; i < len; i++) { let process = processes[i]; - let rowRead = TraceRow.skeleton(); + let rowRead = TraceRow.skeleton(); rowRead.index = 5 + 2 * i; rowRead.rowId = `FileSystemDiskIOLatency-read-${process['ipid']}`; rowRead.rowType = TraceRow.ROW_TYPE_FILE_SYSTEM; @@ -233,12 +248,18 @@ export class SpFileSystemChart { rowRead.style.width = `100%`; rowRead.setAttribute('children', ''); rowRead.name = `${process['name'] ?? 'Process'}(${process['pid']}) Max Read Latency`; - rowRead.supplier = () => getDiskIOLatencyChartDataByProcess(false, process['ipid'], [1, 3]); + rowRead.supplierFrame = () => { + return diskIoSender(false, process['ipid'], [1, 3], TraceRow.range?.scale || 50, rowRead).then( + (res: Array) => { + return res; + } + ); + }; rowRead.favoriteChangeHandler = this.trace.favoriteChangeHandler; rowRead.selectChangeHandler = this.trace.selectChangeHandler; rowRead.focusHandler = () => this.focusHandler(rowRead); rowRead.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = rowRead.getHoverStruct(false); + EBPFChartStruct.hoverEBPFStruct = rowRead.getHoverStruct(false); }; rowRead.onThreadHandler = (useCache) => { let context: CanvasRenderingContext2D; @@ -248,7 +269,7 @@ export class SpFileSystemChart { context = rowRead.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } rowRead.canvasSave(context); - (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( + (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as EBPFRender).renderMainThread( { context: context, useCache: useCache, @@ -257,10 +278,10 @@ export class SpFileSystemChart { }, rowRead ); - rowRead.canvasRestore(context); + rowRead.canvasRestore(context, this.trace); }; folder.addChildTraceRow(rowRead); - let rowWrite = TraceRow.skeleton(); + let rowWrite = TraceRow.skeleton(); rowWrite.index = 5 + 2 * i + 1; rowWrite.rowId = `FileSystemDiskIOLatency-write-${process['ipid']}`; rowWrite.rowType = TraceRow.ROW_TYPE_FILE_SYSTEM; @@ -270,12 +291,18 @@ export class SpFileSystemChart { rowWrite.style.width = `100%`; rowWrite.setAttribute('children', ''); rowWrite.name = `${process['name'] ?? 'Process'}(${process['pid']}) Max Write Latency`; - rowWrite.supplier = () => getDiskIOLatencyChartDataByProcess(false, process['ipid'], [2, 4]); + rowWrite.supplierFrame = () => { + return diskIoSender(false, process['ipid'], [2, 4], TraceRow.range?.scale || 50, rowWrite).then( + (res: Array) => { + return res; + } + ); + }; rowWrite.favoriteChangeHandler = this.trace.favoriteChangeHandler; rowWrite.selectChangeHandler = this.trace.selectChangeHandler; rowWrite.focusHandler = () => this.focusHandler(rowWrite); rowWrite.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = rowWrite.getHoverStruct(false); + EBPFChartStruct.hoverEBPFStruct = rowWrite.getHoverStruct(false); }; rowWrite.onThreadHandler = (useCache) => { let context: CanvasRenderingContext2D; @@ -285,7 +312,7 @@ export class SpFileSystemChart { context = rowWrite.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } rowWrite.canvasSave(context); - (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( + (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as EBPFRender).renderMainThread( { context: context, useCache: useCache, @@ -294,14 +321,14 @@ export class SpFileSystemChart { }, rowWrite ); - rowWrite.canvasRestore(context); + rowWrite.canvasRestore(context, this.trace); }; folder.addChildTraceRow(rowWrite); } } async initVirtualMemoryTrace(folder: TraceRow) { - let vmTraceRow = TraceRow.skeleton(); + let vmTraceRow = TraceRow.skeleton(); vmTraceRow.rowId = `FileSystemVirtualMemory`; vmTraceRow.index = 3; vmTraceRow.rowType = TraceRow.ROW_TYPE_FILE_SYSTEM; @@ -312,12 +339,16 @@ export class SpFileSystemChart { vmTraceRow.style.width = `100%`; vmTraceRow.setAttribute('children', ''); vmTraceRow.name = `Page Fault Trace`; - vmTraceRow.supplier = () => getFileSysVirtualMemoryChartData(); + vmTraceRow.supplierFrame = () => { + return fileSysVMSender(TraceRow.range?.scale || 50, vmTraceRow).then((res: Array) => { + return res; + }); + }; vmTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; vmTraceRow.selectChangeHandler = this.trace.selectChangeHandler; vmTraceRow.focusHandler = () => this.focusHandler(vmTraceRow); vmTraceRow.findHoverStruct = () => { - FileSysChartStruct.hoverFileSysStruct = vmTraceRow.getHoverStruct(false); + EBPFChartStruct.hoverEBPFStruct = vmTraceRow.getHoverStruct(false); }; vmTraceRow.onThreadHandler = (useCache) => { let context: CanvasRenderingContext2D; @@ -327,7 +358,7 @@ export class SpFileSystemChart { context = vmTraceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } vmTraceRow.canvasSave(context); - (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as FileSystemRender).renderMainThread( + (renders[TraceRow.ROW_TYPE_FILE_SYSTEM] as EBPFRender).renderMainThread( { context: context, useCache: useCache, @@ -336,17 +367,17 @@ export class SpFileSystemChart { }, vmTraceRow ); - vmTraceRow.canvasRestore(context); + vmTraceRow.canvasRestore(context, this.trace); }; folder.addChildTraceRow(vmTraceRow); } - focusHandler(row: TraceRow) { + focusHandler(row: TraceRow) { let num = 0; let tip = ''; - if (FileSysChartStruct.hoverFileSysStruct) { - num = FileSysChartStruct.hoverFileSysStruct.size ?? 0; - let group10Ms = FileSysChartStruct.hoverFileSysStruct.group10Ms ?? false; + if (EBPFChartStruct.hoverEBPFStruct) { + num = EBPFChartStruct.hoverEBPFStruct.size ?? 0; + let group10Ms = EBPFChartStruct.hoverEBPFStruct.group10Ms ?? false; if (row.rowId!.startsWith('FileSystemDiskIOLatency')) { if (num > 0) { let tipStr = Utils.getProbablyTime(num); @@ -366,6 +397,6 @@ export class SpFileSystemChart { } } } - this.trace?.displayTip(row, FileSysChartStruct.hoverFileSysStruct, tip); + this.trace?.displayTip(row, EBPFChartStruct.hoverEBPFStruct, tip); } } diff --git a/ide/src/trace/component/chart/SpFpsChart.ts b/ide/src/trace/component/chart/SpFpsChart.ts index 468c4421f..aeb0b9f7a 100644 --- a/ide/src/trace/component/chart/SpFpsChart.ts +++ b/ide/src/trace/component/chart/SpFpsChart.ts @@ -69,7 +69,7 @@ export class SpFpsChart { }, fpsRow ); - fpsRow.canvasRestore(context); + fpsRow.canvasRestore(context, this.trace); }; this.trace.rowsEL?.appendChild(fpsRow); let durTime = new Date().getTime() - startTime; diff --git a/ide/src/trace/component/chart/SpFrameTimeChart.ts b/ide/src/trace/component/chart/SpFrameTimeChart.ts index 6756dd9cd..90a569850 100644 --- a/ide/src/trace/component/chart/SpFrameTimeChart.ts +++ b/ide/src/trace/component/chart/SpFrameTimeChart.ts @@ -18,12 +18,11 @@ import { renders } from '../../database/ui-worker/ProcedureWorker'; import { JankRender, JankStruct } from '../../database/ui-worker/ProcedureWorkerJank'; import { SpSystemTrace } from '../SpSystemTrace'; import { - queryActualFrameDate, - queryExpectedFrameDate, - queryFrameAnimationData, + queryAllProcessNames, + queryAnimationIdAndNameData, + queryAnimationTimeRangeData, + queryDynamicIdAndNameData, queryFrameApp, - queryFrameDynamicData, - queryFrameSpacing, queryFrameTimeData, queryPhysicalData, } from '../../database/SqlLite'; @@ -37,10 +36,15 @@ import { FlagsConfig, type Params } from '../SpFlags'; import { type AnimationRanges, type DeviceStruct } from '../../bean/FrameComponentBean'; import { type EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU'; import { TreeItemData } from '../../../base-ui/tree/LitTree'; +import { QueryEnum } from '../../database/data-trafic/QueryEnum'; +import { frameAnimationSender, frameDynamicSender, frameSpacingSender } from '../../database/data-trafic/FrameDynamicEffectSender'; +import { frameJanksSender } from '../../database/data-trafic/FrameJanksSender'; export class SpFrameTimeChart { private trace: SpSystemTrace; private flagConfig: Params | undefined; + private pidToProcessNameMap: Map = new Map(); + private idToProcessNameMap: Map = new Map(); constructor(trace: SpSystemTrace) { this.trace = trace; @@ -48,7 +52,14 @@ export class SpFrameTimeChart { async init(): Promise { let frameTimeData = await queryFrameTimeData(); + this.pidToProcessNameMap.clear(); + this.idToProcessNameMap.clear(); if (frameTimeData.length > 0) { + let processNamesArray = await queryAllProcessNames(); + processNamesArray.forEach((it) => { + this.pidToProcessNameMap.set(it.pid, it.name); + this.idToProcessNameMap.set(it.id, it.name); + }); let frameTimeLineRow: TraceRow = await this.initFrameTimeLine(); await this.initExpectedChart(frameTimeLineRow); await this.initActualChart(frameTimeLineRow); @@ -88,34 +99,42 @@ export class SpFrameTimeChart { }, frameTimeLineRow! ); - frameTimeLineRow!.canvasRestore(context); + frameTimeLineRow!.canvasRestore(context, this.trace); }; this.trace.rowsEL?.appendChild(frameTimeLineRow); return frameTimeLineRow; } async initExpectedChart(frameTimeLineRow: TraceRow): Promise { - let frameExpectedData = await this.getExpectedFrameDate(); - let unitIndex: number = 1; - let unitHeight: number = 20; - let max: number = Math.max(...frameExpectedData.map((it) => it.depth || 0)) + unitIndex; - let maxHeight: number = max * unitHeight; let expectedTimeLineRow = TraceRow.skeleton(); expectedTimeLineRow.rowId = 'expected frameTime'; expectedTimeLineRow.rowType = TraceRow.ROW_TYPE_JANK; expectedTimeLineRow.rowHidden = !frameTimeLineRow.expansion; expectedTimeLineRow.rowParentId = 'frameTime'; expectedTimeLineRow.style.width = '100%'; - expectedTimeLineRow.style.height = '40px'; - expectedTimeLineRow.style.height = `${maxHeight}px`; expectedTimeLineRow.name = 'Expected Timeline'; expectedTimeLineRow.addTemplateTypes('FrameTimeline'); - expectedTimeLineRow.setAttribute('height', `${maxHeight}`); expectedTimeLineRow.setAttribute('children', ''); - expectedTimeLineRow.supplier = (): Promise => - new Promise((resolve): void => { - resolve(frameExpectedData); + expectedTimeLineRow.supplierFrame = () => { + return frameJanksSender(QueryEnum.FrameExpectedData, expectedTimeLineRow).then((res) => { + let maxDepth: number = 1; + let unitHeight: number = 20; + res.forEach((item) => { + if (item.depth! >= maxDepth) { + maxDepth = item.depth! + 1; + } + item.frame_type = 'frameTime'; + item.cmdline = this.pidToProcessNameMap.get(item.pid!); + item.rs_name = this.idToProcessNameMap.get(Number(item.rs_name)!); + }); + if (expectedTimeLineRow && !expectedTimeLineRow.isComplete && res.length > 0) { + let maxHeight: number = maxDepth * unitHeight; + expectedTimeLineRow.style.height = `${maxHeight}px`; + expectedTimeLineRow.setAttribute('height', `${maxHeight}`); + } + return res; }); + }; expectedTimeLineRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; expectedTimeLineRow.selectChangeHandler = this.trace.selectChangeHandler; expectedTimeLineRow.onThreadHandler = (useCache: boolean): void => { @@ -134,32 +153,42 @@ export class SpFrameTimeChart { }, expectedTimeLineRow! ); - expectedTimeLineRow!.canvasRestore(context); + expectedTimeLineRow!.canvasRestore(context, this.trace); }; frameTimeLineRow.addChildTraceRow(expectedTimeLineRow); } async initActualChart(frameTimeLineRow: TraceRow): Promise { - let frameActualData = await this.getActualFrameDate(); - let unitIndex: number = 1; - let unitHeight: number = 20; - let maxHeight: number = (Math.max(...frameActualData.map((it) => it.depth || 0)) + unitIndex) * unitHeight; let actualTimeLineRow = TraceRow.skeleton(); actualTimeLineRow.rowId = 'actual frameTime'; actualTimeLineRow.rowType = TraceRow.ROW_TYPE_JANK; actualTimeLineRow.rowHidden = !frameTimeLineRow.expansion; actualTimeLineRow.rowParentId = 'frameTime'; actualTimeLineRow.style.width = '100%'; - actualTimeLineRow.style.height = `${maxHeight}px`; actualTimeLineRow.name = 'Actual Timeline'; actualTimeLineRow.addTemplateTypes('FrameTimeline'); - actualTimeLineRow.setAttribute('height', `${maxHeight}`); actualTimeLineRow.setAttribute('children', ''); - actualTimeLineRow.dataList = frameActualData; - actualTimeLineRow.supplier = (): Promise => - new Promise((resolve): void => { - resolve(frameActualData); + actualTimeLineRow.supplierFrame = () => { + return frameJanksSender(QueryEnum.FrameActualData, actualTimeLineRow).then((res) => { + let maxDepth: number = 1; + let unitHeight: number = 20; + res.forEach((item) => { + if (item.depth! >= maxDepth) { + maxDepth = item.depth! + 1; + } + item.frame_type = 'frameTime'; + item.cmdline = this.pidToProcessNameMap.get(item.pid!); + item.rs_name = this.idToProcessNameMap.get(Number(item.rs_name)!); + item.type = '0'; + }); + if (actualTimeLineRow && !actualTimeLineRow.isComplete && res.length > 0) { + let maxHeight: number = maxDepth * unitHeight; + actualTimeLineRow.style.height = `${maxHeight}px`; + actualTimeLineRow.setAttribute('height', `${maxHeight}`); + } + return res; }); + }; actualTimeLineRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; actualTimeLineRow.selectChangeHandler = this.trace.selectChangeHandler; actualTimeLineRow.onThreadHandler = (useCache: boolean): void => { @@ -178,7 +207,7 @@ export class SpFrameTimeChart { }, actualTimeLineRow! ); - actualTimeLineRow!.canvasRestore(context); + actualTimeLineRow!.canvasRestore(context, this.trace); }; frameTimeLineRow.addChildTraceRow(actualTimeLineRow); let offsetYTimeOut: number = 0; @@ -201,6 +230,7 @@ export class SpFrameTimeChart { firstRow: TraceRow ): Promise { this.flagConfig = FlagsConfig.getFlagsConfig('AnimationAnalysis'); + let appNameMap: Map = new Map(); if (this.flagConfig?.AnimationAnalysis === 'Enabled') { if (process.processName?.startsWith('render_service')) { let targetRowList = processRow.childrenList.filter( @@ -211,9 +241,13 @@ export class SpFrameTimeChart { let currentName = nameArr[0].name; let frameChart = await this.initFrameChart(processRow, nameArr); processRow.addChildTraceRowAfter(frameChart, targetRowList[0]); + let appNameList = await queryDynamicIdAndNameData(); + appNameList.forEach((item) => { + appNameMap.set(item.id, item.appName); + }); let animationRanges = await this.initAnimationChart(processRow, firstRow); - await this.initDynamicCurveChart(frameChart, currentName, animationRanges); - await this.initFrameSpacing(nameArr, frameChart, currentName, animationRanges); + await this.initDynamicCurveChart(appNameMap, frameChart, currentName, animationRanges); + await this.initFrameSpacing(appNameMap, nameArr, frameChart, currentName, animationRanges); } } } @@ -255,7 +289,7 @@ export class SpFrameTimeChart { }, frameChart! ); - frameChart!.canvasRestore(context); + frameChart!.canvasRestore(context, this.trace); }; this.trace.rowsEL?.appendChild(frameChart); return frameChart; @@ -265,68 +299,57 @@ export class SpFrameTimeChart { processRow: TraceRow, firstRow: TraceRow ): Promise { - let frameAnimationData: FrameAnimationStruct[] = await queryFrameAnimationData(); let animationRanges: AnimationRanges[] = []; - if (frameAnimationData.length > 0) { - frameAnimationData.forEach((data) => { - if (data.status === 'Completion delay') { - animationRanges.push({ - start: data.startTs, - end: data.endTs, - }); - } - data.dur = data.endTs - data.startTs; - }); - let unitIndex: number = 1; - let isIntersect = (a: FrameAnimationStruct, b: FrameAnimationStruct): boolean => - Math.max(a.startTs! + a.dur!, b.startTs! + b.dur!) - Math.min(a.startTs!, b.startTs!) < a.dur! + b.dur!; - let depths = []; - for (let i: number = 0; i < frameAnimationData.length; i++) { - if (!frameAnimationData[i].dur || frameAnimationData[i].dur < 0) { - continue; - } - if (depths.length === 0) { - frameAnimationData[i].depth = 0; - depths[0] = frameAnimationData[i]; - } else { - let index: number = 0; - let isContinue: boolean = true; - while (isContinue) { - if (isIntersect(depths[index], frameAnimationData[i])) { - if (depths[index + unitIndex] === undefined || !depths[index + unitIndex]) { - frameAnimationData[i].depth = index + unitIndex; - depths[index + unitIndex] = frameAnimationData[i]; - isContinue = false; - } - } else { - frameAnimationData[i].depth = index; - depths[index] = frameAnimationData[i]; - isContinue = false; - } - index++; - } - } - } - } let frameAnimationRow = TraceRow.skeleton(); let unitIndex: number = 1; let unitHeight: number = 20; - let max: number = Math.max(...frameAnimationData.map((it) => it.depth || 0)) + unitIndex; - let maxHeight: number = max * unitHeight; frameAnimationRow.rowId = 'Animation'; frameAnimationRow.rowType = TraceRow.ROW_TYPE_FRAME_ANIMATION; frameAnimationRow.rowHidden = !processRow.expansion; frameAnimationRow.rowParentId = processRow.rowId; frameAnimationRow.style.width = '100%'; frameAnimationRow.name = 'Animation'; - frameAnimationRow.style.height = `${maxHeight}px`; - frameAnimationRow.setAttribute('height', `${maxHeight}`); frameAnimationRow.addTemplateTypes('AnimationEffect'); frameAnimationRow.setAttribute('children', ''); - frameAnimationRow.supplier = (): Promise => - new Promise((resolve) => { - resolve(frameAnimationData); + let timeRangeData = await queryAnimationTimeRangeData(); + timeRangeData.forEach((rangeTime) => { + if (rangeTime.status === 'Completion delay') { + animationRanges.push({ + start: rangeTime.startTs, + end: rangeTime.endTs, + }); + } + }); + let animationIdNameMap: Map = new Map(); + let animationIdInfoMap: Map = new Map(); + let animationNameData = await queryAnimationIdAndNameData(); + animationNameData.forEach((item) => { + animationIdNameMap.set(item.id, item.name); + animationIdInfoMap.set(item.id, item.info); + }); + frameAnimationRow.supplierFrame = () => { + return frameAnimationSender(frameAnimationRow).then((result) => { + let maxDepth = 0; + result.forEach((item) => { + if (item.status == '1') { + item.status = 'Completion delay'; + } else { + item.status = 'Response delay'; + } + if (item.depth > maxDepth) { + maxDepth = item.depth; + } + if (animationIdNameMap.has(item.animationId!)) { + item.name = animationIdNameMap.get(item.animationId!); + item.frameInfo = item.status == 'Completion delay' ? animationIdInfoMap.get(item.animationId!) : '0'; + } + }); + let maxHeight: number = (maxDepth + unitIndex) * unitHeight; + frameAnimationRow.style.height = `${maxHeight}px`; + frameAnimationRow.setAttribute('height', `${maxHeight}`); + return result; }); + }; frameAnimationRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; frameAnimationRow.selectChangeHandler = this.trace.selectChangeHandler; frameAnimationRow.onThreadHandler = (useCache): void => { @@ -342,18 +365,18 @@ export class SpFrameTimeChart { }, frameAnimationRow! ); - frameAnimationRow!.canvasRestore(context); + frameAnimationRow!.canvasRestore(context, this.trace); }; processRow.addChildTraceRowBefore(frameAnimationRow, firstRow); return animationRanges; } async initDynamicCurveChart( + appNameMap: Map, frameChart: TraceRow, name: string, animationRanges: AnimationRanges[] ): Promise { - let frameDynamicCurveData: FrameDynamicStruct[] = await queryFrameDynamicData(); let systemConfigList: { name: string; }[] = [{ name: 'x' }, { name: 'y' }, { name: 'width' }, { name: 'height' }, { name: 'alpha' }]; @@ -375,10 +398,16 @@ export class SpFrameTimeChart { dynamicCurveRow.setAttribute('children', ''); dynamicCurveRow.setAttribute('model-type', systemConfigList[0].name); dynamicCurveRow.setAttribute('model-name', name); - dynamicCurveRow.supplier = (): Promise => - new Promise((resolve): void => { - resolve(frameDynamicCurveData); + dynamicCurveRow.supplierFrame = () => { + return frameDynamicSender(dynamicCurveRow).then((result) => { + result.forEach((dataItem) => { + if (appNameMap.has(dataItem.id!)) { + dataItem.appName = appNameMap.get(dataItem.id!); + } + }); + return result; }); + }; dynamicCurveRow.selectChangeHandler = this.trace.selectChangeHandler; dynamicCurveRow.onThreadHandler = (useCache: boolean): void => { let context: CanvasRenderingContext2D = dynamicCurveRow!.collect @@ -394,27 +423,20 @@ export class SpFrameTimeChart { }, dynamicCurveRow! ); - dynamicCurveRow!.canvasRestore(context); + dynamicCurveRow!.canvasRestore(context, this.trace); }; frameChart.addChildTraceRow(dynamicCurveRow); } async initFrameSpacing( + appNameMap: Map, nameArr: { name: string }[], frameChart: TraceRow, name: string, animationRanges: AnimationRanges[] ): Promise { - let frameData: FrameSpacingStruct[] = await queryFrameSpacing(); let deviceStructArray = await queryPhysicalData(); let deviceStruct: DeviceStruct = deviceStructArray[0]; - let frameResultData: FrameSpacingStruct[] = []; - for (let index = 0; index < nameArr.length; index++) { - let appName: string = nameArr[index].name; - let filterData = frameData.filter((spacingData) => spacingData.nameId === appName); - this.dataProcessing(filterData, deviceStruct); - frameResultData.push(...filterData); - } let frameSpacingRow = TraceRow.skeleton(); frameSpacingRow.rowId = 'frame spacing'; frameSpacingRow.rowType = TraceRow.ROW_TYPE_FRAME_SPACING; @@ -427,10 +449,22 @@ export class SpFrameTimeChart { frameSpacingRow.setAttribute('height', '140'); frameSpacingRow.setAttribute('children', ''); frameSpacingRow.setAttribute('model-name', name); - frameSpacingRow.supplier = (): Promise => - new Promise((resolve): void => { - resolve(frameResultData); + let physicalConfigWidth = Number(this.flagConfig!.physicalWidth); + let physicalConfigHeight = Number(this.flagConfig!.physicalHeight); + let physicalWidth = physicalConfigWidth !== 0 ? physicalConfigWidth : deviceStruct.physicalWidth; + let physicalHeight = physicalConfigHeight !== 0 ? physicalConfigHeight : deviceStruct.physicalHeight; + frameSpacingRow.supplierFrame = () => { + return frameSpacingSender(physicalWidth, physicalHeight, frameSpacingRow).then((result) => { + result.forEach((dataItem) => { + if (appNameMap.has(dataItem.id!)) { + dataItem.nameId = appNameMap.get(dataItem.id!); + } + dataItem.physicalWidth = physicalWidth; + dataItem.physicalHeight = physicalHeight; + }); + return result; }); + }; frameSpacingRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; frameSpacingRow.selectChangeHandler = this.trace.selectChangeHandler; frameSpacingRow.onThreadHandler = (useCache: boolean): void => { @@ -446,47 +480,11 @@ export class SpFrameTimeChart { }, frameSpacingRow! ); - frameSpacingRow!.canvasRestore(context); + frameSpacingRow!.canvasRestore(context, this.trace); }; frameChart.addChildTraceRow(frameSpacingRow); } - dataProcessing(frameData: FrameSpacingStruct[], deviceStruct: DeviceStruct): void { - let unitIndex: number = 1; - let secondToNanosecond: number = 1000_000_000; - let physicalWidth = Number(this.flagConfig!.physicalWidth); - let physicalHeight = Number(this.flagConfig!.physicalHeight); - FrameSpacingStruct.physicalWidth = physicalWidth !== 0 ? physicalWidth : deviceStruct.physicalWidth; - FrameSpacingStruct.physicalHeight = physicalHeight !== 0 ? physicalHeight : deviceStruct.physicalHeight; - for (let index = 0; index < frameData.length; index++) { - if (index > 0) { - let intervalTime = (frameData[index].currentTs - frameData[index - unitIndex].currentTs) / secondToNanosecond; - let widthDifference = frameData[index].currentFrameWidth! - frameData[index - unitIndex].currentFrameWidth!; - let heightDifference = frameData[index].currentFrameHeight! - frameData[index - unitIndex].currentFrameHeight!; - let xDifference = frameData[index].x! - frameData[index - unitIndex].x!; - let yDifference = frameData[index].y! - frameData[index - unitIndex].y!; - let frameWidth = Math.abs(widthDifference / FrameSpacingStruct.physicalWidth / intervalTime); - let frameHeight = Math.abs(heightDifference / FrameSpacingStruct.physicalHeight / intervalTime); - let frameX = Math.abs(xDifference / FrameSpacingStruct.physicalWidth / intervalTime); - let frameY = Math.abs(yDifference / FrameSpacingStruct.physicalHeight / intervalTime); - let result = Math.max(frameWidth, frameHeight, frameX, frameY); - frameData[index].frameSpacingResult = Number(result.toFixed(unitIndex)); - frameData[index].preTs = frameData[index - unitIndex].currentTs; - frameData[index].preFrameWidth = frameData[index - unitIndex].currentFrameWidth; - frameData[index].preFrameHeight = frameData[index - unitIndex].currentFrameHeight; - frameData[index].preX = frameData[index - unitIndex].x; - frameData[index].preY = frameData[index - unitIndex].y; - } else { - frameData[index].frameSpacingResult = 0; - frameData[index].preTs = 0; - frameData[index].preFrameWidth = 0; - frameData[index].preFrameHeight = 0; - frameData[index].preX = 0; - frameData[index].preY = 0; - } - } - } - addSystemConfigButton( systemTraceRow: TraceRow, systemConfigList: { name: string }[], @@ -619,82 +617,4 @@ export class SpFrameTimeChart { }, refreshTime); return offsetYTimeOut; } - - private async getExpectedFrameDate(): Promise { - let frameExpectedData = await queryExpectedFrameDate(); - if (frameExpectedData.length > 0) { - let unitIndex: number = 1; - let isIntersect = (a: JanksStruct, b: JanksStruct): boolean => - Math.max(a.ts! + a.dur!, b.ts! + b.dur!) - Math.min(a.ts!, b.ts!) < a.dur! + b.dur!; - let depths = []; - for (let i: number = 0; i < frameExpectedData.length; i++) { - let it = frameExpectedData[i]; - if (!it.dur || it.dur < 0) { - continue; - } - if (depths.length === 0) { - it.depth = 0; - depths[0] = it; - } else { - let index: number = 0; - let isContinue: boolean = true; - while (isContinue) { - if (isIntersect(depths[index], it)) { - if (depths[index + unitIndex] === undefined || !depths[index + unitIndex]) { - it.depth = index + unitIndex; - depths[index + unitIndex] = it; - isContinue = false; - } - } else { - it.depth = index; - depths[index] = it; - isContinue = false; - } - index++; - } - } - } - } - return frameExpectedData; - } - - private async getActualFrameDate(): Promise { - let frameActualData = await queryActualFrameDate(); - if (frameActualData.length > 0) { - let unitIndex: number = 1; - let isIntersect = (leftStruct: JanksStruct, rightStruct: JanksStruct): boolean => - Math.max(leftStruct.ts! + leftStruct.dur!, rightStruct.ts! + rightStruct.dur!) - - Math.min(leftStruct.ts!, rightStruct.ts!) < - leftStruct.dur! + rightStruct.dur!; - let depthArray = []; - for (let index: number = 0; index < frameActualData.length; index++) { - let it = frameActualData[index]; - if (!it.dur || it.dur < 0) { - continue; - } - if (depthArray.length === 0) { - it.depth = 0; - depthArray[0] = it; - } else { - let index: number = 0; - let isContinue: boolean = true; - while (isContinue) { - if (isIntersect(depthArray[index], it)) { - if (depthArray[index + unitIndex] === undefined || !depthArray[index + unitIndex]) { - it.depth = index + unitIndex; - depthArray[index + unitIndex] = it; - isContinue = false; - } - } else { - it.depth = index; - depthArray[index] = it; - isContinue = false; - } - index++; - } - } - } - } - return frameActualData; - } } diff --git a/ide/src/trace/component/chart/SpFreqChart.ts b/ide/src/trace/component/chart/SpFreqChart.ts index d70049d94..1db6aae5b 100644 --- a/ide/src/trace/component/chart/SpFreqChart.ts +++ b/ide/src/trace/component/chart/SpFreqChart.ts @@ -15,14 +15,10 @@ import { SpSystemTrace } from '../SpSystemTrace'; import { - getCpuLimitFreq, getCpuLimitFreqId, getCpuLimitFreqMax, - queryCpuCount, queryCpuFreq, - queryCpuFreqData, queryCpuMaxFreq, - queryCpuState, queryCpuStateFilter, } from '../../database/SqlLite'; import { info } from '../../../log/Log'; @@ -34,6 +30,9 @@ import { CpuFreqStruct, FreqRender } from '../../database/ui-worker/ProcedureWor import { CpuStateRender, CpuStateStruct } from '../../database/ui-worker/ProcedureWorkerCpuState'; import { FolderSupplier, FolderThreadHandler } from './SpChartManager'; import { Utils } from '../trace/base/Utils'; +import { cpuFreqDataSender } from '../../database/data-trafic/CpuFreqDataSender'; +import { cpuStateSender } from '../../database/data-trafic/CpuStateSender'; +import { cpuFreqLimitSender } from '../../database/data-trafic/CpuFreqLimitDataSender'; export class SpFreqChart { private trace: SpSystemTrace; private folderRow: TraceRow | undefined; @@ -45,21 +44,11 @@ export class SpFreqChart { } async init() { - let cpuCount = await queryCpuCount(); - let cpuState = await queryCpuState(cpuCount.length); - let freCpu = await queryCpuFreqData(cpuCount.length); - let cpuFreqStartTime = new Date().getTime(); let freqList = await queryCpuFreq(); let cpuStateFilterIds = await queryCpuStateFilter(); let cpuFreqLimits = await getCpuLimitFreqId(); - let cpuFreqLimitsMax = await getCpuLimitFreqMax( - cpuFreqLimits - .map((limit) => { - return limit.maxFilterId; - }) - .join(',') - ); - if (freCpu.length > 0) { + let cpuFreqLimitsMax = await getCpuLimitFreqMax(cpuFreqLimits.map((limit) => limit.maxFilterId).join(',')); + if (freqList.length > 0) { this.folderRow = TraceRow.skeleton(); this.folderRow.rowId = 'Cpu Frequency'; this.folderRow.rowParentId = ''; @@ -91,7 +80,9 @@ export class SpFreqChart { traceRow.name = `Cpu ${it.cpu} Frequency`; traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; traceRow.selectChangeHandler = this.trace.selectChangeHandler; - traceRow.supplier = () => queryCpuFreqData(it.cpu); + traceRow.supplierFrame = () => { + return cpuFreqDataSender(it.cpu, traceRow); //queryCpuFreqData + }; traceRow.focusHandler = (ev) => { this.trace?.displayTip( traceRow, @@ -100,7 +91,7 @@ export class SpFreqChart { ); }; traceRow.findHoverStruct = () => { - CpuFreqStruct.hoverCpuFreqStruct = traceRow.getHoverStruct(); + CpuFreqStruct.hoverCpuFreqStruct = traceRow.getHoverStruct(true,false, 'value'); }; traceRow.onThreadHandler = (useCache) => { let context: CanvasRenderingContext2D; @@ -118,7 +109,7 @@ export class SpFreqChart { }, traceRow ); - traceRow.canvasRestore(context); + traceRow.canvasRestore(context, this.trace); }; this.trace.rowsEL?.appendChild(traceRow); this.folderRow!.addChildTraceRow(traceRow); @@ -139,7 +130,6 @@ export class SpFreqChart { this.folderRowState.onThreadHandler = FolderThreadHandler(this.folderRowState, this.trace); this.trace.rowsEL?.appendChild(this.folderRowState); - let heights = [4, 12, 21, 30]; for (let it of cpuStateFilterIds) { let cpuStateRow = TraceRow.skeleton(); cpuStateRow.rowId = `${it.filterId}`; @@ -150,14 +140,14 @@ export class SpFreqChart { cpuStateRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; cpuStateRow.selectChangeHandler = this.trace.selectChangeHandler; cpuStateRow.isHover = true; - cpuStateRow.supplier = () => - queryCpuState(it.filterId).then((res) => { - res.forEach((r) => { - r.height = heights[it.value]; - r.cpu = it.cpu; + cpuStateRow.supplierFrame = () => { + return cpuStateSender(it.filterId, cpuStateRow).then((rs) => { + rs.forEach((t) => { + t.cpu = it.cpu; }); - return res; + return rs; }); + }; cpuStateRow.focusHandler = (ev) => { this.trace.displayTip( cpuStateRow, @@ -185,7 +175,7 @@ export class SpFreqChart { }, cpuStateRow ); - cpuStateRow.canvasRestore(context); + cpuStateRow.canvasRestore(context, this.trace); }; this.folderRowState!.addChildTraceRow(cpuStateRow); } @@ -204,8 +194,6 @@ export class SpFreqChart { this.folderRowLimit.onThreadHandler = FolderThreadHandler(this.folderRowLimit, this.trace); this.trace.rowsEL?.appendChild(this.folderRowLimit); - let durTime = new Date().getTime() - cpuFreqStartTime; - info('The time to load the CpuFreq data is: ', durTime); for (let limit of cpuFreqLimits) { let findMax = Utils.getFrequencyWithUnit( cpuFreqLimitsMax.find((maxLimit) => { @@ -220,8 +208,18 @@ export class SpFreqChart { cpuFreqLimitRow.name = `Cpu ${limit.cpu} Freq Limit`; cpuFreqLimitRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; cpuFreqLimitRow.selectChangeHandler = this.trace.selectChangeHandler; + cpuFreqLimitRow.setAttribute('maxFilterId', `${limit.maxFilterId}`); + cpuFreqLimitRow.setAttribute('minFilterId', `${limit.minFilterId}`); + cpuFreqLimitRow.setAttribute('cpu', `${limit.cpu}`); cpuFreqLimitRow.isHover = true; - cpuFreqLimitRow.supplier = () => getCpuLimitFreq(limit.maxFilterId, limit.minFilterId, limit.cpu); + cpuFreqLimitRow.supplierFrame = () => { + return cpuFreqLimitSender(limit.maxFilterId, limit.minFilterId, limit.cpu, cpuFreqLimitRow).then((res) => { + res.forEach((item) => { + item.cpu = limit.cpu; + }); + return res; + }); + }; cpuFreqLimitRow.focusHandler = (ev) => { this.trace.displayTip( cpuFreqLimitRow, @@ -255,7 +253,7 @@ export class SpFreqChart { }, cpuFreqLimitRow ); - cpuFreqLimitRow.canvasRestore(context); + cpuFreqLimitRow.canvasRestore(context, this.trace); }; this.folderRowLimit!.addChildTraceRow(cpuFreqLimitRow); } diff --git a/ide/src/trace/component/chart/SpHiPerf.ts b/ide/src/trace/component/chart/SpHiPerf.ts index 5dcdcffa8..3b12a39f4 100644 --- a/ide/src/trace/component/chart/SpHiPerf.ts +++ b/ide/src/trace/component/chart/SpHiPerf.ts @@ -40,6 +40,17 @@ import { type HiPerfReportStruct } from '../../database/ui-worker/ProcedureWorke import { SpChartManager } from './SpChartManager'; import { procedurePool } from '../../database/Procedure'; import { HiPerfChartFrame } from '../../bean/PerfStruct'; +import { HiperfCpuRender2 } from '../../database/ui-worker/ProcedureWorkerHiPerfCPU2'; +import { hiperfCpuDataSender } from '../../database/data-trafic/HiperfCpuDataSender'; +import { hiperfProcessDataSender } from '../../database/data-trafic/HiperfProcessDataSender'; +import { HiperfProcessRender2 } from '../../database/ui-worker/ProcedureWorkerHiPerfProcess2'; +import { hiperfThreadDataSender } from '../../database/data-trafic/HiperfThreadDataSender'; +import { HiperfThreadRender2 } from '../../database/ui-worker/ProcedureWorkerHiPerfThread2'; +import { + hiperfCallChartDataCacheSender, + hiperfCallChartDataSender, + hiperfCallStackCacheSender, +} from '../../database/data-trafic/HiperfCallChartSender'; export interface ResultData { existA: boolean | null | undefined; @@ -93,7 +104,7 @@ export class SpHiPerf { } getStringResult(s: string = '') { - let list = s.split(' ').filter((e) => e); + let list = s.split(' '); let sA = list.findIndex((item) => item == '-a'); let sF = list.findIndex((item) => item == '-f'); SpHiPerf.stringResult = { @@ -149,18 +160,16 @@ export class SpHiPerf { row.childrenList.forEach((child) => { if (child.drawType !== drawType) { child.drawType = drawType; - if (child.rowType === TraceRow.ROW_TYPE_PERF_CALLCHART) { - this.resetChartData(child); - } else { - child.drawType = drawType; - child.dataList2 = []; - child.childrenList.forEach((sz) => { - sz.drawType = drawType; - sz.dataList2 = []; - }); - } + child.needRefresh = true; + child.isComplete = false; + child.childrenList.forEach((sz) => { + sz.drawType = drawType; + sz.isComplete = false; + sz.needRefresh = true; + }); } }); + TraceRow.range!.refresh = true; this.trace.refreshCanvas(false); } }; @@ -192,13 +201,15 @@ export class SpHiPerf { row ); } - row.canvasRestore(this.trace.canvasPanelCtx!); + row.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; this.rowFolder = row; this.trace.rowsEL?.appendChild(row); } async initCallChart() { + await hiperfCallStackCacheSender(); + await hiperfCallChartDataCacheSender(); let perfCallCutRow = TraceRow.skeleton(); perfCallCutRow.rowId = `HiPerf-callchart`; perfCallCutRow.index = 0; @@ -217,36 +228,45 @@ export class SpHiPerf { perfCallCutRow.focusHandler = (): void => { let hoverStruct = HiPerfCallChartStruct.hoverPerfCallCutStruct; if (hoverStruct) { - let selfDur = hoverStruct?.totalTime || 0; - hoverStruct?.children?.forEach((child) => { - selfDur -= child.totalTime; - }); - let callName = ''; - if(typeof hoverStruct.name === 'number'){ - callName = SpSystemTrace.DATA_DICT.get(hoverStruct.name as number) || ''; - } else { - callName = HiPerfCallChartStruct.hoverPerfCallCutStruct?.name as string || ''; - } - callName = callName!.replace(//g, '>'); + let callName = hoverStruct.name; + callName = callName.replace(//g, '>'); this.trace?.displayTip( perfCallCutRow!, - HiPerfCallChartStruct.hoverPerfCallCutStruct, + hoverStruct, `Name: ${callName}
Lib: ${perfDataQuery.getLibName(hoverStruct!.fileId, hoverStruct!.symbolId)}
Self Time: - ${Utils.getProbablyTime(selfDur || 0)}
+ ${Utils.getProbablyTime(hoverStruct.selfDur || 0)}
Duration: ${Utils.getProbablyTime(hoverStruct.totalTime)}
Event Count: - ${HiPerfCallChartStruct.hoverPerfCallCutStruct?.eventCount || ''}
` + ${hoverStruct.eventCount || ''}
` ); } }; - // @ts-ignore - perfCallCutRow.supplier = () => - this.getHiPerfChartData(this.callChartType, this.callChartId, this.eventTypeId, perfCallCutRow); + perfCallCutRow.supplierFrame = () => { + return hiperfCallChartDataSender(perfCallCutRow, { + startTime: window.recordStartNS, + eventTypeId: this.eventTypeId, + type: this.callChartType, + id: this.callChartId, + }).then((res) => { + let maxHeight = res.maxDepth * 20; + perfCallCutRow.funcMaxHeight = maxHeight; + if (perfCallCutRow.funcExpand) { + perfCallCutRow!.style.height = `${maxHeight}px`; + if (perfCallCutRow.collect) { + window.publish(window.SmartEvent.UI.RowHeightChange, { + expand: true, + value: perfCallCutRow.funcMaxHeight - 20, + }); + } + } + return res.dataList; + }); + }; perfCallCutRow.findHoverStruct = () => { HiPerfCallChartStruct.hoverPerfCallCutStruct = perfCallCutRow.getHoverStruct(); }; @@ -316,8 +336,9 @@ export class SpHiPerf { this.callChartType = type; this.callChartId = id; row.name = `CallChart [${nodes[0].title}]`; - this.resetChartData(row); - this.trace.refreshCanvas(false); + row.isComplete = false; + row.needRefresh = true; + row.drawFrame(); } }; row.onThreadHandler = (useCache: any) => { @@ -336,7 +357,7 @@ export class SpHiPerf { }, row ); - row.canvasRestore(context); + row.canvasRestore(context, this.trace); }; } @@ -354,7 +375,16 @@ export class SpHiPerf { cpuMergeRow.setAttribute('children', ''); cpuMergeRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; cpuMergeRow.selectChangeHandler = this.trace.selectChangeHandler; - cpuMergeRow.supplier = () => queryHiPerfCpuMergeData(); + cpuMergeRow.supplierFrame = () => { + return hiperfCpuDataSender( + -1, + cpuMergeRow.drawType, + this.maxCpuId + 1, + SpHiPerf.stringResult?.fValue || 1, + TraceRow.range?.scale || 50, + cpuMergeRow + ); + }; cpuMergeRow.focusHandler = () => this.hoverTip(cpuMergeRow, HiPerfCpuStruct.hoverStruct); cpuMergeRow.findHoverStruct = () => { HiPerfCpuStruct.hoverStruct = cpuMergeRow.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); @@ -367,7 +397,7 @@ export class SpHiPerf { context = cpuMergeRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } cpuMergeRow.canvasSave(context); - (renders['HiPerf-Cpu'] as HiperfCpuRender).renderMainThread( + (renders['HiPerf-Cpu-2'] as HiperfCpuRender2).renderMainThread( { context: context, useCache: useCache, @@ -379,7 +409,7 @@ export class SpHiPerf { }, cpuMergeRow ); - cpuMergeRow.canvasRestore(context); + cpuMergeRow.canvasRestore(context, this.trace); }; this.rowFolder.addChildTraceRow(cpuMergeRow); this.rowList?.push(cpuMergeRow); @@ -400,7 +430,16 @@ export class SpHiPerf { perfCpuRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; perfCpuRow.selectChangeHandler = this.trace.selectChangeHandler; perfCpuRow.style.height = '40px'; - perfCpuRow.supplier = () => queryHiPerfCpuData(i); + perfCpuRow.supplierFrame = () => { + return hiperfCpuDataSender( + i, + perfCpuRow.drawType, + this.maxCpuId + 1, + SpHiPerf.stringResult?.fValue || 1, + TraceRow.range?.scale || 50, + perfCpuRow + ); + }; perfCpuRow.focusHandler = () => this.hoverTip(perfCpuRow, HiPerfCpuStruct.hoverStruct); perfCpuRow.findHoverStruct = () => { HiPerfCpuStruct.hoverStruct = perfCpuRow.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); @@ -413,7 +452,7 @@ export class SpHiPerf { context = perfCpuRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } perfCpuRow.canvasSave(context); - (renders['HiPerf-Cpu'] as HiperfCpuRender).renderMainThread( + (renders['HiPerf-Cpu-2'] as HiperfCpuRender2).renderMainThread( { context: context, useCache: useCache, @@ -425,7 +464,7 @@ export class SpHiPerf { }, perfCpuRow ); - perfCpuRow.canvasRestore(context); + perfCpuRow.canvasRestore(context, this.trace); }; this.rowFolder.addChildTraceRow(perfCpuRow); this.rowList?.push(perfCpuRow); @@ -433,103 +472,123 @@ export class SpHiPerf { } async initProcess() { - Reflect.ownKeys(this.group).forEach((key, index) => { - let array = this.group[key] as Array; - let process = array.filter((th) => th.pid === th.tid)[0]; - let row = TraceRow.skeleton(); - row.rowId = `${process.pid}-Perf-Process`; - row.index = index; - row.rowType = TraceRow.ROW_TYPE_HIPERF_PROCESS; - row.rowParentId = 'HiPerf'; - row.rowHidden = !this.rowFolder.expansion; - row.folder = true; - row.drawType = -2; - if (SpChartManager.APP_STARTUP_PID_ARR.find((pid) => pid === process.pid) !== undefined) { - row.addTemplateTypes('AppStartup'); - } - row.addTemplateTypes('HiPerf'); - row.name = `${process.processName || 'Process'} [${process.pid}]`; - row.folderPaddingLeft = 6; - row.style.height = '40px'; - row.favoriteChangeHandler = this.trace.favoriteChangeHandler; - row.selectChangeHandler = this.trace.selectChangeHandler; - row.supplier = () => queryHiPerfProcessData(process.pid); - row.focusHandler = () => this.hoverTip(row, HiPerfProcessStruct.hoverStruct); - row.findHoverStruct = () => { - HiPerfProcessStruct.hoverStruct = row.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); - }; - row.onThreadHandler = (useCache) => { - let context: CanvasRenderingContext2D; - if (row.currentContext) { - context = row.currentContext; - } else { - context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + Reflect.ownKeys(this.group) + .filter((it) => { + return true; + }) + .forEach((key, index) => { + let array = this.group[key] as Array; + let process = array.filter((th) => th.pid === th.tid)[0]; + let row = TraceRow.skeleton(); + row.rowId = `${process.pid}-Perf-Process`; + row.index = index; + row.rowType = TraceRow.ROW_TYPE_HIPERF_PROCESS; + row.rowParentId = 'HiPerf'; + row.rowHidden = !this.rowFolder.expansion; + row.folder = true; + row.drawType = -2; + if (SpChartManager.APP_STARTUP_PID_ARR.find((pid) => pid === process.pid) !== undefined) { + row.addTemplateTypes('AppStartup'); } - row.canvasSave(context); - if (row.expansion) { - this.trace.canvasPanelCtx?.clearRect(0, 0, row.frame.width, row.frame.height); - } else { - (renders['HiPerf-Process'] as HiperfProcessRender).renderMainThread( - { - context: context, - useCache: useCache, - scale: TraceRow.range?.scale || 50, - type: `HiPerf-Process-${row.index}`, - intervalPerf: SpHiPerf.stringResult?.fValue || 1, - range: TraceRow.range, - }, + row.addTemplateTypes('HiPerf'); + row.name = `${process.processName || 'Process'} [${process.pid}]`; + row.folderPaddingLeft = 6; + row.style.height = '40px'; + row.favoriteChangeHandler = this.trace.favoriteChangeHandler; + row.selectChangeHandler = this.trace.selectChangeHandler; + row.supplierFrame = () => { + return hiperfProcessDataSender( + process.pid, + row.drawType, + SpHiPerf.stringResult?.fValue || 1, + TraceRow.range?.scale || 50, row ); - } - row.canvasRestore(context); - }; - this.rowFolder.addChildTraceRow(row); - this.rowList?.push(row); - array.forEach((thObj, thIdx) => { - let thread = TraceRow.skeleton(); - thread.rowId = `${thObj.tid}-Perf-Thread`; - thread.index = thIdx; - thread.rowType = TraceRow.ROW_TYPE_HIPERF_THREAD; - thread.rowParentId = row.rowId; - thread.rowHidden = !row.expansion; - thread.folder = false; - thread.drawType = -2; - thread.name = `${thObj.threadName || 'Thread'} [${thObj.tid}]`; - thread.setAttribute('children', ''); - thread.folderPaddingLeft = 0; - thread.style.height = '40px'; - thread.favoriteChangeHandler = this.trace.favoriteChangeHandler; - thread.selectChangeHandler = this.trace.selectChangeHandler; - thread.supplier = () => queryHiPerfThreadData(thObj.tid); - thread.focusHandler = () => this.hoverTip(thread, HiPerfThreadStruct.hoverStruct); - thread.findHoverStruct = () => { - HiPerfThreadStruct.hoverStruct = thread.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); }; - thread.onThreadHandler = (useCache) => { + row.focusHandler = () => this.hoverTip(row, HiPerfProcessStruct.hoverStruct); + row.findHoverStruct = () => { + HiPerfProcessStruct.hoverStruct = row.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); + }; + row.onThreadHandler = (useCache) => { let context: CanvasRenderingContext2D; - if (thread.currentContext) { - context = thread.currentContext; + if (row.currentContext) { + context = row.currentContext; } else { - context = thread.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + context = row.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; } - thread.canvasSave(context); - (renders['HiPerf-Thread'] as HiperfThreadRender).renderMainThread( - { - context: context, - useCache: useCache, - scale: TraceRow.range?.scale || 50, - type: `HiPerf-Thread-${row.index}-${thread.index}`, - intervalPerf: SpHiPerf.stringResult?.fValue || 1, - range: TraceRow.range, - }, - thread - ); - thread.canvasRestore(context); + row.canvasSave(context); + if (row.expansion) { + this.trace.canvasPanelCtx?.clearRect(0, 0, row.frame.width, row.frame.height); + } else { + (renders['HiPerf-Process-2'] as HiperfProcessRender2).renderMainThread( + { + context: context, + useCache: useCache, + scale: TraceRow.range?.scale || 50, + type: `HiPerf-Process-${row.index}`, + intervalPerf: SpHiPerf.stringResult?.fValue || 1, + range: TraceRow.range, + }, + row + ); + } + row.canvasRestore(context, this.trace); }; - row.addChildTraceRow(thread); - this.rowList?.push(thread); + this.rowFolder.addChildTraceRow(row); + this.rowList?.push(row); + array.forEach((thObj, thIdx) => { + let thread = TraceRow.skeleton(); + thread.rowId = `${thObj.tid}-Perf-Thread`; + thread.index = thIdx; + thread.rowType = TraceRow.ROW_TYPE_HIPERF_THREAD; + thread.rowParentId = row.rowId; + thread.rowHidden = !row.expansion; + thread.folder = false; + thread.drawType = -2; + thread.name = `${thObj.threadName || 'Thread'} [${thObj.tid}]`; + thread.setAttribute('children', ''); + thread.folderPaddingLeft = 0; + thread.style.height = '40px'; + thread.favoriteChangeHandler = this.trace.favoriteChangeHandler; + thread.selectChangeHandler = this.trace.selectChangeHandler; + thread.supplierFrame = () => { + return hiperfThreadDataSender( + thObj.tid, + thread.drawType, + SpHiPerf.stringResult?.fValue || 1, + TraceRow.range?.scale || 50, + thread + ); + }; + thread.focusHandler = () => this.hoverTip(thread, HiPerfThreadStruct.hoverStruct); + thread.findHoverStruct = () => { + HiPerfThreadStruct.hoverStruct = thread.getHoverStruct(false, (TraceRow.range?.scale || 50) <= 30_000_000); + }; + thread.onThreadHandler = (useCache) => { + let context: CanvasRenderingContext2D; + if (thread.currentContext) { + context = thread.currentContext; + } else { + context = thread.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } + thread.canvasSave(context); + (renders['HiPerf-Thread-2'] as HiperfThreadRender2).renderMainThread( + { + context: context, + useCache: useCache, + scale: TraceRow.range?.scale || 50, + type: `HiPerf-Thread-${row.index}-${thread.index}`, + intervalPerf: SpHiPerf.stringResult?.fValue || 1, + range: TraceRow.range, + }, + thread + ); + thread.canvasRestore(context, this.trace); + }; + row.addChildTraceRow(thread); + this.rowList?.push(thread); + }); }); - }); } async getHiPerfChartData(type: number, id: number, eventTypeId: number, row: TraceRow) { @@ -611,7 +670,7 @@ export class SpHiPerf { tip = `${num * (this.maxCpuId + 1)}% (10.00ms)`; } } else { - tip = `${struct.eventCount} (10.00ms)`; + tip = `${struct.event_count || struct.eventCount} (10.00ms)`; } } else { let perfCall = perfDataQuery.callChainMap.get(struct.callchain_id || 0); diff --git a/ide/src/trace/component/chart/SpHiSysEnergyChart.ts b/ide/src/trace/component/chart/SpHiSysEnergyChart.ts index 7c0d38fd5..832f874de 100644 --- a/ide/src/trace/component/chart/SpHiSysEnergyChart.ts +++ b/ide/src/trace/component/chart/SpHiSysEnergyChart.ts @@ -20,12 +20,9 @@ import { queryEnergyEventExits, queryMaxStateValue, queryPowerData, - queryStateData, queryStateInitValue, queryEnergyAppName, - querySystemLocationData, - querySystemLockData, - querySystemSchedulerData, + querySystemAllData, } from '../../database/SqlLite'; import { info } from '../../../log/Log'; import { TraceRow } from '../trace/base/TraceRow'; @@ -37,12 +34,23 @@ import { EnergyStateStruct, EnergyStateRender } from '../../database/ui-worker/P import { renders } from '../../database/ui-worker/ProcedureWorker'; import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU'; import { TreeItemData } from '../../../base-ui/tree/LitTree'; +import { + energySysEventSender, + hiSysEnergyAnomalyDataSender, hiSysEnergyPowerSender, + hiSysEnergyStateSender +} from '../../database/data-trafic/EnergySysEventSender'; export class SpHiSysEnergyChart { static app_name: string | null; private trace: SpSystemTrace; private energyTraceRow: TraceRow | undefined; private timer: any; + private eventNameMap: Map = new Map(); + private appKeyMap: Map = new Map(); + private eventValueMap: Map = new Map(); + private powerEventNameMap: Map = new Map(); + private powerAppKeyNameMap: Map = new Map(); + private powerEventValueMap: Map = new Map(); private stateName: Array = [ 'BRIGHTNESS_NIT', 'SIGNAL_LEVEL', @@ -88,37 +96,24 @@ export class SpHiSysEnergyChart { let result = await queryEnergyEventExits(); if (result.length <= 0) return; let anomalyData = await queryAnomalyData(); - let systemData = await Promise.all([querySystemLocationData(), querySystemLockData(), querySystemSchedulerData()]); - let systemDataList: any = {}; - systemDataList[0] = this.handleLockData(systemData[1]); - systemDataList[1] = this.handleLocationData(systemData[0]); - systemDataList[2] = this.handleWorkData(systemData[2]); let powerData = await queryPowerData(); - let stateData: any = {}; - let stateDataSize: number = 0; - for (let index = 0; index < this.stateList.length; index++) { - let stateResult = await Promise.all([ - queryStateInitValue(this.stateName[index], this.initValueList[index]), - queryStateData(this.stateName[index]), - ]); - let stateInitValue = this.initValueList[index] == 'nocolumn' ? [] : stateResult[0]; - stateData[index] = stateInitValue.concat(stateResult[1]); - stateDataSize += stateData[index].length; + for (let index = 0; index < anomalyData.length; index++) { + let item = anomalyData[index]; + this.eventNameMap.set(item.id!, item.eventName ?? ''); + this.appKeyMap.set(item.id!, item.appKey ?? ''); + this.eventValueMap.set(item.id!, item.eventValue ?? ''); } - if ( - anomalyData.length > 0 || - systemDataList[0].length > 0 || - systemDataList[1].length > 0 || - systemDataList[2].length > 0 || - powerData.length > 0 || - stateDataSize > 0 - ) { - await this.initEnergyRow(); - this.initAnomaly(anomalyData); - this.initSystem(systemDataList); - this.initPower(powerData); - await this.initState(stateData); + for (let index = 0; index < powerData.length; index++) { + let item = powerData[index]; + this.powerEventNameMap.set(item.id, item.eventName ?? ''); + this.powerAppKeyNameMap.set(item.id, item.appKey ?? ''); + this.powerEventValueMap.set(item.id, item.eventValue ?? ''); } + await this.initEnergyRow(); + this.initAnomaly(); + this.initSystem(); + this.initPower(); + await this.initState(); } private initEnergyRow = async () => { @@ -181,7 +176,7 @@ export class SpHiSysEnergyChart { this.energyTraceRow! ); } - this.energyTraceRow?.canvasRestore(this.trace.canvasPanelCtx!); + this.energyTraceRow?.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; this.energyTraceRow.addEventListener('expansion-change', () => { TraceRow.range!.refresh = true; @@ -196,7 +191,7 @@ export class SpHiSysEnergyChart { this.trace.rowsEL?.appendChild(this.energyTraceRow!); }; - private initAnomaly = (anomalyData: EnergyAnomalyStruct[]): void => { + private initAnomaly = (): void => { let time = new Date().getTime(); let anomalyTraceRow = TraceRow.skeleton(); anomalyTraceRow.rowParentId = `energy`; @@ -211,7 +206,17 @@ export class SpHiSysEnergyChart { anomalyTraceRow.style.width = `100%`; anomalyTraceRow.setAttribute('children', ''); anomalyTraceRow.name = 'Anomaly Event'; - anomalyTraceRow.supplier = () => new Promise>((resolve): void => resolve(anomalyData)); + anomalyTraceRow.supplierFrame = () => { + return hiSysEnergyAnomalyDataSender(anomalyTraceRow).then((res) => { + for (let index = 0; index < res.length; index++) { + let item = res[index]; + item.eventName = this.eventNameMap.get(res[index].id!); + item.appKey = this.appKeyMap.get(res[index].id!); + item.eventValue = this.eventValueMap.get(res[index].id!); + } + return res; + }); + }; anomalyTraceRow.focusHandler = () => { this.trace?.displayTip( anomalyTraceRow, @@ -240,14 +245,14 @@ export class SpHiSysEnergyChart { }, anomalyTraceRow ); - anomalyTraceRow.canvasRestore(context); + anomalyTraceRow.canvasRestore(context, this.trace); }; this.energyTraceRow?.addChildTraceRow(anomalyTraceRow); let durTime = new Date().getTime() - time; info('The time to load the anomaly is: ', durTime); }; - private initSystem = (systemDataList: any): void => { + private initSystem = (): void => { let time = new Date().getTime(); let systemTraceRow = TraceRow.skeleton(); systemTraceRow.rowParentId = `energy`; @@ -262,13 +267,17 @@ export class SpHiSysEnergyChart { systemTraceRow.style.width = `100%`; systemTraceRow.setAttribute('children', ''); systemTraceRow.name = 'System Event'; - systemTraceRow.supplier = () => new Promise>((resolve): void => resolve(systemDataList)); + systemTraceRow.supplierFrame = () => { + return energySysEventSender(systemTraceRow).then((res) => { + return res; + }); + }; systemTraceRow.focusHandler = () => { this.trace?.displayTip( systemTraceRow, EnergySystemStruct.hoverEnergySystemStruct, `
-
WORKSCHEDULER:
${ +
WORKSCHEDULER:
${ EnergySystemStruct.hoverEnergySystemStruct?.workScheduler! || 0 }
POWER_RUNNINGLOCK:
${ @@ -299,157 +308,14 @@ export class SpHiSysEnergyChart { }, systemTraceRow ); - systemTraceRow.canvasRestore(context); + systemTraceRow.canvasRestore(context, this.trace); }; this.energyTraceRow?.addChildTraceRow(systemTraceRow); let durTime = new Date().getTime() - time; info('The time to load the Ability Memory is: ', durTime); }; - private handleLocationData( - result: Array<{ - ts: string; - eventName: string; - appKey: string; - Value: string; - }> - ) { - let locationIndex = -1; - let locationCount = 0; - let locationData: any[] = []; - result.forEach((item: any) => { - let da: any = {}; - if (item.Value == 'stop') { - if (locationIndex == -1) { - da.startNs = 0; - da.count = 1; - } else { - da.startNs = item.ts; - locationCount--; - da.count = locationCount; - } - da.state = 'stop'; - } else { - da.startNs = item.ts; - locationCount++; - da.count = locationCount; - da.state = 'start'; - } - locationIndex = 0; - da.type = 2; - locationData.push(da); - }); - return locationData; - } - - private handleLockData( - result: Array<{ - ts: string; - eventName: string; - appKey: string; - Value: string; - }> - ) { - let lockCount = 0; - let tokedIds: Array = []; - let lockData: any[] = []; - result.forEach((item: any) => { - let running: any = {}; - let split = item.Value.split(','); - if (item.Value.indexOf('ADD') > -1) { - running.startNs = item.ts; - lockCount++; - running.count = lockCount; - running.token = split[0].split('=')[1]; - running.type = 1; - tokedIds.push(running.token); - lockData.push(running); - } else { - running.startNs = item.ts; - let toked = split[0].split('=')[1]; - let number = tokedIds.indexOf(toked); - if (number > -1) { - lockCount--; - running.count = lockCount; - running.token = split[0].split('=')[1]; - running.type = 1; - lockData.push(running); - delete tokedIds[number]; - } - } - }); - - return lockData; - } - - private handleWorkData(workDataArray: Array) { - let workCountMap: Map = new Map(); - let nameIdMap: Map> = new Map(); - let workData: any[] = []; - for (let i = 0; i < workDataArray.length; i++) { - let dd: any = {}; - let item = workDataArray[i]; - let keys = item.appKey.split(','); - let values = item.Value.split(','); - for (let j = 0; j < keys.length; j++) { - let key = keys[j]; - switch (key) { - case 'NAME': - dd.appName = values[j]; - break; - case 'WORKID': - dd.workId = values[j]; - break; - } - } - if (item.eventName == 'WORK_START') { - let nameIdList = nameIdMap.get(dd.appName); - let workCount = 0; - if (nameIdList == undefined) { - workCount = 1; - nameIdMap.set(dd.appName, [dd.workId]); - } else { - nameIdList.push(dd.workId); - workCount = nameIdList.length; - } - let count = workCountMap.get(dd.appName); - if (count == undefined) { - workCountMap.set(dd.appName, 1); - } else { - workCountMap.set(dd.appName, count + 1); - } - dd.startNs = item.ts; - dd.count = workCount; - dd.type = 0; - workData.push(dd); - } else if (item.eventName == 'WORK_STOP') { - let nameIdList: any = nameIdMap.get(dd.appName); - let index = nameIdList.indexOf(dd.workId); - if (nameIdList != undefined && index > -1) { - delete nameIdList[index]; - let workCount = workCountMap.get(dd.appName); - if (workCount != undefined) { - workCount = workCount - 1; - workCountMap.set(dd.appName, workCount); - dd.startNs = item.startNS; - dd.count = workCount; - dd.type = 0; - workData.push(dd); - } - } - } - } - return workData; - } - - private initPower = ( - powerData: Array<{ - startNS: number; - eventName: string; - appKey: string; - eventValue: string; - }> - ): void => { + private initPower = (): void => { let time = new Date().getTime(); let powerTraceRow = TraceRow.skeleton(); powerTraceRow.rowParentId = `energy`; @@ -464,9 +330,16 @@ export class SpHiSysEnergyChart { powerTraceRow.style.width = `100%`; powerTraceRow.setAttribute('children', ''); powerTraceRow.name = 'Power'; - powerTraceRow.supplier = () => this.getPowerData(powerData); - powerTraceRow.findHoverStruct = () => { - EnergyPowerStruct.hoverEnergyPowerStruct = powerTraceRow.getHoverStruct(); + powerTraceRow.supplierFrame = () => { + return hiSysEnergyPowerSender(powerTraceRow).then((res) => { + for (let index = 0; index < res.length; index++) { + let item = res[index]; + item.eventName = this.powerEventNameMap.get(res[index].id!); + item.appKey = this.powerAppKeyNameMap.get(res[index].id!); + item.eventValue = this.powerEventValueMap.get(res[index].id!); + } + return this.getPowerData(res); + }); }; powerTraceRow.focusHandler = () => { this.trace?.displayTip( @@ -520,7 +393,7 @@ export class SpHiSysEnergyChart { }, powerTraceRow! ); - powerTraceRow!.canvasRestore(context); + powerTraceRow!.canvasRestore(context, this.trace); }; this.energyTraceRow?.addChildTraceRow(powerTraceRow); let durTime = new Date().getTime() - time; @@ -580,9 +453,10 @@ export class SpHiSysEnergyChart { return Object.values(powerDataMap); } - private initState = async (stateData: any) => { + private initState = async () => { let time = new Date().getTime(); for (let index = 0; index < this.stateList.length; index++) { + let stateResult = await queryStateInitValue(this.stateName[index], this.initValueList[index]); let maxStateData = await queryMaxStateValue(this.stateName[index]); if (!maxStateData[0]) { continue; @@ -595,7 +469,13 @@ export class SpHiSysEnergyChart { } else { maxStateTotal = 'disable'; } - } + } else if(statType.includes('sensor')) { + if (statType.includes('enable')) { + maxStateTotal = 'enable'; + } else { + maxStateTotal = 'disable'; + } + } let stateTraceRow = TraceRow.skeleton(); stateTraceRow.rowParentId = `energy`; stateTraceRow.rowHidden = true; @@ -607,9 +487,15 @@ export class SpHiSysEnergyChart { stateTraceRow.style.width = `100%`; stateTraceRow.setAttribute('children', ''); stateTraceRow.name = `${this.stateList[index]}`; - stateTraceRow.supplier = () => new Promise>((resolve): void => resolve(stateData[index])); - stateTraceRow.findHoverStruct = () => { - EnergyStateStruct.hoverEnergyStateStruct = stateTraceRow.getHoverStruct(); + stateTraceRow.supplierFrame = () => { + return hiSysEnergyStateSender(this.stateName, index, stateTraceRow).then((res) => { + let stateInitValue = this.initValueList[index] == 'nocolumn' ? [] : stateResult; + for (let i = 0; i < res.length; i++) { + let item = res[i]; + item.type = this.stateName[index]; + } + return stateInitValue.concat(res); + }); }; stateTraceRow.focusHandler = () => { let tip = ''; @@ -623,7 +509,7 @@ export class SpHiSysEnergyChart { )}`; } } else { - tip = `value: ${EnergyStateStruct.hoverEnergyStateStruct?.value || 0}`; + tip = `value: ${EnergyStateStruct.hoverEnergyStateStruct?.value?.toFixed(2) || 0}`; } this.trace?.displayTip(stateTraceRow, EnergyStateStruct.hoverEnergyStateStruct, tip); }; @@ -647,7 +533,7 @@ export class SpHiSysEnergyChart { }, stateTraceRow ); - stateTraceRow.canvasRestore(context); + stateTraceRow.canvasRestore(context, this.trace); }; this.energyTraceRow?.addChildTraceRow(stateTraceRow); let durTime = new Date().getTime() - time; diff --git a/ide/src/trace/component/chart/SpHiSysEventChart.ts b/ide/src/trace/component/chart/SpHiSysEventChart.ts index 25caff862..eb6b45e27 100644 --- a/ide/src/trace/component/chart/SpHiSysEventChart.ts +++ b/ide/src/trace/component/chart/SpHiSysEventChart.ts @@ -17,6 +17,7 @@ import { SpSystemTrace } from '../SpSystemTrace'; import { TraceRow } from '../trace/base/TraceRow'; import { renders } from '../../database/ui-worker/ProcedureWorker'; import { HiSysEventRender, HiSysEventStruct } from '../../database/ui-worker/ProcedureWorkerHiSysEvent'; +import { hiSysEventDataSender } from '../../database/data-trafic/HiSysEventDataSender'; import { queryHiSysEventData } from '../../database/SqlLite'; export class SpHiSysEventChart { @@ -31,24 +32,25 @@ export class SpHiSysEventChart { if (hiSysEventData.length === 0) { return; } - let eventRow = await this.initRow(hiSysEventData); + let eventRow = await this.initRow(); this.trace.rowsEL?.appendChild(eventRow); } - async initRow(hiSysEventData: HiSysEventStruct[]): Promise> { + + async initRow(): Promise> { let hiSysEventRow = TraceRow.skeleton(); hiSysEventRow.rowParentId = ''; hiSysEventRow.rowId = 'Hisysevent'; hiSysEventRow.rowType = TraceRow.ROW_TYPE_HI_SYSEVENT; hiSysEventRow.name = 'Hisysevent'; hiSysEventRow.style.width = '100%'; - hiSysEventRow.style.height = '40px'; - hiSysEventRow.setAttribute('height', '40'); + hiSysEventRow.style.height = `40px`; + hiSysEventRow.setAttribute('height', `40px`); hiSysEventRow.setAttribute('children', ''); - hiSysEventRow.dataList = hiSysEventData; - hiSysEventRow.supplier = (): Promise => - new Promise((resolve): void => { - resolve(hiSysEventData); + hiSysEventRow.supplierFrame = () => { + return hiSysEventDataSender(hiSysEventRow).then((res) => { + return res; }); + }; hiSysEventRow.addTemplateTypes('HiSysEvent'); hiSysEventRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; hiSysEventRow.selectChangeHandler = this.trace.selectChangeHandler; @@ -68,7 +70,7 @@ export class SpHiSysEventChart { }, hiSysEventRow! ); - hiSysEventRow!.canvasRestore(context); + hiSysEventRow!.canvasRestore(context, this.trace); }; return hiSysEventRow; } diff --git a/ide/src/trace/component/chart/SpIrqChart.ts b/ide/src/trace/component/chart/SpIrqChart.ts index 87ec79aa8..b30b09947 100644 --- a/ide/src/trace/component/chart/SpIrqChart.ts +++ b/ide/src/trace/component/chart/SpIrqChart.ts @@ -15,14 +15,16 @@ import { SpSystemTrace } from '../SpSystemTrace'; import { TraceRow } from '../trace/base/TraceRow'; -import { queryIrqData, queryIrqList } from '../../database/SqlLite'; +import { queryAllFuncNames, queryAllIrqNames, queryIrqData, queryIrqList } from '../../database/SqlLite'; import { info } from '../../../log/Log'; import { renders } from '../../database/ui-worker/ProcedureWorker'; import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU'; import { IrqRender, IrqStruct } from '../../database/ui-worker/ProcedureWorkerIrq'; +import { irqDataSender } from '../../database/data-trafic/IrqDataSender'; export class SpIrqChart { private trace: SpSystemTrace; + private irqNameMap: Map = new Map(); constructor(trace: SpSystemTrace) { this.trace = trace; @@ -39,6 +41,11 @@ export class SpIrqChart { if (irqList.length == 0) { return; } + //加载irq table所有id和name数据 + let irqNamesArray = await queryAllIrqNames(); + irqNamesArray.forEach((it) => { + this.irqNameMap.set(it.id, { ipiName: it.ipiName, name: it.name }); + }); info('irqList data size is: ', irqList!.length); this.trace.rowsEL?.appendChild(folder); for (let i = 0; i < irqList.length; i++) { @@ -51,9 +58,24 @@ export class SpIrqChart { traceRow.name = `${it.name} Cpu ${it.cpu}`; traceRow.rowHidden = !folder.expansion; traceRow.setAttribute('children', ''); + traceRow.setAttribute('callId', `${it.cpu}`); + traceRow.setAttribute('cat', `${it.name}`); traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; traceRow.selectChangeHandler = this.trace.selectChangeHandler; - traceRow.supplier = () => queryIrqData(it.cpu, it.name); + traceRow.supplierFrame = () => { + return irqDataSender(it.cpu, it.name, traceRow).then((irqs) => { + if (irqs.length > 0) { + irqs.forEach((irq, index) => { + if (it.name === 'irq') { + irqs[index].name = this.irqNameMap.get(irqs[index].id!)!.ipiName || ''; + } else { + irqs[index].name = this.irqNameMap.get(irqs[index].id!)!.name || ''; + } + }); + } + return irqs; + }); + }; traceRow.focusHandler = (ev) => { this.trace?.displayTip( traceRow, @@ -81,7 +103,7 @@ export class SpIrqChart { }, traceRow ); - traceRow.canvasRestore(context); + traceRow.canvasRestore(context, this.trace); }; folder.addChildTraceRow(traceRow); } @@ -115,7 +137,7 @@ export class SpIrqChart { irqFolder ); } - irqFolder.canvasRestore(this.trace.canvasPanelCtx!); + irqFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; return irqFolder; } diff --git a/ide/src/trace/component/chart/SpLogChart.ts b/ide/src/trace/component/chart/SpLogChart.ts index 371ea77ea..305c826cf 100644 --- a/ide/src/trace/component/chart/SpLogChart.ts +++ b/ide/src/trace/component/chart/SpLogChart.ts @@ -15,11 +15,10 @@ import { SpSystemTrace } from '../SpSystemTrace'; import { TraceRow } from '../trace/base/TraceRow'; -import { queryLogData } from '../../database/SqlLite'; import { renders } from '../../database/ui-worker/ProcedureWorker'; import { LogRender, LogStruct } from '../../database/ui-worker/ProcedureWorkerLog'; - -const ONE_DAY_NS = 86400000000000; +import { LogDataSender } from '../../database/data-trafic/LogDataSender'; +import {queryLogData} from "../../database/SqlLite"; export class SpLogChart { private trace: SpSystemTrace; @@ -29,16 +28,15 @@ export class SpLogChart { } async init() { - let oneDayTime = (window as any).recordEndNS - ONE_DAY_NS; - let dataArray = await queryLogData(oneDayTime); + let dataArray = await queryLogData(); if (dataArray.length === 0) { return; } - let folder = await this.initFolder(dataArray); + let folder = await this.initFolder(); this.trace.rowsEL?.appendChild(folder); } - async initFolder(dataArray: LogStruct[]): Promise> { + async initFolder(): Promise> { let logsRow = TraceRow.skeleton(); logsRow.rowId = 'logs'; logsRow.index = 0; @@ -49,10 +47,11 @@ export class SpLogChart { logsRow.name = 'Logs'; logsRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; logsRow.selectChangeHandler = this.trace.selectChangeHandler; - logsRow.supplier = () => - new Promise((resolve): void => { - resolve(dataArray); + logsRow.supplierFrame = () => { + return LogDataSender(logsRow).then((res) => { + return res; }); + }; logsRow.onThreadHandler = (useCache) => { let context: CanvasRenderingContext2D; if (logsRow.currentContext) { @@ -69,7 +68,7 @@ export class SpLogChart { }, logsRow ); - logsRow.canvasRestore(context); + logsRow.canvasRestore(context, this.trace); }; return logsRow; } diff --git a/ide/src/trace/component/chart/SpNativeMemoryChart.ts b/ide/src/trace/component/chart/SpNativeMemoryChart.ts index 199b4d104..f51d7ad0c 100644 --- a/ide/src/trace/component/chart/SpNativeMemoryChart.ts +++ b/ide/src/trace/component/chart/SpNativeMemoryChart.ts @@ -30,6 +30,10 @@ import { Utils } from '../trace/base/Utils'; import { renders } from '../../database/ui-worker/ProcedureWorker'; import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU'; import { type BaseStruct } from '../../bean/BaseStruct'; +import { + nativeMemoryChartDataCacheSender, + nativeMemoryChartDataSender, +} from '../../database/data-trafic/NativeMemoryDataSender'; export class SpNativeMemoryChart { static EVENT_HEAP: Array = []; @@ -55,7 +59,7 @@ export class SpNativeMemoryChart { row ); } - row.canvasRestore(this.trace.canvasPanelCtx!); + row.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; } @@ -76,7 +80,7 @@ export class SpNativeMemoryChart { }, row ); - row.canvasRestore(context); + row.canvasRestore(context, this.trace); }; } @@ -155,11 +159,13 @@ export class SpNativeMemoryChart { allHeapRow.findHoverStruct = (): void => { HeapStruct.hoverHeapStruct = allHeapRow.getHoverStruct(); }; - allHeapRow.supplier = (): Promise => { - return type === 'native_hook' - ? this.getNativeMemoryDataByChartType(i, allHeapRow.drawType, process.ipid) - : this.getNativeMemoryStatisticByChartType(i - 1, process.ipid); - }; + allHeapRow.supplierFrame = (): Promise => + nativeMemoryChartDataSender(allHeapRow, { + eventType: i, + ipid: process.ipid, + model: type, + drawType: allHeapRow.drawType, + }); this.chartThreadHandler(allHeapRow); folder.addChildTraceRow(allHeapRow); } @@ -178,60 +184,19 @@ export class SpNativeMemoryChart { return; } await this.initNativeMemory(); + await nativeMemoryChartDataCacheSender( + nativeProcess.map((it) => it.ipid), + nativeMemoryType + ); SpNativeMemoryChart.EVENT_HEAP = await queryHeapGroupByEvent(nativeMemoryType); for (const process of nativeProcess) { const nativeRow = this.initNativeMemoryFolder(process.pid, process.ipid); this.initAllocMapChart(nativeRow, nativeMemoryType, process); } - let durTime = new Date().getTime() - time; info('The time to load the Native Memory data is: ', durTime); }; - getNativeMemoryStatisticByChartType = async (chartType: number, ipid: number): Promise> => { - let nmStatisticArray: Array = []; - await new Promise>((resolve, reject) => { - procedurePool.submitWithName( - 'logic1', - 'native-memory-queryNativeHookStatistic', - { type: chartType, totalNS: TraceRow.range?.totalNS!, ipid: ipid }, - undefined, - (res: any) => { - nmStatisticArray = nmStatisticArray.concat(res.data); - res.data = null; - if (res.tag === 'end') { - resolve(nmStatisticArray); - } - } - ); - }); - return nmStatisticArray; - }; - - getNativeMemoryDataByChartType = async ( - nativeMemoryType: number, - chartType: number, - ipid: number - ): Promise> => { - let args = new Map(); - args.set('nativeMemoryType', nativeMemoryType); - args.set('chartType', chartType); - args.set('totalNS', TraceRow.range?.totalNS!); - args.set('actionType', 'memory-chart'); - args.set('ipid', ipid); - let nmArray: Array = []; - await new Promise>((resolve) => { - procedurePool.submitWithName('logic1', 'native-memory-chart-action', args, undefined, (res: any) => { - nmArray = nmArray.concat(res.data); - res.data = null; - if (res.tag === 'end') { - resolve(nmArray); - } - }); - }); - return nmArray; - }; - initNativeMemory = async (): Promise => { let time = new Date().getTime(); let isRealtime = false; @@ -248,9 +213,9 @@ export class SpNativeMemoryChart { } await new Promise((resolve) => { procedurePool.submitWithName( - 'logic1', + 'logic0', 'native-memory-init', - { isRealtime, realTimeDif, dataDict: SpSystemTrace.DATA_DICT }, + { isRealtime, realTimeDif }, undefined, (res: any) => { resolve(res); diff --git a/ide/src/trace/component/chart/SpProcessChart.ts b/ide/src/trace/component/chart/SpProcessChart.ts index f9616d205..c1eead309 100644 --- a/ide/src/trace/component/chart/SpProcessChart.ts +++ b/ide/src/trace/component/chart/SpProcessChart.ts @@ -15,27 +15,26 @@ import { SpSystemTrace } from '../SpSystemTrace'; import { - getFunDataByTid, getMaxDepthByTid, - queryAllActualData, - queryAllExpectedData, + queryAllFuncNames, queryAllJankProcess, + queryAllProcessNames, + queryAllSoInitNames, + queryAllSrcSlices, + queryAllThreadName, queryEventCountMap, + queryMemFilterIdMaxValue, queryProcess, queryProcessAsyncFunc, queryProcessByTable, queryProcessContentCount, - queryProcessData, queryProcessMem, queryProcessMemData, - queryProcessSoInitData, queryProcessSoMaxDepth, - queryProcessStartup, queryProcessThreads, queryProcessThreadsByTable, queryStartupPidArray, queryTaskPoolProcessIds, - queryThreadData, } from '../../database/SqlLite'; import { Utils } from '../trace/base/Utils'; import { info } from '../../../log/Log'; @@ -52,6 +51,15 @@ import { AppStartupRender, AppStartupStruct } from '../../database/ui-worker/Pro import { SoRender, SoStruct } from '../../database/ui-worker/ProcedureWorkerSoInit'; import { FlagsConfig } from '../SpFlags'; import { JanksStruct } from '../../bean/JanksStruct'; +import { processDataSender } from '../../database/data-trafic/ProcessDataSender'; +import { threadDataSender } from '../../database/data-trafic/ThreadDataSender'; +import { funcDataSender } from '../../database/data-trafic/FuncDataSender'; +import { processMemDataSender } from '../../database/data-trafic/ProcessMemDataSender'; +import { processStartupDataSender } from '../../database/data-trafic/ProcessStartupDataSender'; +import { processSoInitDataSender } from '../../database/data-trafic/ProcessSoInitDataSender'; +import { processExpectedDataSender } from '../../database/data-trafic/ProcessExpectedDataSender'; +import { processActualDataSender } from '../../database/data-trafic/ProcessActualDataSender'; +import { processDeliverInputEventDataSender } from '../../database/data-trafic/ProcessDeliverInputEventDataSender'; export class SpProcessChart { private readonly trace: SpSystemTrace; @@ -67,7 +75,12 @@ export class SpProcessChart { private threadFuncMaxDepthMap: Map = new Map(); private startupProcessArr: { pid: number }[] = []; private processSoMaxDepth: { pid: number; maxDepth: number }[] = []; - + private funcNameMap: Map = new Map(); + private filterIdMaxValue: Map = new Map(); + private soInitNameMap: Map = new Map(); + private processNameMap: Map = new Map(); + private threadNameMap: Map = new Map(); + private processSrcSliceMap: Map = new Map(); constructor(trace: SpSystemTrace) { this.trace = trace; } @@ -79,21 +92,6 @@ export class SpProcessChart { this.processAsyncFuncMap = Utils.groupBy(asyncFuncList, 'pid'); }; - /** - * 更新无end方法的持续时间 - * @param it 被更新的方法 - * @param i 索引位置 - * @param arr 被更新的方法集合 - */ - modifyNofinishDur(it: FuncStruct, i: number, arr: Array): void { - if (it.dur === -1) { - it.dur = TraceRow.range!.endNS - it.startTs!; - it.flag = 'Did not end'; - it.nofinish = true; - } - } - - initDeliverInputEvent = async (): Promise => { let row = TraceRow.skeleton(); row.setAttribute('disabled-check', ''); @@ -117,24 +115,6 @@ export class SpProcessChart { Reflect.ownKeys(asyncFuncGroup).map((key: any) => { let asyncFuncGroups: Array = asyncFuncGroup[key]; if (asyncFuncGroups.length > 0) { - let isIntersect = (left: any, right: any): boolean => - Math.max(left.startTs + left.dur, right.startTs + right.dur) - Math.min(left.startTs, right.startTs) < - left.dur + right.dur; - let depths: any = []; - let createDepth = (currentDepth: number, index: number): void => { - if (depths[currentDepth] == undefined || !isIntersect(depths[currentDepth], asyncFuncGroups[index])) { - asyncFuncGroups[index].depth = currentDepth; - depths[currentDepth] = asyncFuncGroups[index]; - } else { - createDepth(++currentDepth, index); - } - }; - asyncFuncGroups.forEach((it, i, arr) => { - this.modifyNofinishDur(it, i, arr); - createDepth(0, i); - }); - let max = Math.max(...asyncFuncGroups.map((it) => it.depth || 0)) + 1; - let maxHeight = max * 20; let funcRow = TraceRow.skeleton(); funcRow.rowId = `${asyncFuncGroups[0].funName}-${key}`; funcRow.asyncFuncName = asyncFuncGroups[0].funName; @@ -144,11 +124,40 @@ export class SpProcessChart { funcRow.rowParentId = `${row.rowId}`; funcRow.rowHidden = !row.expansion; funcRow.style.width = '100%'; - funcRow.style.height = `${maxHeight}px`; - funcRow.setAttribute('height', `${maxHeight}`); funcRow.name = `${asyncFuncGroups[0].funName} ${key}`; funcRow.setAttribute('children', ''); - funcRow.supplier = (): Promise => new Promise((resolve) => resolve(asyncFuncGroups)); + funcRow.supplierFrame = () => { + return processDeliverInputEventDataSender(key, funcRow!).then((res: Array) => { + let isIntersect = (left: any, right: any): boolean => + Math.max(left.startTs + left.dur, right.startTs + right.dur) - Math.min(left.startTs, right.startTs) < + left.dur + right.dur; + let depths: any = []; + let createDepth = (currentDepth: number, index: number): void => { + if (depths[currentDepth] == undefined || !isIntersect(depths[currentDepth], res[index])) { + res[index].depth = currentDepth; + depths[currentDepth] = res[index]; + } else { + createDepth(++currentDepth, index); + } + }; + res.forEach((it, i) => { + res[i].funName = this.funcNameMap.get(res[i].id!); + res[i].threadName = this.threadNameMap.get(res[i].tid!); + if (it.dur == -1) { + it.dur = (TraceRow.range?.endNS || 0) - it.startTs; + it.flag = 'Did not end'; + } + createDepth(0, i); + }); + if (funcRow && !funcRow.isComplete) { + let max = Math.max(...asyncFuncGroups.map((it) => it.depth || 0)) + 1; + let maxHeight = max * 20; + funcRow.style.height = `${maxHeight}px`; + funcRow.setAttribute('height', `${maxHeight}`); + } + return res; + }); + }; funcRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; funcRow.selectChangeHandler = this.trace.selectChangeHandler; funcRow.onThreadHandler = (useCache): void => { @@ -167,7 +176,7 @@ export class SpProcessChart { }, funcRow ); - funcRow.canvasRestore(context); + funcRow.canvasRestore(context, this.trace); }; row.addChildTraceRow(funcRow); } @@ -175,6 +184,30 @@ export class SpProcessChart { }; async init(): Promise { + let maxValues = await queryMemFilterIdMaxValue(); + maxValues.forEach((it) => { + this.filterIdMaxValue.set(it.filterId, it.maxValue); + }); + let funcNamesArray = await queryAllFuncNames(); + funcNamesArray.forEach((it) => { + this.funcNameMap.set(it.id, it.name); + }); + let soInitNamesArray = await queryAllSoInitNames(); + soInitNamesArray.forEach((it) => { + this.soInitNameMap.set(it.id, it.name); + }); + let processNamesArray = await queryAllProcessNames(); + processNamesArray.forEach((it) => { + this.processNameMap.set(it.pid, it.name); + }); + let processSrcSliceArray = await queryAllSrcSlices(); + processSrcSliceArray.forEach((it) => { + this.processSrcSliceMap.set(it.id, it.src); + }); + let threadNameArray = await queryAllThreadName(); + threadNameArray.forEach((it) => { + this.threadNameMap.set(it.tid, it.name); + }); let threadFuncMaxDepthArray = await getMaxDepthByTid(); info('Gets the maximum tier per thread , tid and maxDepth'); threadFuncMaxDepthArray.forEach((it) => { @@ -218,14 +251,10 @@ export class SpProcessChart { let processList = Utils.removeDuplicates(processes, processFromTable, 'pid'); let allJankProcessData = await queryAllJankProcess(); let allJankProcess: Array = []; - let allExpectedProcess: Array = []; - let allActualProcess: Array = []; if (allJankProcessData.length > 0) { allJankProcessData.forEach((name, index) => { allJankProcess.push(name.pid!); }); - allExpectedProcess = await queryAllExpectedData(); - allActualProcess = await queryAllActualData(); } let allTaskPoolPid: Array<{ pid: number }> = []; if (FlagsConfig.getFlagsConfigEnableStatus('TaskPool')) { @@ -259,7 +288,9 @@ export class SpProcessChart { processRow.addTemplateTypes('TaskPool'); } processRow.name = `${it.processName || 'Process'} ${it.pid}`; - processRow.supplier = (): Promise> => queryProcessData(it.pid || -1, 0, TraceRow.range?.totalNS || 0); + processRow.supplierFrame = (): Promise> => { + return processDataSender(it.pid || -1, processRow); + }; processRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; processRow.selectChangeHandler = this.trace.selectChangeHandler; processRow.onThreadHandler = (useCache): void => { @@ -277,7 +308,7 @@ export class SpProcessChart { processRow ); } - processRow.canvasRestore(this.trace.canvasPanelCtx!); + processRow.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; this.trace.rowsEL?.appendChild(processRow); @@ -301,143 +332,117 @@ export class SpProcessChart { */ let actualRow: TraceRow | null = null; let expectedRow: TraceRow | null = null; - if (allJankProcess.indexOf(it.pid) > -1 && allExpectedProcess.length > 0) { - let expectedData = allExpectedProcess.filter((ite) => ite.pid == it.pid); - if (expectedData.length > 0) { - // @ts-ignore - let isIntersect = (a: JanksStruct, b: JanksStruct): boolean => - Math.max(a.ts! + a.dur!, b.ts! + b.dur!) - Math.min(a.ts!, b.ts!) < a.dur! + b.dur!; - let depthArray: any = []; - for (let j = 0; j < expectedData.length; j++) { - let expectedItem = expectedData[j]; - if (expectedItem.cmdline != 'render_service') { - expectedItem.frame_type = 'app'; - } else { - expectedItem.frame_type = expectedItem.cmdline; - } - if (!expectedItem.dur || expectedItem.dur < 0) { - continue; - } - if (depthArray.length === 0) { - expectedItem.depth = 0; - depthArray.push(expectedItem); - } else { - if (isIntersect(depthArray[0], expectedItem)) { - if (isIntersect(depthArray[depthArray.length - 1], expectedItem)) { - expectedItem.depth = depthArray.length; - depthArray.push(expectedItem); - } + if (allJankProcess.indexOf(it.pid) > -1) { + expectedRow = TraceRow.skeleton(); + expectedRow.asyncFuncName = it.processName; + expectedRow.asyncFuncNamePID = it.pid; + expectedRow.rowType = TraceRow.ROW_TYPE_JANK; + expectedRow.rowParentId = `${it.pid}`; + expectedRow.rowHidden = !processRow.expansion; + expectedRow.style.width = '100%'; + expectedRow.name = 'Expected Timeline'; + expectedRow.addTemplateTypes('FrameTimeline'); + expectedRow.setAttribute('children', ''); + expectedRow.supplierFrame = () => { + return processExpectedDataSender(it.pid, expectedRow!).then((res) => { + let maxDepth: number = 1; + let unitHeight: number = 20; + for (let j = 0; j < res.length; j++) { + let expectedItem = res[j]; + if (expectedItem.depth! >= maxDepth) { + maxDepth = expectedItem.depth! + 1; + } + expectedItem.cmdline = this.processNameMap.get(res[j].pid!); + if (expectedItem.cmdline != 'render_service') { + expectedItem.frame_type = 'app'; } else { - expectedItem.depth = 0; - depthArray = [expectedItem]; + expectedItem.frame_type = expectedItem.cmdline; } } - } - let max = Math.max(...expectedData.map((it) => it.depth || 0)) + 1; - let maxHeight = max * 20; - expectedRow = TraceRow.skeleton(); - let timeLineType = expectedData[0].type; - expectedRow.rowId = `${timeLineType}-${it.pid}`; - expectedRow.asyncFuncName = it.processName; - expectedRow.asyncFuncNamePID = it.pid; - expectedRow.rowType = TraceRow.ROW_TYPE_JANK; - expectedRow.rowParentId = `${it.pid}`; - expectedRow.rowHidden = !processRow.expansion; - expectedRow.style.width = '100%'; - expectedRow.style.height = `${maxHeight}px`; - expectedRow.setAttribute('height', `${maxHeight}`); - expectedRow.setAttribute('frame_type', expectedData[0].frame_type); - expectedRow.name = 'Expected Timeline'; - expectedRow.addTemplateTypes('FrameTimeline'); - expectedRow.setAttribute('children', ''); - expectedRow.supplier = (): Promise => - new Promise((resolve) => { - resolve(expectedData); - }); - expectedRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; - expectedRow.selectChangeHandler = this.trace.selectChangeHandler; - expectedRow.onThreadHandler = (useCache): void => { - let context = expectedRow!.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; - expectedRow!.canvasSave(context); - (renders['jank'] as JankRender).renderMainThread( - { - context: context, - useCache: useCache, - type: 'expected_frame_timeline_slice', - }, - expectedRow! - ); - expectedRow!.canvasRestore(context); - }; - processRow.addChildTraceRow(expectedRow); - let actualData = allActualProcess.filter((ite) => ite.pid == it.pid); - if (actualData.length > 0) { - let isIntersect = (a: any, b: any): boolean => - Math.max(a.ts + a.dur, b.ts + b.dur) - Math.min(a.ts, b.ts) < a.dur + b.dur; - let depthArray: any = []; - for (let j = 0; j < actualData.length; j++) { - let actualItem = actualData[j]; + if (expectedRow && !expectedRow.isComplete && res.length > 0) { + let maxHeight: number = maxDepth * unitHeight; + expectedRow.style.height = `${maxHeight}px`; + expectedRow.setAttribute('height', `${maxHeight}`); + if (res[0]) { + let timeLineType = res[0].type; + expectedRow.rowId = `${timeLineType}-${it.pid}`; + expectedRow.setAttribute('frame_type', res[0].frame_type || ''); + } + } + return res; + }); + }; + expectedRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; + expectedRow.selectChangeHandler = this.trace.selectChangeHandler; + expectedRow.onThreadHandler = (useCache): void => { + let context = expectedRow!.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + expectedRow!.canvasSave(context); + (renders['jank'] as JankRender).renderMainThread( + { + context: context, + useCache: useCache, + type: 'expected_frame_timeline_slice', + }, + expectedRow! + ); + expectedRow!.canvasRestore(context, this.trace); + }; + processRow.addChildTraceRow(expectedRow); + actualRow = TraceRow.skeleton(); + actualRow.rowType = TraceRow.ROW_TYPE_JANK; + actualRow.rowParentId = `${it.pid}`; + actualRow.rowHidden = !processRow.expansion; + actualRow.style.width = '100%'; + actualRow.name = 'Actual Timeline'; + actualRow.addTemplateTypes('FrameTimeline'); + actualRow.setAttribute('children', ''); + actualRow.supplierFrame = () => { + return processActualDataSender(it.pid, actualRow!).then((res) => { + let maxDepth: number = 1; + let unitHeight: number = 20; + for (let j = 0; j < res.length; j++) { + let actualItem = res[j]; + if (actualItem.depth! >= maxDepth) { + maxDepth = actualItem.depth! + 1; + } + actualItem.src_slice = this.processSrcSliceMap.get(res[j].id!); + actualItem.cmdline = this.processNameMap.get(res[j].pid!); if (actualItem.cmdline != 'render_service') { actualItem.frame_type = 'app'; } else { actualItem.frame_type = actualItem.cmdline; } - if (!actualItem.dur || actualItem.dur < 0) { - continue; - } - if (depthArray.length === 0) { - actualItem.depth = 0; - depthArray.push(actualItem); - } else { - if (isIntersect(depthArray[0], actualItem)) { - if (isIntersect(depthArray[depthArray.length - 1], actualItem)) { - actualItem.depth = depthArray.length; - depthArray.push(actualItem); - } else { - actualItem.depth = depthArray.length - 1; - depthArray[length - 1] = actualItem; - } - } else { - actualItem.depth = 0; - depthArray = [actualItem]; - } + } + if (actualRow && !actualRow.isComplete && res.length > 0) { + let maxHeight: number = maxDepth * unitHeight; + actualRow.style.height = `${maxHeight}px`; + actualRow.setAttribute('height', `${maxHeight}`); + if (res[0]) { + let timeLineType = res[0].type; + actualRow.rowId = `${timeLineType}-${it.pid}`; + actualRow.setAttribute('frame_type', res[0].frame_type || ''); + actualRow.dataList = res; } } - let max = Math.max(...actualData.map((it) => it.depth || 0)) + 1; - let maxHeight = max * 20; - actualRow = TraceRow.skeleton(); - let timeLineType = actualData[0].type; - actualRow.rowId = `${timeLineType}-${it.pid}`; - actualRow.rowType = TraceRow.ROW_TYPE_JANK; - actualRow.rowParentId = `${it.pid}`; - actualRow.rowHidden = !processRow.expansion; - actualRow.style.width = '100%'; - actualRow.style.height = `${maxHeight}px`; - actualRow.setAttribute('height', `${maxHeight}`); - actualRow.name = 'Actual Timeline'; - actualRow.addTemplateTypes('FrameTimeline'); - actualRow.setAttribute('frame_type', actualData[0].frame_type); - actualRow.setAttribute('children', ''); - actualRow.dataList = actualData; - actualRow.supplier = (): Promise => new Promise((resolve) => resolve(actualData)); - actualRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; - actualRow.selectChangeHandler = this.trace.selectChangeHandler; - actualRow.onThreadHandler = (useCache): void => { - let context = actualRow!.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; - actualRow!.canvasSave(context); - (renders['jank'] as JankRender).renderMainThread( - { - context: context, - useCache: useCache, - type: 'actual_frame_timeline_slice', - }, - actualRow! - ); - actualRow!.canvasRestore(context); - }; - processRow.addChildTraceRow(actualRow); - } - } + return res; + }); + }; + actualRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; + actualRow.selectChangeHandler = this.trace.selectChangeHandler; + actualRow.onThreadHandler = (useCache): void => { + let context = actualRow!.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + actualRow!.canvasSave(context); + (renders['jank'] as JankRender).renderMainThread( + { + context: context, + useCache: useCache, + type: 'actual_frame_timeline_slice', + }, + actualRow! + ); + actualRow!.canvasRestore(context, this.trace); + }; + processRow.addChildTraceRow(actualRow); } let offsetYTimeOut: any = undefined; processRow.addEventListener('expansion-change', (e: any) => { @@ -577,20 +582,16 @@ export class SpProcessChart { } linkProcessItem[1].y = linkProcessItem[1].rowEL!.translateY + linkProcessItem[1].offsetY; if (linkProcessItem[0].rowEL.rowParentId == e.detail.rowId) { - if (!linkProcessItem[0].rowEL.collect) { - linkProcessItem[0].x = ns2xByTimeShaft(linkProcessItem[0].ns, this.trace.timerShaftEL!); - linkProcessItem[0].y = processRow!.translateY! + linkProcessItem[0].offsetY / 2; - linkProcessItem[0].offsetY = linkProcessItem[0].offsetY / 2; - linkProcessItem[0].rowEL = processRow!; - } + linkProcessItem[0].x = ns2xByTimeShaft(linkProcessItem[0].ns, this.trace.timerShaftEL!); + linkProcessItem[0].y = processRow!.translateY! + linkProcessItem[0].offsetY / 2; + linkProcessItem[0].offsetY = linkProcessItem[0].offsetY / 2; + linkProcessItem[0].rowEL = processRow!; } if (linkProcessItem[1].rowEL.rowParentId == e.detail.rowId) { - if (!linkProcessItem[1].rowEL.collect) { - linkProcessItem[1].x = ns2xByTimeShaft(linkProcessItem[1].ns, this.trace.timerShaftEL!); - linkProcessItem[1].y = processRow!.translateY! + linkProcessItem[1].offsetY / 2; - linkProcessItem[1].offsetY = linkProcessItem[1].offsetY / 2; - linkProcessItem[1].rowEL = processRow!; - } + linkProcessItem[1].x = ns2xByTimeShaft(linkProcessItem[1].ns, this.trace.timerShaftEL!); + linkProcessItem[1].y = processRow!.translateY! + linkProcessItem[1].offsetY / 2; + linkProcessItem[1].offsetY = linkProcessItem[1].offsetY / 2; + linkProcessItem[1].rowEL = processRow!; } }); }, 300); @@ -612,8 +613,11 @@ export class SpProcessChart { let isIntersect = (a: any, b: any): boolean => Math.max(a.startTs + a.dur, b.startTs + b.dur) - Math.min(a.startTs, b.startTs) < a.dur + b.dur; let depthArray: any = []; - asyncFunctions.forEach((it, i, arr) => { - this.modifyNofinishDur(it, i, arr); + asyncFunctions.forEach((it, i) => { + if (it.dur === -1) { + it.dur = (TraceRow.range?.endNS || 0) - it.startTs; + it.flag = 'Did not end'; + } let currentDepth = 0; let index = i; while ( @@ -659,7 +663,7 @@ export class SpProcessChart { }, funcRow ); - funcRow.canvasRestore(context); + funcRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(funcRow); } @@ -688,12 +692,12 @@ export class SpProcessChart { `${ProcessMemStruct.hoverProcessMemStruct?.value || '0'}` ); }; - row.findHoverStruct = () => { + row.findHoverStruct = (): void => { ProcessMemStruct.hoverProcessMemStruct = row.getHoverStruct(false); }; - row.supplier = (): Promise> => - queryProcessMemData(mem.trackId).then((resultProcess) => { - let maxValue = Math.max(...resultProcess.map((it) => it.value || 0)); + row.supplierFrame = (): Promise> => + processMemDataSender(mem.trackId, row).then((resultProcess) => { + let maxValue = this.filterIdMaxValue.get(mem.trackId) || 0; for (let j = 0; j < resultProcess.length; j++) { resultProcess[j].maxValue = maxValue; if (j === resultProcess.length - 1) { @@ -725,14 +729,14 @@ export class SpProcessChart { }, row ); - row.canvasRestore(context); + row.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(row); }); /** * add thread list */ - let threads = this.processThreads.filter((thread) => thread.pid === it.pid && thread.tid != 0); + let threads = this.processThreads.filter((thread) => thread.pid === it.pid && thread.tid != 0 && (thread.switchCount||0)>0); for (let j = 0; j < threads.length; j++) { let thread = threads[j]; let threadRow = TraceRow.skeleton(); @@ -747,14 +751,20 @@ export class SpProcessChart { threadRow.setAttribute('children', ''); threadRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; threadRow.selectChangeHandler = this.trace.selectChangeHandler; - threadRow.supplier = (): Promise> => - queryThreadData(thread.tid || 0, it.pid || 0).then((res) => { - if (res.length <= 0) { - threadRow.rowDiscard = true; - this.trace.refreshCanvas(true); + threadRow.supplierFrame = (): Promise> => { + return threadDataSender(thread.tid || 0, it.pid || 0, threadRow).then((res) => { + if(res === true){ + // threadRow.rowDiscard = true; + return []; + }else{ + let rs = res as ThreadStruct[] + if (rs.length <= 0 && !threadRow.isComplete) { + this.trace.refreshCanvas(true); + } + return rs; } - return res; }); + }; threadRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; if (threadRow.currentContext) { @@ -772,7 +782,7 @@ export class SpProcessChart { }, threadRow ); - threadRow.canvasRestore(context); + threadRow.canvasRestore(context, this.trace); }; if (threadRow.rowId === threadRow.rowParentId) { if (actualRow !== null) { @@ -803,29 +813,33 @@ export class SpProcessChart { funcRow.style.height = `${maxHeight}px`; funcRow.name = `${thread.threadName || 'Thread'} ${thread.tid}`; funcRow.setAttribute('children', ''); - funcRow.supplier = (): Promise> => - getFunDataByTid(thread.tid || 0, thread.upid || 0).then((funs: Array) => { - if (funs.length > 0) { - let isBinder = (data: FuncStruct): boolean => { - return ( - data.funName != null && - (data.funName.toLowerCase().startsWith('binder transaction async') || //binder transaction - data.funName.toLowerCase().startsWith('binder async') || - data.funName.toLowerCase().startsWith('binder reply')) - ); - }; - funs.forEach((fun, i, arr) => { - if (isBinder(fun)) { - } else { - this.modifyNofinishDur(fun, i, arr); - } - }); - } else { + funcRow.supplierFrame = (): Promise> => { + return funcDataSender(thread.tid || 0, thread.upid || 0, funcRow).then((rs: Array|boolean) => { + if(rs === true){ funcRow.rowDiscard = true; - this.trace.refreshCanvas(true); + return []; + }else{ + let funs = rs as FuncStruct[]; + if (funs.length > 0) { + funs.forEach((fun, index) => { + funs[index].itid = thread.utid; + funs[index].ipid = thread.upid; + funs[index].funName = this.funcNameMap.get(funs[index].id!); + if (Utils.isBinder(fun)) { + } else { + if (fun.dur === -1) { + fun.dur = (TraceRow.range?.totalNS || 0) - (fun.startTs || 0); + fun.flag = 'Did not end'; + } + } + }); + } else { + this.trace.refreshCanvas(true); + } + return funs; } - return funs; }); + }; funcRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; funcRow.selectChangeHandler = this.trace.selectChangeHandler; funcRow.onThreadHandler = (useCache): void => { @@ -844,7 +858,7 @@ export class SpProcessChart { }, funcRow ); - funcRow.canvasRestore(context); + funcRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRowAfter(funcRow, threadRow); } @@ -869,10 +883,9 @@ export class SpProcessChart { startupRow.setAttribute('children', ''); startupRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; startupRow.selectChangeHandler = this.trace.selectChangeHandler; - startupRow.supplier = (): Promise> => - queryProcessStartup(parseInt(processRow.rowId!)).then((res) => { + startupRow.supplierFrame = (): Promise> => + processStartupDataSender(parseInt(processRow.rowId!), startupRow).then((res) => { if (res.length <= 0) { - startupRow.rowDiscard = true; this.trace.refreshCanvas(true); } for (let i = 0; i < res.length; i++) { @@ -898,7 +911,7 @@ export class SpProcessChart { }, startupRow ); - startupRow.canvasRestore(context); + startupRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(startupRow); return startupRow; @@ -919,15 +932,15 @@ export class SpProcessChart { soRow.setAttribute('children', ''); soRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; soRow.selectChangeHandler = this.trace.selectChangeHandler; - soRow.supplier = (): Promise> => - queryProcessSoInitData(parseInt(processRow.rowId!)).then((res) => { + soRow.supplierFrame = (): Promise> => + processSoInitDataSender(parseInt(processRow.rowId!), soRow).then((res) => { if (res.length <= 0) { - soRow.rowDiscard = true; this.trace.refreshCanvas(true); } - res.forEach((so) => { - if (so.soName) { - so.soName = so.soName.replace('dlopen: ', ''); + res.forEach((so, index) => { + let soName = this.soInitNameMap.get(res[index].id!); + if (soName) { + so.soName = soName.replace('dlopen: ', ''); } }); return res; @@ -948,7 +961,7 @@ export class SpProcessChart { }, soRow ); - soRow.canvasRestore(context); + soRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(soRow); return soRow; diff --git a/ide/src/trace/component/chart/SpSdkChart.ts b/ide/src/trace/component/chart/SpSdkChart.ts index defce4418..2927e664d 100644 --- a/ide/src/trace/component/chart/SpSdkChart.ts +++ b/ide/src/trace/component/chart/SpSdkChart.ts @@ -265,7 +265,7 @@ export class SpSdkChart { }, traceRow ); - traceRow.canvasRestore(context); + traceRow.canvasRestore(context, this.trace); }; nodeRow.addChildTraceRow(traceRow); }; @@ -296,7 +296,7 @@ export class SpSdkChart { sdkFolder ); } - sdkFolder.canvasRestore(this.trace.canvasPanelCtx!); + sdkFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; this.trace.rowsEL?.appendChild(sdkFolder); return sdkFolder; @@ -330,7 +330,7 @@ export class SpSdkChart { sdkSecondFolder ); } - sdkSecondFolder.canvasRestore(this.trace.canvasPanelCtx!); + sdkSecondFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; this.trace.rowsEL?.appendChild(sdkSecondFolder); return sdkSecondFolder; @@ -391,7 +391,7 @@ export class SpSdkChart { }, traceRow ); - traceRow.canvasRestore(context); + traceRow.canvasRestore(context, this.trace); }; nodeRow.addChildTraceRow(traceRow); }; diff --git a/ide/src/trace/component/chart/SpSegmentationChart.ts b/ide/src/trace/component/chart/SpSegmentationChart.ts index e50d67775..caec30bfa 100644 --- a/ide/src/trace/component/chart/SpSegmentationChart.ts +++ b/ide/src/trace/component/chart/SpSegmentationChart.ts @@ -22,470 +22,514 @@ import { BinderRender, BinderStruct } from '../../database/ui-worker/procedureWo import { queryIrqList } from '../../database/SqlLite'; import { BaseStruct } from '../../bean/BaseStruct'; export class SpSegmentationChart { - static trace: SpSystemTrace; - static jsonRow: TraceRow | undefined; - static GpuRow: TraceRow | undefined; - static binderRow: TraceRow | undefined; - static schedRow: TraceRow | undefined; - static freqInfoMapData = new Map>(); - private rowFolder!: TraceRow; - static chartData: Array = [];; - // 数据切割联动 - static setChartData(type: string, data: Array): void { - let currentMaxValue: number = 0; - if (type === 'CPU-FREQ') { - setCpuData(data, currentMaxValue, type); - } - else if (type === 'GPU-FREQ') { - setGpuData(data, currentMaxValue, type) - } else { - setSchedData(data, currentMaxValue, type) - } - SpSegmentationChart.trace.refreshCanvas(true) + static trace: SpSystemTrace; + static jsonRow: TraceRow | undefined; + static GpuRow: TraceRow | undefined; + static binderRow: TraceRow | undefined; + static schedRow: TraceRow | undefined; + static freqInfoMapData = new Map>(); + private rowFolder!: TraceRow; + static chartData: Array = []; + // 数据切割联动 + static setChartData(type: string, data: Array): void { + let currentMaxValue: number = 0; + if (type === 'CPU-FREQ') { + setCpuData(data, currentMaxValue, type); + } else if (type === 'GPU-FREQ') { + setGpuData(data, currentMaxValue, type); + } else { + setSchedData(data, currentMaxValue, type); } + SpSegmentationChart.trace.refreshCanvas(true); + } - // binder联动调用 - static setBinderChartData(type: string, data: Array>): void { - BinderStruct.maxHeight = 0; - let binderList: Array = []; - let chartData: Array = []; - setBinderData(data, binderList); - chartData = binderList.map((v: BinderDataStruct) => { - return { - cpu: v.name === 'binder transaction' ? - 0 : v.name === 'binder transaction async' ? - 1 : v.name === 'binder reply' ? - 2 : 3, - startNS: v.startNS, - dur: v.dur, - name: `${v.name}`, - value: v.count, - depth: v.depth, - cycle: v.idx, - idx: v.idx, - count: v.count, - } - }) - SpSegmentationChart.binderRow!.dataList = []; - SpSegmentationChart.binderRow!.dataListCache = []; - SpSegmentationChart.binderRow!.isComplete = false; - SpSegmentationChart.binderRow!.style.height = `${BinderStruct.maxHeight > 2 ? BinderStruct.maxHeight * 20 + 20 : 40}px`; - // @ts-ignore - SpSegmentationChart.binderRow!.supplier = (): Promise> => - new Promise>((resolve) => resolve(chartData)); - } + // binder联动调用 + static setBinderChartData(type: string, data: Array>): void { + BinderStruct.maxHeight = 0; + let binderList: Array = []; + let chartData: Array = []; + setBinderData(data, binderList); + chartData = binderList.map((v: BinderDataStruct) => { + return { + cpu: + v.name === 'binder transaction' + ? 0 + : v.name === 'binder transaction async' + ? 1 + : v.name === 'binder reply' + ? 2 + : 3, + startNS: v.startNS, + dur: v.dur, + name: `${v.name}`, + value: v.count, + depth: v.depth, + cycle: v.idx, + idx: v.idx, + count: v.count, + }; + }); + SpSegmentationChart.binderRow!.dataList = []; + SpSegmentationChart.binderRow!.dataListCache = []; + SpSegmentationChart.binderRow!.isComplete = false; + SpSegmentationChart.binderRow!.style.height = `${ + BinderStruct.maxHeight > 2 ? BinderStruct.maxHeight * 20 + 20 : 40 + }px`; + // @ts-ignore + SpSegmentationChart.binderRow!.supplier = (): Promise> => + new Promise>((resolve) => resolve(chartData)); + } - // 悬浮联动 - static tabHover(type: String, tableIsHover: boolean = false, cycle: number = -1): void { - CpuFreqExtendStruct.isTabHover = tableIsHover; - if (type === 'CPU-FREQ' || type === 'GPU-FREQ' || type === 'SCHED-SWITCH') { - if (tableIsHover) { - SpSegmentationChart.jsonRow!.isHover = false; - SpSegmentationChart.GpuRow!.isHover = false; - CpuFreqExtendStruct.cycle = cycle; - } else { - CpuFreqExtendStruct.cycle = -1 - CpuFreqExtendStruct.hoverCpuFreqStruct = undefined; - } - } else if (type === 'BINDER') { - if (tableIsHover) { - BinderStruct.hoverCycle = cycle; - } else { - BinderStruct.hoverCycle = -1; - } - } - SpSegmentationChart.trace.refreshCanvas(false); + // 悬浮联动 + static tabHover(type: String, tableIsHover: boolean = false, cycle: number = -1): void { + CpuFreqExtendStruct.isTabHover = tableIsHover; + if (type === 'CPU-FREQ' || type === 'GPU-FREQ' || type === 'SCHED-SWITCH') { + if (tableIsHover) { + SpSegmentationChart.jsonRow!.isHover = false; + SpSegmentationChart.GpuRow!.isHover = false; + CpuFreqExtendStruct.cycle = cycle; + } else { + CpuFreqExtendStruct.cycle = -1; + CpuFreqExtendStruct.hoverCpuFreqStruct = undefined; + } + } else if (type === 'BINDER') { + if (tableIsHover) { + BinderStruct.hoverCycle = cycle; + } else { + BinderStruct.hoverCycle = -1; + } } + SpSegmentationChart.trace.refreshCanvas(true, 'flagChange'); + } - constructor(trace: SpSystemTrace) { - SpSegmentationChart.trace = trace; - } + constructor(trace: SpSystemTrace) { + SpSegmentationChart.trace = trace; + } - async init() { - let irqList = await queryIrqList(); - if (irqList.length == 0) { - return; - } - else { - await this.initFolder(); - await this.initCpuFreq(); - await this.initGpuTrace(); - await this.initSchedTrace(); - await this.initBinderTrace(); - } + async init() { + let irqList = await queryIrqList(); + if (irqList.length == 0) { + return; + } else { + await this.initFolder(); + await this.initCpuFreq(); + await this.initGpuTrace(); + await this.initSchedTrace(); + await this.initBinderTrace(); } + } - async initFolder() { - let row = TraceRow.skeleton(); - row.setAttribute('disabled-check', ''); - row.rowId = `unkown`; - row.index = 0; - row.rowType = TraceRow.ROW_TYPE_SPSEGNENTATION; - row.rowParentId = ''; - row.folder = true; - row.style.height = '40px'; - row.name = `Segmentation`; - row.supplier = () => new Promise>((resolve) => resolve([])); - row.onThreadHandler = (useCache) => { - row.canvasSave(SpSegmentationChart.trace.canvasPanelCtx!); - if (row.expansion) { - SpSegmentationChart.trace.canvasPanelCtx?.clearRect(0, 0, row.frame.width, row.frame.height); - } else { - (renders['empty'] as EmptyRender).renderMainThread( - { - context: SpSegmentationChart.trace.canvasPanelCtx, - useCache: useCache, - type: ``, - }, - row, - ); - } - row.canvasRestore(SpSegmentationChart.trace.canvasPanelCtx!); - }; - this.rowFolder = row; - SpSegmentationChart.trace.rowsEL?.appendChild(row); + async initFolder() { + let row = TraceRow.skeleton(); + row.setAttribute('disabled-check', ''); + row.rowId = `unkown`; + row.index = 0; + row.rowType = TraceRow.ROW_TYPE_SPSEGNENTATION; + row.rowParentId = ''; + row.folder = true; + row.style.height = '40px'; + row.name = `Segmentation`; + row.supplier = () => new Promise>((resolve) => resolve([])); + row.onThreadHandler = (useCache) => { + row.canvasSave(SpSegmentationChart.trace.canvasPanelCtx!); + if (row.expansion) { + SpSegmentationChart.trace.canvasPanelCtx?.clearRect(0, 0, row.frame.width, row.frame.height); + } else { + (renders['empty'] as EmptyRender).renderMainThread( + { + context: SpSegmentationChart.trace.canvasPanelCtx, + useCache: useCache, + type: ``, + }, + row + ); + } + row.canvasRestore(SpSegmentationChart.trace.canvasPanelCtx!); + }; + this.rowFolder = row; + SpSegmentationChart.trace.rowsEL?.appendChild(row); + } - } - - async initCpuFreq() { - // json文件泳道 - SpSegmentationChart.jsonRow = TraceRow.skeleton(); - SpSegmentationChart.jsonRow.rowId = `json0`; - SpSegmentationChart.jsonRow.rowType = TraceRow.ROW_TYPE_CPU_COMPUTILITY; - SpSegmentationChart.jsonRow.rowParentId = ''; - SpSegmentationChart.jsonRow.style.height = '40px'; - SpSegmentationChart.jsonRow.name = `Cpu Computility`; - SpSegmentationChart.jsonRow.favoriteChangeHandler = SpSegmentationChart.trace.favoriteChangeHandler; - SpSegmentationChart.jsonRow.addRowCheckFilePop(); - SpSegmentationChart.jsonRow.rowSetting = 'checkFile'; - // 拿到了用户传递的数据 - SpSegmentationChart.jsonRow.onRowCheckFileChangeHandler = (e: string | ArrayBuffer | null) => { - // @ts-ignore - let chartData = JSON.parse(e); - let mapData = new Map(); - // @ts-ignore - chartData.map((v) => { - for (let key in v.freqInfo) { - mapData.set(Number(key), Number(v.freqInfo[key])) - } - SpSegmentationChart.freqInfoMapData.set(v.cpuId, mapData) - mapData = new Map() - }) + async initCpuFreq() { + // json文件泳道 + SpSegmentationChart.jsonRow = TraceRow.skeleton(); + SpSegmentationChart.jsonRow.rowId = `json0`; + SpSegmentationChart.jsonRow.rowType = TraceRow.ROW_TYPE_CPU_COMPUTILITY; + SpSegmentationChart.jsonRow.rowParentId = ''; + SpSegmentationChart.jsonRow.style.height = '40px'; + SpSegmentationChart.jsonRow.name = `Cpu Computility`; + SpSegmentationChart.jsonRow.favoriteChangeHandler = SpSegmentationChart.trace.favoriteChangeHandler; + SpSegmentationChart.jsonRow.addRowCheckFilePop(); + SpSegmentationChart.jsonRow.rowSetting = 'checkFile'; + // 拿到了用户传递的数据 + SpSegmentationChart.jsonRow.onRowCheckFileChangeHandler = (e: string | ArrayBuffer | null) => { + // @ts-ignore + let chartData = JSON.parse(e); + let mapData = new Map(); + // @ts-ignore + chartData.map((v) => { + for (let key in v.freqInfo) { + mapData.set(Number(key), Number(v.freqInfo[key])); } - SpSegmentationChart.jsonRow.focusHandler = (ev) => { - SpSegmentationChart.trace?.displayTip( - SpSegmentationChart.jsonRow!, - CpuFreqExtendStruct.hoverCpuFreqStruct, - `${CpuFreqExtendStruct.hoverCpuFreqStruct === undefined ? 0 : CpuFreqExtendStruct.hoverCpuFreqStruct.value!}` - ); - }; - SpSegmentationChart.jsonRow.findHoverStruct = () => { - CpuFreqExtendStruct.hoverCpuFreqStruct = SpSegmentationChart.jsonRow!.getHoverStruct(); - }; - // @ts-ignore - SpSegmentationChart.jsonRow.supplier = (): Promise> => - new Promise>((resolve) => resolve([])); - SpSegmentationChart.jsonRow.onThreadHandler = (useCache) => { - let context: CanvasRenderingContext2D; - if (SpSegmentationChart.jsonRow!.currentContext) { - context = SpSegmentationChart.jsonRow!.currentContext; - } else { - context = SpSegmentationChart.jsonRow!.collect ? SpSegmentationChart.trace.canvasFavoritePanelCtx! : SpSegmentationChart.trace.canvasPanelCtx!; - } - SpSegmentationChart.jsonRow!.canvasSave(context); - (renders['freq-extend'] as FreqExtendRender).renderMainThread( - { - context: context, - useCache: useCache, - type: `json0`, - }, - SpSegmentationChart.jsonRow! - ); - SpSegmentationChart.jsonRow!.canvasRestore(context); - }; - SpSegmentationChart.trace.rowsEL?.appendChild(SpSegmentationChart.jsonRow); - this.rowFolder!.addChildTraceRow(SpSegmentationChart.jsonRow); - } - - async initGpuTrace() { - SpSegmentationChart.GpuRow = TraceRow.skeleton(); - SpSegmentationChart.GpuRow.rowId = `gpurow`; - SpSegmentationChart.GpuRow.rowType = TraceRow.ROW_TYPE_GPU_COMPUTILITY; - SpSegmentationChart.GpuRow.rowParentId = ''; - SpSegmentationChart.GpuRow.style.height = '40px'; - SpSegmentationChart.GpuRow.name = `Gpu Computility`; - SpSegmentationChart.GpuRow.favoriteChangeHandler = SpSegmentationChart.trace.favoriteChangeHandler; - SpSegmentationChart.GpuRow.selectChangeHandler = SpSegmentationChart.trace.selectChangeHandler; - // @ts-ignore - SpSegmentationChart.GpuRow.supplier = (): Promise> => - new Promise>((resolve) => resolve([])); - SpSegmentationChart.GpuRow.focusHandler = (ev) => { - SpSegmentationChart.trace?.displayTip( - SpSegmentationChart.GpuRow!, - CpuFreqExtendStruct.hoverCpuFreqStruct, - `${CpuFreqExtendStruct.hoverCpuFreqStruct === undefined ? 0 : CpuFreqExtendStruct.hoverCpuFreqStruct.value!}` - ); - }; - SpSegmentationChart.GpuRow.findHoverStruct = () => { - CpuFreqExtendStruct.hoverCpuFreqStruct = SpSegmentationChart.GpuRow!.getHoverStruct(); - }; - SpSegmentationChart.GpuRow.onThreadHandler = (useCache) => { - let context: CanvasRenderingContext2D; - if (SpSegmentationChart.GpuRow!.currentContext) { - context = SpSegmentationChart.GpuRow!.currentContext; - } else { - context = SpSegmentationChart.GpuRow!.collect ? SpSegmentationChart.trace.canvasFavoritePanelCtx! : SpSegmentationChart.trace.canvasPanelCtx!; - } - SpSegmentationChart.GpuRow!.canvasSave(context); - (renders['freq-extend'] as FreqExtendRender).renderMainThread( - { - context: context, - useCache: useCache, - type: `json1`, - }, - SpSegmentationChart.GpuRow! - ); - SpSegmentationChart.GpuRow!.canvasRestore(context); - }; - SpSegmentationChart.trace.rowsEL?.appendChild(SpSegmentationChart.GpuRow); - this.rowFolder!.addChildTraceRow(SpSegmentationChart.GpuRow); - } + SpSegmentationChart.freqInfoMapData.set(v.cpuId, mapData); + mapData = new Map(); + }); + }; + SpSegmentationChart.jsonRow.focusHandler = (ev) => { + SpSegmentationChart.trace?.displayTip( + SpSegmentationChart.jsonRow!, + CpuFreqExtendStruct.hoverCpuFreqStruct, + `${ + CpuFreqExtendStruct.hoverCpuFreqStruct === undefined ? 0 : CpuFreqExtendStruct.hoverCpuFreqStruct.value! + }` + ); + }; + SpSegmentationChart.jsonRow.findHoverStruct = () => { + CpuFreqExtendStruct.hoverCpuFreqStruct = SpSegmentationChart.jsonRow!.getHoverStruct(); + }; + // @ts-ignore + SpSegmentationChart.jsonRow.supplier = (): Promise> => + new Promise>((resolve) => resolve([])); + SpSegmentationChart.jsonRow.onThreadHandler = (useCache) => { + let context: CanvasRenderingContext2D; + if (SpSegmentationChart.jsonRow!.currentContext) { + context = SpSegmentationChart.jsonRow!.currentContext; + } else { + context = SpSegmentationChart.jsonRow!.collect + ? SpSegmentationChart.trace.canvasFavoritePanelCtx! + : SpSegmentationChart.trace.canvasPanelCtx!; + } + SpSegmentationChart.jsonRow!.canvasSave(context); + (renders['freq-extend'] as FreqExtendRender).renderMainThread( + { + context: context, + useCache: useCache, + type: `json0`, + }, + SpSegmentationChart.jsonRow! + ); + SpSegmentationChart.jsonRow!.canvasRestore(context); + }; + SpSegmentationChart.trace.rowsEL?.appendChild(SpSegmentationChart.jsonRow); + this.rowFolder!.addChildTraceRow(SpSegmentationChart.jsonRow); + } - async initSchedTrace() { - SpSegmentationChart.schedRow = TraceRow.skeleton(); - SpSegmentationChart.schedRow.rowId = `sched_switch Count`; - SpSegmentationChart.schedRow.rowType = TraceRow.ROW_TYPE_SCHED_SWITCH; - SpSegmentationChart.schedRow.rowParentId = ''; - SpSegmentationChart.schedRow.style.height = '40px'; - SpSegmentationChart.schedRow.name = `Sched_switch Count`; - SpSegmentationChart.schedRow.favoriteChangeHandler = SpSegmentationChart.trace.favoriteChangeHandler; - SpSegmentationChart.schedRow.selectChangeHandler = SpSegmentationChart.trace.selectChangeHandler; - SpSegmentationChart.schedRow.focusHandler = (ev) => { - SpSegmentationChart.trace?.displayTip( - SpSegmentationChart.schedRow!, - CpuFreqExtendStruct.hoverCpuFreqStruct, - `${CpuFreqExtendStruct.hoverCpuFreqStruct?.value!}` - ); - }; - SpSegmentationChart.schedRow.findHoverStruct = () => { - CpuFreqExtendStruct.hoverCpuFreqStruct = SpSegmentationChart.schedRow!.getHoverStruct(); - }; - // @ts-ignore - SpSegmentationChart.schedRow.supplier = (): Promise> => - new Promise>((resolve) => resolve([])); - SpSegmentationChart.schedRow.onThreadHandler = (useCache) => { - let context: CanvasRenderingContext2D; - if (SpSegmentationChart.schedRow!.currentContext) { - context = SpSegmentationChart.schedRow!.currentContext; - } else { - context = SpSegmentationChart.schedRow!.collect ? SpSegmentationChart.trace.canvasFavoritePanelCtx! : SpSegmentationChart.trace.canvasPanelCtx!; - } - SpSegmentationChart.schedRow!.canvasSave(context); - (renders['freq-extend'] as FreqExtendRender).renderMainThread( - { - context: context, - useCache: useCache, - type: `json0`, - }, - SpSegmentationChart.schedRow! - ); - SpSegmentationChart.schedRow!.canvasRestore(context); - }; - SpSegmentationChart.trace.rowsEL?.appendChild(SpSegmentationChart.schedRow); - this.rowFolder!.addChildTraceRow(SpSegmentationChart.schedRow); - } + async initGpuTrace() { + SpSegmentationChart.GpuRow = TraceRow.skeleton(); + SpSegmentationChart.GpuRow.rowId = `gpurow`; + SpSegmentationChart.GpuRow.rowType = TraceRow.ROW_TYPE_GPU_COMPUTILITY; + SpSegmentationChart.GpuRow.rowParentId = ''; + SpSegmentationChart.GpuRow.style.height = '40px'; + SpSegmentationChart.GpuRow.name = `Gpu Computility`; + SpSegmentationChart.GpuRow.favoriteChangeHandler = SpSegmentationChart.trace.favoriteChangeHandler; + SpSegmentationChart.GpuRow.selectChangeHandler = SpSegmentationChart.trace.selectChangeHandler; + // @ts-ignore + SpSegmentationChart.GpuRow.supplier = (): Promise> => + new Promise>((resolve) => resolve([])); + SpSegmentationChart.GpuRow.focusHandler = (ev) => { + SpSegmentationChart.trace?.displayTip( + SpSegmentationChart.GpuRow!, + CpuFreqExtendStruct.hoverCpuFreqStruct, + `${ + CpuFreqExtendStruct.hoverCpuFreqStruct === undefined ? 0 : CpuFreqExtendStruct.hoverCpuFreqStruct.value! + }` + ); + }; + SpSegmentationChart.GpuRow.findHoverStruct = () => { + CpuFreqExtendStruct.hoverCpuFreqStruct = SpSegmentationChart.GpuRow!.getHoverStruct(); + }; + SpSegmentationChart.GpuRow.onThreadHandler = (useCache) => { + let context: CanvasRenderingContext2D; + if (SpSegmentationChart.GpuRow!.currentContext) { + context = SpSegmentationChart.GpuRow!.currentContext; + } else { + context = SpSegmentationChart.GpuRow!.collect + ? SpSegmentationChart.trace.canvasFavoritePanelCtx! + : SpSegmentationChart.trace.canvasPanelCtx!; + } + SpSegmentationChart.GpuRow!.canvasSave(context); + (renders['freq-extend'] as FreqExtendRender).renderMainThread( + { + context: context, + useCache: useCache, + type: `json1`, + }, + SpSegmentationChart.GpuRow! + ); + SpSegmentationChart.GpuRow!.canvasRestore(context); + }; + SpSegmentationChart.trace.rowsEL?.appendChild(SpSegmentationChart.GpuRow); + this.rowFolder!.addChildTraceRow(SpSegmentationChart.GpuRow); + } - async initBinderTrace() { - SpSegmentationChart.binderRow = TraceRow.skeleton(); - SpSegmentationChart.binderRow.rowId = `binderrow`; - SpSegmentationChart.binderRow.rowType = TraceRow.ROW_TYPE_BINDER_COUNT; - SpSegmentationChart.binderRow.rowParentId = ''; - SpSegmentationChart.binderRow.name = `Binder Count`; - SpSegmentationChart.binderRow.style.height = '40px'; - SpSegmentationChart.binderRow.favoriteChangeHandler = SpSegmentationChart.trace.favoriteChangeHandler; - SpSegmentationChart.binderRow.selectChangeHandler = SpSegmentationChart.trace.selectChangeHandler; - SpSegmentationChart.binderRow.findHoverStruct = () => { - BinderStruct.hoverCpuFreqStruct = SpSegmentationChart.binderRow!.dataListCache.find((v: BinderStruct) => { - if (SpSegmentationChart.binderRow!.isHover) { - if (v.frame!.x < SpSegmentationChart.binderRow!.hoverX - && v.frame!.x + v.frame!.width > SpSegmentationChart.binderRow!.hoverX - && (BinderStruct.maxHeight * 20 - v.depth * 20 + 20) < SpSegmentationChart.binderRow!.hoverY - && BinderStruct.maxHeight * 20 - v.depth * 20 + v.value * 20 + 20 > SpSegmentationChart.binderRow!.hoverY) { - return v; - } - } - }) - }; - SpSegmentationChart.binderRow.supplier = (): Promise> => - new Promise>((resolve) => resolve([])); - SpSegmentationChart.binderRow.onThreadHandler = (useCache) => { - let context: CanvasRenderingContext2D; - if (SpSegmentationChart.binderRow!.currentContext) { - context = SpSegmentationChart.binderRow!.currentContext; - } else { - context = SpSegmentationChart.binderRow!.collect ? SpSegmentationChart.trace.canvasFavoritePanelCtx! : SpSegmentationChart.trace.canvasPanelCtx!; - } - SpSegmentationChart.binderRow!.canvasSave(context); - (renders.binder as BinderRender).renderMainThread( - { - context: context, - useCache: useCache, - type: `binder`, - }, - SpSegmentationChart.binderRow! - ); - SpSegmentationChart.binderRow!.canvasRestore(context); - }; - SpSegmentationChart.binderRow.focusHandler = (ev) => { - SpSegmentationChart.trace!.displayTip( - SpSegmentationChart.binderRow!, - BinderStruct.hoverCpuFreqStruct, - `Cycle: ${BinderStruct.hoverCpuFreqStruct ? BinderStruct.hoverCpuFreqStruct.cycle : 0}
- Name: ${BinderStruct.hoverCpuFreqStruct ? BinderStruct.hoverCpuFreqStruct.name : ''}
- Count: ${BinderStruct.hoverCpuFreqStruct ? BinderStruct.hoverCpuFreqStruct.value : 0}` - ); - }; - SpSegmentationChart.trace.rowsEL?.appendChild(SpSegmentationChart.binderRow); - this.rowFolder!.addChildTraceRow(SpSegmentationChart.binderRow); - } + async initSchedTrace() { + SpSegmentationChart.schedRow = TraceRow.skeleton(); + SpSegmentationChart.schedRow.rowId = `sched_switch Count`; + SpSegmentationChart.schedRow.rowType = TraceRow.ROW_TYPE_SCHED_SWITCH; + SpSegmentationChart.schedRow.rowParentId = ''; + SpSegmentationChart.schedRow.style.height = '40px'; + SpSegmentationChart.schedRow.name = `Sched_switch Count`; + SpSegmentationChart.schedRow.favoriteChangeHandler = SpSegmentationChart.trace.favoriteChangeHandler; + SpSegmentationChart.schedRow.selectChangeHandler = SpSegmentationChart.trace.selectChangeHandler; + SpSegmentationChart.schedRow.focusHandler = (ev) => { + SpSegmentationChart.trace?.displayTip( + SpSegmentationChart.schedRow!, + CpuFreqExtendStruct.hoverCpuFreqStruct, + `${CpuFreqExtendStruct.hoverCpuFreqStruct?.value!}` + ); + }; + SpSegmentationChart.schedRow.findHoverStruct = () => { + CpuFreqExtendStruct.hoverCpuFreqStruct = SpSegmentationChart.schedRow!.getHoverStruct(); + }; + // @ts-ignore + SpSegmentationChart.schedRow.supplier = (): Promise> => + new Promise>((resolve) => resolve([])); + SpSegmentationChart.schedRow.onThreadHandler = (useCache) => { + let context: CanvasRenderingContext2D; + if (SpSegmentationChart.schedRow!.currentContext) { + context = SpSegmentationChart.schedRow!.currentContext; + } else { + context = SpSegmentationChart.schedRow!.collect + ? SpSegmentationChart.trace.canvasFavoritePanelCtx! + : SpSegmentationChart.trace.canvasPanelCtx!; + } + SpSegmentationChart.schedRow!.canvasSave(context); + (renders['freq-extend'] as FreqExtendRender).renderMainThread( + { + context: context, + useCache: useCache, + type: `json0`, + }, + SpSegmentationChart.schedRow! + ); + SpSegmentationChart.schedRow!.canvasRestore(context); + }; + SpSegmentationChart.trace.rowsEL?.appendChild(SpSegmentationChart.schedRow); + this.rowFolder!.addChildTraceRow(SpSegmentationChart.schedRow); + } + async initBinderTrace() { + SpSegmentationChart.binderRow = TraceRow.skeleton(); + SpSegmentationChart.binderRow.rowId = `binderrow`; + SpSegmentationChart.binderRow.rowType = TraceRow.ROW_TYPE_BINDER_COUNT; + SpSegmentationChart.binderRow.rowParentId = ''; + SpSegmentationChart.binderRow.name = `Binder Count`; + SpSegmentationChart.binderRow.style.height = '40px'; + SpSegmentationChart.binderRow.favoriteChangeHandler = SpSegmentationChart.trace.favoriteChangeHandler; + SpSegmentationChart.binderRow.selectChangeHandler = SpSegmentationChart.trace.selectChangeHandler; + SpSegmentationChart.binderRow.findHoverStruct = () => { + BinderStruct.hoverCpuFreqStruct = SpSegmentationChart.binderRow!.dataListCache.find((v: BinderStruct) => { + if (SpSegmentationChart.binderRow!.isHover) { + if ( + v.frame!.x < SpSegmentationChart.binderRow!.hoverX && + v.frame!.x + v.frame!.width > SpSegmentationChart.binderRow!.hoverX && + BinderStruct.maxHeight * 20 - v.depth * 20 + 20 < SpSegmentationChart.binderRow!.hoverY && + BinderStruct.maxHeight * 20 - v.depth * 20 + v.value * 20 + 20 > SpSegmentationChart.binderRow!.hoverY + ) { + return v; + } + } + }); + }; + SpSegmentationChart.binderRow.supplier = (): Promise> => + new Promise>((resolve) => resolve([])); + SpSegmentationChart.binderRow.onThreadHandler = (useCache) => { + let context: CanvasRenderingContext2D; + if (SpSegmentationChart.binderRow!.currentContext) { + context = SpSegmentationChart.binderRow!.currentContext; + } else { + context = SpSegmentationChart.binderRow!.collect + ? SpSegmentationChart.trace.canvasFavoritePanelCtx! + : SpSegmentationChart.trace.canvasPanelCtx!; + } + SpSegmentationChart.binderRow!.canvasSave(context); + (renders.binder as BinderRender).renderMainThread( + { + context: context, + useCache: useCache, + type: `binder`, + }, + SpSegmentationChart.binderRow! + ); + SpSegmentationChart.binderRow!.canvasRestore(context); + }; + SpSegmentationChart.binderRow.focusHandler = (ev) => { + SpSegmentationChart.trace!.displayTip( + SpSegmentationChart.binderRow!, + BinderStruct.hoverCpuFreqStruct, + `Cycle: ${ + BinderStruct.hoverCpuFreqStruct ? BinderStruct.hoverCpuFreqStruct.cycle : 0 + }
+ Name: ${ + BinderStruct.hoverCpuFreqStruct ? BinderStruct.hoverCpuFreqStruct.name : '' + }
+ Count: ${ + BinderStruct.hoverCpuFreqStruct ? BinderStruct.hoverCpuFreqStruct.value : 0 + }` + ); + }; + SpSegmentationChart.trace.rowsEL?.appendChild(SpSegmentationChart.binderRow); + this.rowFolder!.addChildTraceRow(SpSegmentationChart.binderRow); + } } class FreqChartDataStruct { - cpu?: number = 0; - dur: number = 0; - duration?: number = 0; - value: number = 0; - startNS: number = 0; - cycle: number = 0; - freq?: number = 0; - type?: string = ''; - count?: number = 0; - cycleStartTime?: number = 0; + cpu?: number = 0; + dur: number = 0; + duration?: number = 0; + value: number = 0; + startNS: number = 0; + cycle: number = 0; + freq?: number = 0; + type?: string = ''; + count?: number = 0; + cycleStartTime?: number = 0; } class BinderDataStruct { - name: string = ''; - count: number = 0; - dur: number = 0; - startNS: number = 0; - idx: number = -1; - depth?: number = 0; + name: string = ''; + count: number = 0; + dur: number = 0; + startNS: number = 0; + idx: number = -1; + depth?: number = 0; } function setCpuData(data: Array, currentMaxValue: number, type: string) { - let chartData = data.map((v: FreqChartDataStruct) => { - if (v.value > currentMaxValue) { - currentMaxValue = v.value; - } - return { - cpu: 0, - dur: v.dur, - value: v.value ? v.value : v.count ? v.count : 0, - startNS: v.startNS, - cycle: v.cycle, - type - } - }) - CpuFreqExtendStruct.maxValue = currentMaxValue; - SpSegmentationChart.jsonRow!.dataList = []; - SpSegmentationChart.jsonRow!.dataListCache = []; - SpSegmentationChart.jsonRow!.isComplete = false; - // @ts-ignore - SpSegmentationChart.jsonRow!.supplier = (): Promise> => - new Promise>((resolve) => resolve(chartData)); + let chartData = data.map((v: FreqChartDataStruct) => { + if (v.value > currentMaxValue) { + currentMaxValue = v.value; + } + return { + cpu: 0, + dur: v.dur, + value: v.value ? v.value : v.count ? v.count : 0, + startNS: v.startNS, + cycle: v.cycle, + type, + }; + }); + CpuFreqExtendStruct.maxValue = currentMaxValue; + SpSegmentationChart.jsonRow!.dataList = []; + SpSegmentationChart.jsonRow!.dataListCache = []; + SpSegmentationChart.jsonRow!.isComplete = false; + // @ts-ignore + SpSegmentationChart.jsonRow!.supplier = (): Promise> => + new Promise>((resolve) => resolve(chartData)); } function setGpuData(data: Array, currentMaxValue: number, type: string): void { - let chartData = data.map((v: FreqChartDataStruct) => { - let _count = Number(v.count) - if (_count > currentMaxValue) { - currentMaxValue = _count; - } - return { - cpu: 7, - dur: v.dur ? Number(v.dur * 1000000) : 0, - value: Number(v.count), - startNS: Number(v.startNS), - cycle: Number(v.cycle), - type - } - }) - CpuFreqExtendStruct.maxValue = currentMaxValue; - SpSegmentationChart.GpuRow!.dataList = []; - SpSegmentationChart.GpuRow!.dataListCache = []; - SpSegmentationChart.GpuRow!.isComplete = false; - // @ts-ignore - SpSegmentationChart.GpuRow!.supplier = (): Promise> => - new Promise>((resolve) => resolve(chartData)); + let chartData = data.map((v: FreqChartDataStruct) => { + let _count = Number(v.count); + if (_count > currentMaxValue) { + currentMaxValue = _count; + } + return { + cpu: 7, + dur: v.dur ? Number(v.dur * 1000000) : 0, + value: Number(v.count), + startNS: Number(v.startNS), + cycle: Number(v.cycle), + type, + }; + }); + CpuFreqExtendStruct.maxValue = currentMaxValue; + SpSegmentationChart.GpuRow!.dataList = []; + SpSegmentationChart.GpuRow!.dataListCache = []; + SpSegmentationChart.GpuRow!.isComplete = false; + // @ts-ignore + SpSegmentationChart.GpuRow!.supplier = (): Promise> => + new Promise>((resolve) => resolve(chartData)); } function setSchedData(data: Array, currentMaxValue: number | undefined, type: string): void { - let chartData = data.map((v: FreqChartDataStruct) => { - if (v.count && v.count > currentMaxValue!) { - currentMaxValue = v.count; - } - return { - cpu: 5, - dur: Number(v.duration) * 1000000, - value: v.count, - startNS: Number(v.cycleStartTime) * 1000000, - cycle: v.cycle, - type - } - }) - CpuFreqExtendStruct.maxValue = currentMaxValue!; - SpSegmentationChart.schedRow!.dataList = []; - SpSegmentationChart.schedRow!.dataListCache = []; - SpSegmentationChart.schedRow!.isComplete = false; - SpSegmentationChart.schedRow!.supplier = (): Promise> => - new Promise>((resolve) => resolve(chartData)); + let chartData = data.map((v: FreqChartDataStruct) => { + if (v.count && v.count > currentMaxValue!) { + currentMaxValue = v.count; + } + return { + cpu: 5, + dur: Number(v.duration) * 1000000, + value: v.count, + startNS: Number(v.cycleStartTime) * 1000000, + cycle: v.cycle, + type, + }; + }); + CpuFreqExtendStruct.maxValue = currentMaxValue!; + SpSegmentationChart.schedRow!.dataList = []; + SpSegmentationChart.schedRow!.dataListCache = []; + SpSegmentationChart.schedRow!.isComplete = false; + SpSegmentationChart.schedRow!.supplier = (): Promise> => + new Promise>((resolve) => resolve(chartData)); } function setBinderData(data: Array>, binderList: Array): void { - data.map((v: Array) => { - let listCount = 0; - v.map((t: BinderDataStruct) => { - listCount += t.count; - if (t.name === 'binder transaction') { - t.depth = t.count; - } - if (t.name === 'binder transaction async') { - t.depth = t.count + ((v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction'; - }).length > 0) ? (v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction'; - })[0].count) : 0); - } - if (t.name === 'binder reply') { - t.depth = t.count + ((v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction'; - }).length > 0) ? (v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction'; - })[0].count) : 0) + ((v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction async'; - }).length > 0) ? (v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction async'; - })[0].count) : 0); - } - if (t.name === 'binder async rcv') { - t.depth = t.count + ((v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction'; - }).length > 0) ? (v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction'; - })[0].count) : 0) + ((v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction async'; - }).length > 0) ? (v.filter((i: BinderDataStruct) => { - return i.name === 'binder transaction async'; - })[0].count) : 0) + ((v.filter((i: BinderDataStruct) => { - return i.name === 'binder reply'; - }).length > 0) ? (v.filter((i: BinderDataStruct) => { - return i.name === 'binder reply'; - })[0].count) : 0); - } - binderList.push(t); - }); - BinderStruct.maxHeight = BinderStruct.maxHeight > listCount ? BinderStruct.maxHeight : JSON.parse(JSON.stringify(listCount)); - listCount = 0; - }) -} \ No newline at end of file + data.map((v: Array) => { + let listCount = 0; + v.map((t: BinderDataStruct) => { + listCount += t.count; + if (t.name === 'binder transaction') { + t.depth = t.count; + } + if (t.name === 'binder transaction async') { + t.depth = + t.count + + (v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction'; + }).length > 0 + ? v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction'; + })[0].count + : 0); + } + if (t.name === 'binder reply') { + t.depth = + t.count + + (v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction'; + }).length > 0 + ? v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction'; + })[0].count + : 0) + + (v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction async'; + }).length > 0 + ? v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction async'; + })[0].count + : 0); + } + if (t.name === 'binder async rcv') { + t.depth = + t.count + + (v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction'; + }).length > 0 + ? v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction'; + })[0].count + : 0) + + (v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction async'; + }).length > 0 + ? v.filter((i: BinderDataStruct) => { + return i.name === 'binder transaction async'; + })[0].count + : 0) + + (v.filter((i: BinderDataStruct) => { + return i.name === 'binder reply'; + }).length > 0 + ? v.filter((i: BinderDataStruct) => { + return i.name === 'binder reply'; + })[0].count + : 0); + } + binderList.push(t); + }); + BinderStruct.maxHeight = + BinderStruct.maxHeight > listCount ? BinderStruct.maxHeight : JSON.parse(JSON.stringify(listCount)); + listCount = 0; + }); +} diff --git a/ide/src/trace/component/chart/SpVirtualMemChart.ts b/ide/src/trace/component/chart/SpVirtualMemChart.ts index e1a89df4d..e04afa212 100644 --- a/ide/src/trace/component/chart/SpVirtualMemChart.ts +++ b/ide/src/trace/component/chart/SpVirtualMemChart.ts @@ -15,10 +15,11 @@ import { SpSystemTrace } from '../SpSystemTrace'; import { TraceRow } from '../trace/base/TraceRow'; -import { queryVirtualMemory, queryVirtualMemoryData } from '../../database/SqlLite'; +import { queryVirtualMemory } from '../../database/SqlLite'; import { VirtualMemoryRender, VirtualMemoryStruct } from '../../database/ui-worker/ProcedureWorkerVirtualMemory'; import { renders } from '../../database/ui-worker/ProcedureWorker'; import { EmptyRender } from '../../database/ui-worker/ProcedureWorkerCPU'; +import { virtualMemoryDataSender } from '../../database/data-trafic/VirtualMemoryDataSender'; export class SpVirtualMemChart { private trace: SpSystemTrace; @@ -57,7 +58,7 @@ export class SpVirtualMemChart { vmFolder ); } - vmFolder.canvasRestore(this.trace.canvasPanelCtx!); + vmFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); }; this.trace.rowsEL?.appendChild(vmFolder); array.forEach((it, idx) => this.initVirtualMemoryRow(vmFolder, it.id, it.name, idx)); @@ -74,11 +75,19 @@ export class SpVirtualMemChart { virtualMemoryRow.setAttribute('children', ''); virtualMemoryRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; virtualMemoryRow.selectChangeHandler = this.trace.selectChangeHandler; - virtualMemoryRow.supplier = () => - queryVirtualMemoryData(id).then((resultVm) => { - let maxValue = Math.max(...resultVm.map((it) => it.value || 0)); + virtualMemoryRow.supplierFrame = () => + virtualMemoryDataSender(id, virtualMemoryRow).then((resultVm) => { + let maxValue = 0; + if (!virtualMemoryRow.isComplete) { + maxValue = Math.max(...resultVm.map((it) => it.value || 0)); + virtualMemoryRow.setAttribute('maxValue', maxValue.toString() || ''); + } for (let j = 0; j < resultVm.length; j++) { - resultVm[j].maxValue = maxValue; + if (!virtualMemoryRow.isComplete) { + resultVm[j].maxValue = maxValue; + } else { + resultVm[j].maxValue = Number(virtualMemoryRow.getAttribute('maxValue')); + } if (j == resultVm.length - 1) { resultVm[j].duration = (TraceRow.range?.totalNS || 0) - (resultVm[j].startTime || 0); } else { @@ -118,7 +127,7 @@ export class SpVirtualMemChart { }, virtualMemoryRow ); - virtualMemoryRow.canvasRestore(context); + virtualMemoryRow.canvasRestore(context, this.trace); }; folder.addChildTraceRow(virtualMemoryRow); } diff --git a/ide/src/trace/component/chart/SpVmTrackerChart.ts b/ide/src/trace/component/chart/SpVmTrackerChart.ts index 544f6f69a..aced39d8f 100644 --- a/ide/src/trace/component/chart/SpVmTrackerChart.ts +++ b/ide/src/trace/component/chart/SpVmTrackerChart.ts @@ -15,18 +15,15 @@ import { SpSystemTrace } from '../SpSystemTrace'; import { - queryDmaSampsData, - queryGpuMemoryData, - querySmapsData, querySmapsExits, - queryVmTrackerShmData, - queryPurgeableProcessData, - queryGpuTotalData, queryGpuTotalType, - queryGpuWindowData, queryGpuWindowType, - queryGpuData, - queryGpuResourceData, + queryisExistsGpuMemoryData, + queryisExistsGpuData, + queryisExistsGpuResourceData, + queryisExistsShmData, + queryisExistsDmaData, + queryisExistsPurgeableData, } from '../../database/SqlLite'; import { TraceRow } from '../trace/base/TraceRow'; import { type BaseStruct } from '../../bean/BaseStruct'; @@ -38,6 +35,18 @@ import { type SnapshotRender, SnapshotStruct } from '../../database/ui-worker/Pr import { type TreeItemData } from '../../../base-ui/tree/LitTree'; import { MemoryConfig } from '../../bean/MemoryConfig'; import { TabPaneSmapsRecord } from '../trace/sheet/smaps/TabPaneSmapsRecord'; +import { + dmaDataSender, + gpuGpuDataSender, + gpuMemoryDataSender, + gpuResourceDataSender, + gpuTotalDataSender, + gpuWindowDataSender, + purgeableDataSender, + sMapsDataSender, + shmDataSender, +} from '../../database/data-trafic/VmTrackerDataSender'; +import { resetVmTracker } from '../../database/data-trafic/VmTrackerDataReceiver'; export class VmTrackerChart { private trace: SpSystemTrace; @@ -76,38 +85,49 @@ export class VmTrackerChart { for (const rowName of rowNameList) { await this.initSmapsRows(rowName); } - await this.initShmRows(); + const isExistsShm = await queryisExistsShmData(this.memoryConfig.iPid); + const isExistsDma = await queryisExistsDmaData(this.memoryConfig.iPid); + if (isExistsShm[0].data_exists) { + await this.initShmRows(); + } await this.initPurgeableVM(); - await this.initDmaRow(); - const gpuMemoryData = await queryGpuMemoryData(this.memoryConfig.iPid); - const gpuResource = await queryGpuResourceData(this.scratchId); - const graphArr = await queryGpuData(MemoryConfig.getInstance().iPid, "'mem.graph_pss'").then((res) => { - res.forEach((graph, index) => { - (graph as any).name = `SnapShot ${index}`; - }); - return res as SnapshotStruct[]; - }); - const glArr = await queryGpuData(MemoryConfig.getInstance().iPid, "'mem.gl_pss'").then((res) => { - res.forEach((gl, index) => { - (gl as any).name = `SnapShot ${index}`; - }); - return res as SnapshotStruct[]; - }); - if (gpuMemoryData.length > 0 || glArr.length > 0) { + // @ts-ignore + if (isExistsDma[0].data_exists) { + await this.initDmaRow(); + } + const isExistsGpuMemory = await queryisExistsGpuMemoryData(this.memoryConfig.iPid); + const isExistsGpuResource = await queryisExistsGpuResourceData(this.scratchId); + const isExistsGraph = await queryisExistsGpuData(MemoryConfig.getInstance().iPid, "'mem.graph_pss'"); + const isExistsGl = await queryisExistsGpuData(MemoryConfig.getInstance().iPid, "'mem.gl_pss'"); + + if ( + // @ts-ignore + isExistsGpuMemory[0].data_exists || + // @ts-ignore + isExistsGpuResource[0].data_exists || + // @ts-ignore + isExistsGraph[0].data_exists || + // @ts-ignore + isExistsGl[0].data_exists + ) { await this.initGpuFolder(); - if (gpuMemoryData.length > 0) { - await this.initGpuMemoryRow(gpuMemoryData); + // @ts-ignore + if (isExistsGpuMemory[0].data_exists) { + await this.initGpuMemoryRow(); } - if (gpuResource.length > 0) { - await this.initGpuResourceRow(gpuResource); + // @ts-ignore + if (isExistsGpuResource[0].data_exists) { + await this.initGpuResourceRow(this.scratchId); } else { this.smapsRecordTab!.GLESHostCache = []; } - if (graphArr.length > 0) { - await this.addGpuGraphRow(graphArr); + // @ts-ignore + if (isExistsGraph[0].data_exists) { + await this.addGpuGraphRow(); } - await this.addGpuGLRow(glArr); - if (glArr.length > 0) { + // @ts-ignore + if (isExistsGl[0].data_exists) { + await this.addGpuGLRow(); await this.addGpuTotalRow(); await this.addGpuWindowRow(); } @@ -127,7 +147,7 @@ export class VmTrackerChart { VmTrackerRow.name = `VM Tracker (${this.memoryConfig.processName} ${this.memoryConfig.pid})`; VmTrackerRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; VmTrackerRow.selectChangeHandler = this.trace.selectChangeHandler; - VmTrackerRow.supplier = (): Promise> => + VmTrackerRow.supplierFrame = (): Promise> => new Promise>((resolve) => resolve([])); VmTrackerRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; @@ -149,7 +169,7 @@ export class VmTrackerChart { VmTrackerRow ); } - VmTrackerRow.canvasRestore(context); + VmTrackerRow.canvasRestore(context, this.trace); }; this.rowFolder = VmTrackerRow; this.trace.rowsEL?.appendChild(VmTrackerRow); @@ -168,7 +188,7 @@ export class VmTrackerChart { sMapsRow.style.width = '100%'; sMapsRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; sMapsRow.selectChangeHandler = this.trace.selectChangeHandler; - sMapsRow.supplier = (): Promise> => + sMapsRow.supplierFrame = (): Promise> => new Promise>((resolve) => resolve([])); sMapsRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; @@ -190,7 +210,7 @@ export class VmTrackerChart { sMapsRow ); } - sMapsRow.canvasRestore(context); + sMapsRow.canvasRestore(context, this.trace); }; this.sMapsFolder = sMapsRow; this.rowFolder?.addChildTraceRow(sMapsRow); @@ -208,7 +228,7 @@ export class VmTrackerChart { gpuTraceRow.name = 'GPU'; gpuTraceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; gpuTraceRow.selectChangeHandler = this.trace.selectChangeHandler; - gpuTraceRow.supplier = (): Promise> => + gpuTraceRow.supplierFrame = (): Promise> => new Promise>((resolve) => resolve([])); gpuTraceRow.onThreadHandler = (useCache): void => { let context: CanvasRenderingContext2D; @@ -230,7 +250,7 @@ export class VmTrackerChart { gpuTraceRow ); } - gpuTraceRow.canvasRestore(context); + gpuTraceRow.canvasRestore(context, this.trace); }; this.gpuFolder = gpuTraceRow; this.rowFolder.addChildTraceRow(gpuTraceRow); @@ -260,79 +280,74 @@ export class VmTrackerChart { let sMapsTraceRow = this.initTraceRow(rowName, TraceRow.ROW_TYPE_VM_TRACKER_SMAPS, 'smapsRow'); sMapsTraceRow.rowHidden = !this.sMapsFolder.expansion; sMapsTraceRow.folderTextLeft = 40; - let sMapsData = await querySmapsData(this.getSmapsKeyName(rowName)); - for (let i = 0; i < sMapsData.length; i++) { - sMapsData[i].name = `Snapshot${i}`; - } - sMapsTraceRow.supplier = (): Promise> => - new Promise>((resolve) => resolve(sMapsData)); + sMapsTraceRow.supplierFrame = (): Promise> => { + return sMapsDataSender(this.getSmapsKeyName(rowName), sMapsTraceRow).then((sMaps: any[]) => { + this.setName(sMaps); + return sMaps; + }); + }; this.sMapsFolder.addChildTraceRow(sMapsTraceRow); }; private initShmRows = async (): Promise => { let shmTraceRow = this.initTraceRow('SHM', TraceRow.ROW_TYPE_VMTRACKER_SHM, 'VmTrackerRow'); - let shmData = await queryVmTrackerShmData(this.memoryConfig.iPid); - for (let i = 0; i < shmData.length; i++) { - shmData[i].name = `Snapshot${i}`; - } - shmTraceRow.supplier = (): Promise> => - new Promise>((resolve) => resolve(shmData)); - if (shmData.length > 0) { - this.rowFolder.addChildTraceRow(shmTraceRow); - } + shmTraceRow.supplierFrame = (): Promise> => { + return shmDataSender(this.memoryConfig.iPid, shmTraceRow).then((shmData: any[]) => { + this.setName(shmData); + return shmData; + }); + }; + this.rowFolder.addChildTraceRow(shmTraceRow); }; private async initPurgeableTotal(): Promise { - let purgeableTotalData = await queryPurgeableProcessData(this.memoryConfig.iPid); - if (purgeableTotalData.length > 0) { - for (let i = 0; i < purgeableTotalData.length; i++) { - purgeableTotalData[i].name = `Snapshot${i}`; - } - let totalTraceRow = this.initTraceRow('Purgeable Total', TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM, 'VmTrackerRow'); - totalTraceRow.supplier = (): Promise> => - new Promise>((resolve) => resolve(purgeableTotalData)); - this.rowFolder.addChildTraceRow(totalTraceRow); - } + let totalTraceRow = this.initTraceRow('Purgeable Total', TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM, 'VmTrackerRow'); + totalTraceRow.supplierFrame = (): Promise> => { + return purgeableDataSender(this.memoryConfig.iPid, totalTraceRow, false).then((purgeableTotalData: any[]) => { + this.setName(purgeableTotalData); + return purgeableTotalData; + }); + }; + this.rowFolder.addChildTraceRow(totalTraceRow); } private async initPurgeablePin(): Promise { - let purgeablePinData = await queryPurgeableProcessData(this.memoryConfig.iPid, true); - if (purgeablePinData.length > 0) { - for (let i = 0; i < purgeablePinData.length; i++) { - purgeablePinData[i].name = `Snapshot${i}`; - } - let pinTraceRow = this.initTraceRow('Purgeable Pin', TraceRow.ROW_TYPE_PURGEABLE_PIN_VM, 'VmTrackerRow'); - pinTraceRow.supplier = (): Promise> => - new Promise>((resolve) => resolve(purgeablePinData)); - this.rowFolder.addChildTraceRow(pinTraceRow); - } + let pinTraceRow = this.initTraceRow('Purgeable Pin', TraceRow.ROW_TYPE_PURGEABLE_PIN_VM, 'VmTrackerRow'); + pinTraceRow.supplierFrame = (): Promise> => { + return purgeableDataSender(this.memoryConfig.iPid, pinTraceRow, true).then((purgeablePinData: any[]) => { + this.setName(purgeablePinData); + return purgeablePinData; + }); + }; + this.rowFolder.addChildTraceRow(pinTraceRow); } private initPurgeableVM = async (): Promise => { let time = new Date().getTime(); - await this.initPurgeableTotal(); - await this.initPurgeablePin(); + const isExistsPurgeableTotal = await queryisExistsPurgeableData(this.memoryConfig.iPid, false); + const isExistsPurgeablePin = await queryisExistsPurgeableData(this.memoryConfig.iPid, true); + if (isExistsPurgeableTotal[0].data_exists) { + await this.initPurgeableTotal(); + } + if (isExistsPurgeablePin[0].data_exists) { + await this.initPurgeablePin(); + } let durTime = new Date().getTime() - time; info('The time to load the VM Purgeable is: ', durTime); }; private initDmaRow = async (): Promise => { - let dmaData = await queryDmaSampsData(this.memoryConfig.iPid); - if (dmaData.length > 0) { - for (let i = 0; i < dmaData.length; i++) { - dmaData[i].name = `Snapshot${i}`; - } - let dmaTraceRow = this.initTraceRow('DMA', TraceRow.ROW_TYPE_DMA_VMTRACKER, 'VmTrackerRow'); - dmaTraceRow.supplier = (): Promise> => - new Promise>((resolve) => resolve(dmaData)); - this.rowFolder.addChildTraceRow(dmaTraceRow); - } + let dmaTraceRow = this.initTraceRow('DMA', TraceRow.ROW_TYPE_DMA_VMTRACKER, 'VmTrackerRow'); + dmaTraceRow.supplierFrame = (): Promise> => { + return dmaDataSender(this.memoryConfig.iPid, dmaTraceRow).then((dmaData: any[]) => { + this.setName(dmaData); + return dmaData; + }); + }; + this.rowFolder.addChildTraceRow(dmaTraceRow); }; - private initGpuMemoryRow = async (gpuMemoryData: Array): Promise => { - for (let i = 0; i < gpuMemoryData.length; i++) { - gpuMemoryData[i].name = `Snapshot${i}`; - } + private initGpuMemoryRow = async (): Promise => { let gpuMemoryTraceRow = this.initTraceRow( 'Skia Gpu Memory', TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER, @@ -340,17 +355,16 @@ export class VmTrackerChart { ); gpuMemoryTraceRow.rowHidden = !this.gpuFolder.expansion; gpuMemoryTraceRow.folderTextLeft = 40; - gpuMemoryTraceRow.supplier = (): Promise> => - new Promise>((resolve) => resolve(gpuMemoryData)); + gpuMemoryTraceRow.supplierFrame = (): Promise> => { + return gpuMemoryDataSender(this.memoryConfig.iPid, gpuMemoryTraceRow).then((gpuMemoryData: any[]) => { + this.setName(gpuMemoryData); + return gpuMemoryData; + }); + }; this.gpuFolder.addChildTraceRow(gpuMemoryTraceRow); }; - private initGpuResourceRow = async (gpuResourceData: Array): Promise => { - for (let i = 0; i < gpuResourceData.length; i++) { - gpuResourceData[i].name = `Snapshot${i}`; - } - // 将泳道图数据传递给Native Heap Tab页 - this.smapsRecordTab!.GLESHostCache = gpuResourceData; + private initGpuResourceRow = async (scratchId: number): Promise => { let gpuMemoryTraceRow = this.initTraceRow( 'Gpu Resource', TraceRow.ROW_TYPE_GPU_RESOURCE_VMTRACKER, @@ -358,32 +372,46 @@ export class VmTrackerChart { ); gpuMemoryTraceRow.rowHidden = !this.gpuFolder.expansion; gpuMemoryTraceRow.folderTextLeft = 40; - gpuMemoryTraceRow.supplier = (): Promise> => - new Promise>((resolve) => resolve(gpuResourceData)); + gpuMemoryTraceRow.supplierFrame = (): Promise> => { + return gpuResourceDataSender(scratchId, gpuMemoryTraceRow).then((gpuResourceData: any[]) => { + this.setName(gpuResourceData); + // 将泳道图数据传递给Native Heap Tab页 + this.smapsRecordTab!.GLESHostCache = gpuResourceData; + return gpuResourceData; + }); + }; this.gpuFolder.addChildTraceRow(gpuMemoryTraceRow); }; - private async addGpuGraphRow(graphArr: Array): Promise { + private async addGpuGraphRow(): Promise { let graphRow = this.initTraceRow('Graph', TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH, this.gpuFolder.rowId!); graphRow.addTemplateTypes('sys-memory'); graphRow.folderTextLeft = 40; - graphRow.supplier = () => new Promise((resolve) => resolve(graphArr)); + graphRow.supplierFrame = (): Promise => { + return gpuGpuDataSender(this.memoryConfig.iPid, "'mem.graph_pss'", graphRow).then((graphData: any[]) => { + this.setName(graphData); + return graphData; + }); + }; this.gpuFolder.addChildTraceRow(graphRow); } - private async addGpuGLRow(glArr: Array): Promise { - if (glArr.length > 0) { - let glRow = this.initTraceRow('GL', TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL, this.gpuFolder.rowId!); - glRow.addTemplateTypes('sys-memory'); - glRow.folderTextLeft = 40; - glRow.supplier = (): Promise => new Promise((resolve) => resolve(glArr)); - this.gpuFolder.addChildTraceRow(glRow); - } + private async addGpuGLRow(): Promise { + let glRow = this.initTraceRow('GL', TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL, this.gpuFolder.rowId!); + glRow.addTemplateTypes('sys-memory'); + glRow.folderTextLeft = 40; + glRow.supplierFrame = (): Promise => { + return gpuGpuDataSender(this.memoryConfig.iPid, "'mem.gl_pss'", glRow).then((glData: any[]) => { + this.setName(glData); + return glData; + }); + }; + this.gpuFolder.addChildTraceRow(glRow); } private async addGpuTotalRow(): Promise { let types = await queryGpuTotalType(); - if (!types || types.length == 0) { + if (!types || types.length === 0) { return; } let gpuTotalRow = this.initTraceRow( @@ -421,15 +449,14 @@ export class VmTrackerChart { gpuTotalRow.dataList = []; gpuTotalRow.isComplete = false; VmTrackerChart.gpuTotalModule = setting[0] === 'total' ? null : parseInt(setting[0]); - this.trace.refreshCanvas(false); + gpuTotalRow.needRefresh = true; + gpuTotalRow.drawFrame(); } }; - gpuTotalRow.supplier = (): Promise> => { - return queryGpuTotalData(VmTrackerChart.gpuTotalModule).then((res) => { - res.forEach((it, index) => { - (it as any).name = `SnapShot ${index}`; - }); - return res as SnapshotStruct[]; + gpuTotalRow.supplierFrame = (): Promise> => { + return gpuTotalDataSender(VmTrackerChart.gpuTotalModule, gpuTotalRow).then((gpuTotalData: any[]) => { + this.setName(gpuTotalData); + return gpuTotalData; }); }; this.gpuFolder.addChildTraceRow(gpuTotalRow); @@ -480,16 +507,17 @@ export class VmTrackerChart { gpuWindowRow.dataListCache = []; gpuWindowRow.dataList = []; gpuWindowRow.isComplete = false; - this.trace.refreshCanvas(false); + gpuWindowRow.needRefresh = true; + gpuWindowRow.drawFrame(); } }; - gpuWindowRow.supplier = () => { - return queryGpuWindowData(VmTrackerChart.gpuWindow!, VmTrackerChart.gpuWindowModule).then((res) => { - res.forEach((window, index) => { - (window as any).name = `SnapShot ${index}`; - }); - return res as SnapshotStruct[]; - }); + gpuWindowRow.supplierFrame = () => { + return gpuWindowDataSender(VmTrackerChart.gpuWindow!, VmTrackerChart.gpuWindowModule, gpuWindowRow).then( + (gpuWindowData: any[]) => { + this.setName(gpuWindowData); + return gpuWindowData; + } + ); }; this.gpuFolder.addChildTraceRow(gpuWindowRow); } @@ -528,7 +556,7 @@ export class VmTrackerChart { }, vmTrackerTraceRow ); - vmTrackerTraceRow.canvasRestore(context); + vmTrackerTraceRow.canvasRestore(context, this.trace); }; return vmTrackerTraceRow; } @@ -541,4 +569,12 @@ export class VmTrackerChart { Size: ${Utils.getBinaryByteWithUnit(SnapshotStruct.hoverSnapshotStruct?.value || 0)}` ); } + + private setName(data: Array): void { + if (data.length > 0) { + data.forEach((item, index) => { + item.name = `SnapShot ${index}`; + }); + } + } } diff --git a/ide/src/trace/component/chart/VSync.ts b/ide/src/trace/component/chart/VSync.ts index 2d4206814..f889e05b3 100644 --- a/ide/src/trace/component/chart/VSync.ts +++ b/ide/src/trace/component/chart/VSync.ts @@ -71,11 +71,11 @@ export async function setVSyncData(): Promise { sfvSyncData = await querySingleVSyncData(); isSingle = true; } - sfvSyncData.forEach((it, index, array) => { + sfvSyncData.forEach((it, index, array): void => { if (index < array.length - 1) { it.dur = array[index + 1].startTime - it.startTime; } else { - it.dur = (window as any).totalNS - it.startTime; + it.dur = window.totalNS - it.startTime; } }); vSyncDataList = sfvSyncData; @@ -115,6 +115,7 @@ export function drawVSync(ctx: CanvasRenderingContext2D, width: number, height: }); } ctx.stroke(); + ctx.globalAlpha = 1.0; ctx.closePath(); } diff --git a/ide/src/trace/component/schedulingAnalysis/SpSchedulingAnalysis.ts b/ide/src/trace/component/schedulingAnalysis/SpSchedulingAnalysis.ts index 123cf0d84..9448a0834 100644 --- a/ide/src/trace/component/schedulingAnalysis/SpSchedulingAnalysis.ts +++ b/ide/src/trace/component/schedulingAnalysis/SpSchedulingAnalysis.ts @@ -44,7 +44,7 @@ export class SpSchedulingAnalysis extends BaseElement { SpSchedulingAnalysis.traceChange = true; CheckCpuSetting.resetCpuSettings(); Top20FrequencyThread.threads = undefined; - procedurePool.submitWithName('logic1', 'scheduling-clearData', {}, undefined, (res: any) => {}); + procedurePool.submitWithName('logic0', 'scheduling-clearData', {}, undefined, (res: any) => {}); } init() { diff --git a/ide/src/trace/component/schedulingAnalysis/TabCpuAnalysis.ts b/ide/src/trace/component/schedulingAnalysis/TabCpuAnalysis.ts index ac2ac1a06..9937fa665 100644 --- a/ide/src/trace/component/schedulingAnalysis/TabCpuAnalysis.ts +++ b/ide/src/trace/component/schedulingAnalysis/TabCpuAnalysis.ts @@ -145,7 +145,7 @@ export class TabCpuAnalysis extends BaseElement { queryLogicWorker(cpuAnalysisType: string, log: string, handler: (res: any) => void) { let cpuAnalysisTime = new Date().getTime(); procedurePool.submitWithName( - 'logic1', + 'logic0', cpuAnalysisType, { endTs: SpSchedulingAnalysis.endTs, diff --git a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsFrequency.ts b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsFrequency.ts index cd2aaaa10..a8e5199ad 100644 --- a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsFrequency.ts +++ b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsFrequency.ts @@ -167,7 +167,7 @@ export class TabCpuDetailsFrequency extends BaseElement { queryLoginWorker(cpuFrequencyType: string, log: string, handler: (res: any) => void) { let cpuDetailsFrequencyTime = new Date().getTime(); procedurePool.submitWithName( - 'logic1', + 'logic0', cpuFrequencyType, { endTs: SpSchedulingAnalysis.endTs, diff --git a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsIdle.ts b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsIdle.ts index c9a5c04cf..7b1c5516e 100644 --- a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsIdle.ts +++ b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsIdle.ts @@ -154,7 +154,7 @@ export class TabCpuDetailsIdle extends BaseElement { queryLoginWorker(idleType: string, log: string, handler: (res: any) => void) { let cpuDetailsldleTime = new Date().getTime(); procedurePool.submitWithName( - 'logic1', + 'logic0', idleType, { endTs: SpSchedulingAnalysis.endTs, diff --git a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsIrq.ts b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsIrq.ts index 85d348191..99f571b97 100644 --- a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsIrq.ts +++ b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsIrq.ts @@ -148,7 +148,7 @@ export class TabCpuDetailsIrq extends BaseElement { queryLoginWorker(irqType: string, log: string, handler: (res: any) => void) { let cpuDetailsLrqTime = new Date().getTime(); procedurePool.submitWithName( - 'logic1', + 'logic0', irqType, { endTs: SpSchedulingAnalysis.endTs, diff --git a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts index 67eeb8f09..c3fab0134 100644 --- a/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts +++ b/ide/src/trace/component/schedulingAnalysis/TabCpuDetailsThreads.ts @@ -80,7 +80,7 @@ export class TabCpuDetailsThreads extends BaseElement { 'Threads in Freq ' + it.value; this.progress!.loading = true; procedurePool.submitWithName( - 'logic1', + 'logic0', 'scheduling-CPU Frequency Thread', { cpu: cpu, freq: (it as any).value }, undefined, diff --git a/ide/src/trace/component/schedulingAnalysis/Top20FrequencyThread.ts b/ide/src/trace/component/schedulingAnalysis/Top20FrequencyThread.ts index 8791963a5..ca8954fd4 100644 --- a/ide/src/trace/component/schedulingAnalysis/Top20FrequencyThread.ts +++ b/ide/src/trace/component/schedulingAnalysis/Top20FrequencyThread.ts @@ -235,7 +235,7 @@ export class Top20FrequencyThread extends BaseElement { queryLogicWorker(option: string, log: string, handler: (res: any) => void) { let frequencyThreadTime = new Date().getTime(); - procedurePool.submitWithName('logic1', option, { tid: this.currentTid }, undefined, handler); + procedurePool.submitWithName('logic0', option, { tid: this.currentTid }, undefined, handler); let durTime = new Date().getTime() - frequencyThreadTime; info(log, durTime); } diff --git a/ide/src/trace/component/schedulingAnalysis/Top20ProcessSwitchCount.ts b/ide/src/trace/component/schedulingAnalysis/Top20ProcessSwitchCount.ts index a6535146a..290db1d32 100644 --- a/ide/src/trace/component/schedulingAnalysis/Top20ProcessSwitchCount.ts +++ b/ide/src/trace/component/schedulingAnalysis/Top20ProcessSwitchCount.ts @@ -120,7 +120,7 @@ export class Top20ProcessSwitchCount extends BaseElement { queryLogicWorker(option: string, log: string, handler: (res: any) => void) { let processSwitchCountTime = new Date().getTime(); - procedurePool.submitWithName('logic1', option, {}, undefined, handler); + procedurePool.submitWithName('logic0', option, {}, undefined, handler); let durTime = new Date().getTime() - processSwitchCountTime; info(log, durTime); } diff --git a/ide/src/trace/component/schedulingAnalysis/Top20ProcessThreadCount.ts b/ide/src/trace/component/schedulingAnalysis/Top20ProcessThreadCount.ts index 5d3296977..3d9e0e998 100644 --- a/ide/src/trace/component/schedulingAnalysis/Top20ProcessThreadCount.ts +++ b/ide/src/trace/component/schedulingAnalysis/Top20ProcessThreadCount.ts @@ -121,7 +121,7 @@ export class Top20ProcessThreadCount extends BaseElement { queryLogicWorker(option: string, log: string, handler: (res: any) => void) { let processThreadCountTime = new Date().getTime(); - procedurePool.submitWithName('logic1', option, {}, undefined, handler); + procedurePool.submitWithName('logic0', option, {}, undefined, handler); let durTime = new Date().getTime() - processThreadCountTime; info(log, durTime); } diff --git a/ide/src/trace/component/schedulingAnalysis/Top20ThreadCpuUsage.ts b/ide/src/trace/component/schedulingAnalysis/Top20ThreadCpuUsage.ts index b2466e34e..bce9c87ff 100644 --- a/ide/src/trace/component/schedulingAnalysis/Top20ThreadCpuUsage.ts +++ b/ide/src/trace/component/schedulingAnalysis/Top20ThreadCpuUsage.ts @@ -401,7 +401,7 @@ export class Top20ThreadCpuUsage extends BaseElement { queryLogicWorker(option: string, log: string, handler: (res: any) => void) { let time = new Date().getTime(); procedurePool.submitWithName( - 'logic1', + 'logic0', option, { bigCores: CheckCpuSetting.big_cores, diff --git a/ide/src/trace/component/schedulingAnalysis/Top20ThreadRunTime.ts b/ide/src/trace/component/schedulingAnalysis/Top20ThreadRunTime.ts index dbd1c6d6b..107a721bb 100644 --- a/ide/src/trace/component/schedulingAnalysis/Top20ThreadRunTime.ts +++ b/ide/src/trace/component/schedulingAnalysis/Top20ThreadRunTime.ts @@ -77,7 +77,7 @@ export class Top20ThreadRunTime extends BaseElement { queryLogicWorker(option: string, log: string, handler: (res: any) => void) { let threadRunTime = new Date().getTime(); - procedurePool.submitWithName('logic1', option, { cpuMax: SpSchedulingAnalysis.cpuCount - 1 }, undefined, handler); + procedurePool.submitWithName('logic0', option, { cpuMax: SpSchedulingAnalysis.cpuCount - 1 }, undefined, handler); let durTime = new Date().getTime() - threadRunTime; info(log, durTime); } diff --git a/ide/src/trace/component/setting/SpProbesConfig.ts b/ide/src/trace/component/setting/SpProbesConfig.ts index ac676627f..d3f3582e2 100644 --- a/ide/src/trace/component/setting/SpProbesConfig.ts +++ b/ide/src/trace/component/setting/SpProbesConfig.ts @@ -66,7 +66,7 @@ export class SpProbesConfig extends BaseElement { if (this.ftraceBufferSizeResult?.hasAttribute('percent')) { return Number(this.ftraceBufferSizeResult?.getAttribute('percent')); } - return 102400; + return 20480; } get memoryConfig() { @@ -312,7 +312,7 @@ export class SpProbesConfig extends BaseElement { ftraceBufferSizeSlider.sliderStyle = { minRange: 2048, maxRange: 307200, - defaultValue: '102400', + defaultValue: '20480', resultUnit: 'KB', stepSize: 2, lineColor: 'var(--dark-color3,#46B1E3)', @@ -332,10 +332,10 @@ export class SpProbesConfig extends BaseElement { if (this.ftraceBufferSizeResult!.hasAttribute('percent')) { ftraceBuffSizeResultInput.value = Number(this.ftraceBufferSizeResult!.getAttribute('percent')).toString(); } else { - ftraceBuffSizeResultInput.value = '102400'; + ftraceBuffSizeResultInput.value = '20480'; } }); - ftraceBufferSizeSliderParent.setAttribute('percent', '102400'); + ftraceBufferSizeSliderParent.setAttribute('percent', '20480'); ftraceBuffSizeResultInput.style.color = 'var(--dark-color1,#000000)'; ftraceBuffSizeResultInput.addEventListener('input', (ev) => { if (this.ftraceBufferSizeResult!.hasAttribute('percent')) { @@ -346,7 +346,7 @@ export class SpProbesConfig extends BaseElement { ftraceBuffSizeResultInput.style.backgroundColor = 'var(--dark-background5,#F2F2F2)'; if (ftraceBuffSizeResultInput.value.trim() === '') { ftraceBuffSizeResultInput.style.color = 'red'; - ftraceBufferSizeSliderParent.setAttribute('percent', '102400'); + ftraceBufferSizeSliderParent.setAttribute('percent', '20480'); return; } let ftraceBufferSize = Number(ftraceBuffSizeResultInput.value); @@ -355,7 +355,7 @@ export class SpProbesConfig extends BaseElement { ftraceBufferSize > ftraceBufferSizeSlider!.sliderStyle.maxRange ) { ftraceBuffSizeResultInput.parentElement!.classList.add('border-red'); - ftraceBufferSizeSliderParent.setAttribute('percent', '102400'); + ftraceBufferSizeSliderParent.setAttribute('percent', '20480'); } else { ftraceBuffSizeResultInput.parentElement!.classList.remove('border-red'); ftraceBufferSizeSlider!.percent = ftraceBuffSizeResultInput.value; @@ -368,8 +368,8 @@ export class SpProbesConfig extends BaseElement { ftraceBuffSizeResultInput.addEventListener('focusout', (ev) => { if (ftraceBuffSizeResultInput.value.trim() === '') { ftraceBuffSizeResultInput.parentElement!.classList.remove('border-red'); - ftraceBufferSizeSliderParent.setAttribute('percent', '102400'); - ftraceBuffSizeResultInput.value = '102400'; + ftraceBufferSizeSliderParent.setAttribute('percent', '20480'); + ftraceBuffSizeResultInput.value = '20480'; ftraceBuffSizeResultInput.style.color = 'var(--dark-color,#6a6f77)'; ftraceBufferSizeSliderParent.setAttribute('percent', ftraceBuffSizeResultInput.value); ftraceBufferSizeSliderParent.setAttribute('percentValue', ftraceBuffSizeResultInput.value); @@ -587,7 +587,7 @@ export class SpProbesConfig extends BaseElement {
- + KB
diff --git a/ide/src/trace/component/setting/SpRecordSetting.ts b/ide/src/trace/component/setting/SpRecordSetting.ts index cafce6e1b..7edad0257 100644 --- a/ide/src/trace/component/setting/SpRecordSetting.ts +++ b/ide/src/trace/component/setting/SpRecordSetting.ts @@ -51,7 +51,7 @@ export class SpRecordSetting extends BaseElement { } get longOutPath(): string { - if (this.outputPath && this.outputPath.value !== '' && this.outputPath.value !== 'long_trace/') { + if (this.outputPath && this.outputPath.value !== '' && this.outputPath.value !== 'long_trace') { return `/data/local/tmp/${this.outputPath.value}/`; } return '/data/local/tmp/long_trace/'; @@ -228,7 +228,7 @@ export class SpRecordSetting extends BaseElement { this.longTraceRadio.addEventListener('click', () => { SpApplication.isLongTrace = true; rootEl.appendChild(longTraceMaxSlide); - this.outputPath!.value = 'long_trace/'; + this.outputPath!.value = 'long_trace'; }); } diff --git a/ide/src/trace/component/setting/SpRecordTemplate.ts b/ide/src/trace/component/setting/SpRecordTemplate.ts index 47cef3107..ea64abc86 100644 --- a/ide/src/trace/component/setting/SpRecordTemplate.ts +++ b/ide/src/trace/component/setting/SpRecordTemplate.ts @@ -152,7 +152,7 @@ export class SpRecordTemplate extends BaseElement { hitraceCategories: hitraceCategories, flushIntervalMs: 1000, hitraceApps: [], - bufferSizeKb: 102400, + bufferSizeKb: 2048, debugOn: false, flushThresholdKb: 4096, clock: 'boot', diff --git a/ide/src/trace/component/setting/SpSdkConfig.ts b/ide/src/trace/component/setting/SpSdkConfig.ts index e032a9250..61476821e 100644 --- a/ide/src/trace/component/setting/SpSdkConfig.ts +++ b/ide/src/trace/component/setting/SpSdkConfig.ts @@ -21,6 +21,7 @@ import '../../../base-ui/switch/lit-switch'; import LitSwitch, { LitSwitchChangeEvent } from '../../../base-ui/switch/lit-switch'; import { LitSelectV } from '../../../base-ui/select/LitSelectV'; import { LitAllocationSelect } from '../../../base-ui/select/LitAllocationSelect'; + @element('sp-sdk-config') export class SpSdkConfig extends BaseElement { private worker: Worker | undefined; @@ -167,7 +168,6 @@ export class SpSdkConfig extends BaseElement { if (window.useWb) { return; } - this.worker = new Worker(new URL('../../database/ConfigWorker', import.meta.url)); } } catch (e) {} diff --git a/ide/src/trace/component/trace/SpChartList.ts b/ide/src/trace/component/trace/SpChartList.ts index cf716adee..2ab4e0b39 100644 --- a/ide/src/trace/component/trace/SpChartList.ts +++ b/ide/src/trace/component/trace/SpChartList.ts @@ -31,7 +31,6 @@ import { TimerShaftElement } from './TimerShaftElement'; import { CpuStruct } from '../../database/ui-worker/ProcedureWorkerCPU'; import { WakeupBean } from '../../bean/WakeupBean'; import { LitIcon } from '../../../base-ui/icon/LitIcon'; -import { drawVSync } from '../chart/VSync'; const maxScale = 0.8; //收藏最大高度为界面最大高度的80% const topHeight = 150; // 顶部cpu使用率部分高度固定为150px @@ -354,7 +353,7 @@ export class SpChartList extends BaseElement { this.fragmentGroup1.appendChild(row); } this.collectEl1?.appendChild(this.fragmentGroup1); - this.scrollTo({ top: this.collectEl1?.clientHeight || 0 }); + this.scrollTo({ top: this.collectEl1?.clientHeight }); } else { if (!this.collect2Expand) { this.collect2Expand = true; @@ -506,10 +505,6 @@ export class SpChartList extends BaseElement { drawLinkLines(this.canvasCtx!, nodes, tse, isFavorite, favoriteHeight); } - drawVSync(width: number, height: number) { - drawVSync(this.canvasCtx!, width, height); - } - refreshFavoriteCanvas(): void { this.canvas!.style.width = `${this.clientWidth - 248}px`; this.canvas!.style.left = `248px`; diff --git a/ide/src/trace/component/trace/base/ColorUtils.ts b/ide/src/trace/component/trace/base/ColorUtils.ts index e2046a2b0..fd9074b4f 100644 --- a/ide/src/trace/component/trace/base/ColorUtils.ts +++ b/ide/src/trace/component/trace/base/ColorUtils.ts @@ -87,25 +87,30 @@ export class ColorUtils { ]; public static MD_PALETTE: Array = ColorUtils.FUNC_COLOR_B; public static FUNC_COLOR: Array = ColorUtils.FUNC_COLOR_B; - public static getHilogColor(loglevel: string): string { + public static getHilogColor(loglevel: string | number): string { let logColor: string = '#00000'; switch (loglevel) { + case 0: case 'D': case 'Debug': logColor = '#00BFBF'; break; + case 1: case 'I': case 'Info': logColor = '#00BF00'; break; + case 2: case 'W': case 'Warn': logColor = '#BFBF00'; break; + case 3: case 'E': case 'Error': logColor = '#FF4040'; break; + case 4: case 'F': case 'Fatal': logColor = '#BF00A4'; @@ -116,12 +121,14 @@ export class ColorUtils { return logColor; } - public static getHisysEventColor(level: string): string { + public static getHisysEventColor(level: string | number): string { let eventColor: string = '#00000'; switch (level) { + case 0: case 'MINOR': eventColor = '#000000'; break; + case 1: case 'CRITICAL': eventColor = '#FF4040'; break; diff --git a/ide/src/trace/component/trace/base/Extension.ts b/ide/src/trace/component/trace/base/Extension.ts index 90ff2595a..92027f5c5 100644 --- a/ide/src/trace/component/trace/base/Extension.ts +++ b/ide/src/trace/component/trace/base/Extension.ts @@ -39,6 +39,12 @@ declare global { } interface Window { + postMessage(message: any, transfer?: Transferable[]): void; + // queryFromWasm: boolean;//use cache or query from db + isLastFrame: boolean; //last frame mast be draw + recordStartNS: number; + recordEndNS: number; + totalNS: number; SmartEvent: { UI: { MenuTrace: string; //selected menu trace @@ -60,6 +66,8 @@ declare global { DeviceDisConnect: string; HoverNull: string; KeyPath: string; + LoadFinish: string; + LoadFinishFrame: string; }; }; @@ -117,6 +125,8 @@ window.SmartEvent = { DeviceDisConnect: 'SmartEvent-DEVICE_DISCONNECT', HoverNull: 'SmartEvent-Hover-NULL', KeyPath: 'SmartEvent-UI-UploadKeyPath', + LoadFinish: 'SmartEvent-UI-LoadFinish',//所有泳道刷新完成触发 + LoadFinishFrame: 'SmartEvent-UI-LoadFinishFrame',//单个泳道刷新完成触发 }, }; Window.prototype.subscribe = (ev, fn) => EventCenter.subscribe(ev, fn); diff --git a/ide/src/trace/component/trace/base/RangeSelect.ts b/ide/src/trace/component/trace/base/RangeSelect.ts index a052cd6c6..a46dfbf4d 100644 --- a/ide/src/trace/component/trace/base/RangeSelect.ts +++ b/ide/src/trace/component/trace/base/RangeSelect.ts @@ -15,7 +15,7 @@ import { RangeSelectStruct, TraceRow } from './TraceRow'; import { Rect } from '../timer-shaft/Rect'; -import { ns2x, TimerShaftElement } from '../TimerShaftElement'; +import { TimerShaftElement } from '../TimerShaftElement'; import { info } from '../../../../log/Log'; import './Extension'; import { SpSystemTrace } from '../../SpSystemTrace'; @@ -24,7 +24,6 @@ import { querySearchRowFuncData } from '../../../database/SqlLite'; export class RangeSelect { private rowsEL: HTMLDivElement | undefined | null; private rowsPaneEL: HTMLDivElement | undefined | null; - // private favoriteRowsEL: HTMLDivElement | undefined | null; isMouseDown: boolean = false; public rangeTraceRow: Array> | undefined; public selectHandler: ((ds: Array>, refreshCheckBox: boolean) => void) | undefined; @@ -33,24 +32,20 @@ export class RangeSelect { private endPageX: number = 0; private endPageY: number = 0; private timerShaftEL: TimerShaftElement | null | undefined; - private timerShaftDragEL: HTMLDivElement | null | undefined; private isHover: boolean = false; private movingMark: string = ''; private mark: { startMark: number; endMark: number } = { startMark: 0, endMark: 0, }; - // private readonly spacerEL: HTMLDivElement; private trace: SpSystemTrace | null | undefined; drag = false; + constructor(trace: SpSystemTrace | null | undefined) { this.trace = trace; this.timerShaftEL = trace?.timerShaftEL; - this.timerShaftDragEL = this.timerShaftEL?.shadowRoot?.querySelector('.total > div:nth-child(1)'); - // this.spacerEL = trace?.spacerEL!; this.rowsEL = trace?.rowsEL; this.rowsPaneEL = trace?.rowsPaneEL; - // this.favoriteRowsEL = trace?.favoriteRowsEL; } isInRowsEl(ev: MouseEvent): boolean { @@ -61,7 +56,7 @@ export class RangeSelect { return this.trace!.favoriteChartListEL!.containPoint(ev, { left: 248 }); } - mouseDown(eventDown: MouseEvent) { + mouseDown(eventDown: MouseEvent): void { this.startPageX = eventDown.pageX; this.startPageY = eventDown.pageY; if (this.isHover) { @@ -73,7 +68,7 @@ export class RangeSelect { TraceRow.rangeSelectObject = undefined; } - mouseUp(mouseEventUp: MouseEvent) { + mouseUp(mouseEventUp: MouseEvent): void { this.endPageX = mouseEventUp.pageX; this.endPageY = mouseEventUp.pageY; if (this.drag) { @@ -110,7 +105,7 @@ export class RangeSelect { } isDrag(): boolean { - return this.startPageX != this.endPageX; + return this.startPageX !== this.endPageX; } isTouchMark(ev: MouseEvent): boolean { @@ -127,7 +122,7 @@ export class RangeSelect { return notTimeHeight && (this.rangeTraceRow?.isNotEmpty() ?? false) && !this.isMouseDown; } - mouseOut(mouseEventOut: MouseEvent) { + mouseOut(mouseEventOut: MouseEvent): void { this.endPageX = mouseEventOut.pageX; this.endPageY = mouseEventOut.pageY; if (this.drag) { @@ -139,7 +134,7 @@ export class RangeSelect { this.isMouseDown = false; } - mouseMove(rows: Array>, ev: MouseEvent) { + mouseMove(rows: Array>, ev: MouseEvent): void { this.endPageX = ev.pageX; this.endPageY = ev.pageY; if (this.isTouchMark(ev) && TraceRow.rangeSelectObject) { @@ -215,19 +210,18 @@ export class RangeSelect { let favoriteRect = this.trace?.favoriteChartListEL?.getBoundingClientRect(); let favoriteLimit = favoriteRect!.top + favoriteRect!.height; this.rangeTraceRow = rows.filter((it) => { - let domRect :DOMRect = it.getBoundingClientRect(); + let domRect = it.getBoundingClientRect(); let itRect = { x: domRect.x, y: domRect.y, width: domRect.width, height: domRect.height }; if (itRect.y < favoriteLimit && !it.collect) { - let offset :number = favoriteLimit - itRect.y + let offset = favoriteLimit - itRect.y; itRect.y = itRect.y + offset; - itRect .height = itRect.height- offset + itRect.height = itRect.height - offset; } - if (it.sticky) { + if(it.sticky){ itRect.y = 0; itRect.height = 0; } if ( - it.intersectionRatio > 0 && Rect.intersect(itRect as Rect, { x: Math.min(this.startPageX, this.endPageX), y: Math.min(this.startPageY, this.endPageY), diff --git a/ide/src/trace/component/trace/base/TraceRow.ts b/ide/src/trace/component/trace/base/TraceRow.ts index c1ba67b7c..edbcb9b57 100644 --- a/ide/src/trace/component/trace/base/TraceRow.ts +++ b/ide/src/trace/component/trace/base/TraceRow.ts @@ -30,6 +30,7 @@ import { ColorUtils } from './ColorUtils'; import { drawSelectionRange, isFrameContainPoint } from '../../../database/ui-worker/ProcedureWorkerCommon'; import { TraceRowConfig } from './TraceRowConfig'; import { type TreeItemData, LitTree } from '../../../../base-ui/tree/LitTree'; +import { SpSystemTrace } from '../../SpSystemTrace'; export class RangeSelectStruct { startX: number | undefined; @@ -44,6 +45,7 @@ let dragDirection: string = ''; @element('trace-row') export class TraceRow extends HTMLElement { + sharedArrayBuffers: any; intersectionRatio: number = 0; static ROW_TYPE_SPSEGNENTATION = 'spsegmentation'; static ROW_TYPE_CPU_COMPUTILITY = 'cpu-computility'; @@ -140,6 +142,7 @@ export class TraceRow extends HTMLElement { public dataList: Array = []; public dataList2: Array = []; public dataListCache: Array = []; + public fixedList: Array = []; public sliceCache: number[] = [-1, -1]; public describeEl: HTMLElement | null | undefined; public canvas: Array = []; @@ -172,7 +175,6 @@ export class TraceRow extends HTMLElement { private rowCheckFilePop: LitPopover | null | undefined; private _rangeSelect: boolean = false; private _drawType: number = 0; - private folderIconEL: LitIcon | null | undefined; private _enableCollapseChart: boolean = false; online: boolean = false; static isUserInteraction: boolean; @@ -182,7 +184,12 @@ export class TraceRow extends HTMLElement { childrenList: Array> = []; parentRowEl: TraceRow | undefined; _rowSettingList: Array | null | undefined; + public supplierFrame: (() => Promise>) | undefined | null; //实时查询 + public getCacheData: ((arg: any) => Promise> | undefined) | undefined; //实时查询 + public loadingFrame: boolean = false; //实时查询,正在查询中 + public needRefresh: boolean = true; _docompositionList: Array | undefined; + public folderIcon: LitIcon | null | undefined; focusHandler?: (ev: MouseEvent) => void | undefined; findHoverStruct?: () => void | undefined; @@ -309,6 +316,9 @@ export class TraceRow extends HTMLElement { if (this.rowSettingPop) { this.rowSettingPop.placement = value; } + if (this.rowSettingPop) { + this.rowSettingPop.placement = value; + } } get rowSettingPopoverDirection(): string { @@ -320,10 +330,15 @@ export class TraceRow extends HTMLElement { if (this.rowSettingTree) { this.rowSettingTree.treeData = value || []; } + if (this.rowSettingTree) { + this.rowSettingTree.treeData = value || []; + } } set rowSettingMultiple(value: boolean) { - this.rowSettingTree!.multiple = value; + if (this.rowSettingTree) { + this.rowSettingTree.multiple = value; + } } get rowSettingList(): TreeItemData[] | null | undefined { @@ -408,6 +423,12 @@ export class TraceRow extends HTMLElement { set folder(value: boolean) { if (value) { this.setAttribute('folder', ''); + this.folderIcon = document.createElement('lit-icon') as LitIcon; + this.folderIcon.classList.add('icon'); + this.folderIcon.setAttribute('name', 'caret-down'); + this.folderIcon.setAttribute('size', '19'); + this.folderIcon.style.display = 'flex'; + this.describeEl?.insertBefore(this.folderIcon, this.describeEl.children[0]); } else { this.removeAttribute('folder'); } @@ -468,6 +489,7 @@ export class TraceRow extends HTMLElement { this.dataList2 = []; this.dataList = []; this.dataListCache = []; + this.fixedList = []; if (this.rootEL) { this.rootEL.innerHTML = ''; } @@ -502,11 +524,19 @@ export class TraceRow extends HTMLElement { } }; - getHoverStruct(strict: boolean = true, offset: boolean = false): T | undefined { + getHoverStruct(strict: boolean = true, offset: boolean = false, maxKey: string | undefined = undefined): T | undefined { if (this.isHover) { - return this.dataListCache.find( - (re) => re.frame && isFrameContainPoint(re.frame, this.hoverX, this.hoverY, strict, offset) - ); + if (maxKey) { + let arr = this.dataListCache.filter( + (re) => re.frame && isFrameContainPoint(re.frame, this.hoverX, this.hoverY, strict, offset) + ).sort((targetA, targetB) => (targetB as any)[maxKey] - (targetA as any)[maxKey]); + return arr[0]; + } else { + return this.dataListCache.find( + (re) => re.frame && isFrameContainPoint(re.frame, this.hoverX, this.hoverY, strict, offset) + ); + } + } } @@ -561,6 +591,7 @@ export class TraceRow extends HTMLElement { child.rowHidden = false; this.fragment.insertBefore(child, this.fragment.childNodes.item(index)); } + insertAfter(newEl: DocumentFragment, targetEl: HTMLElement) { let parentEl = targetEl.parentNode; if (parentEl) { @@ -664,8 +695,11 @@ export class TraceRow extends HTMLElement { } set folderPaddingLeft(value: number) { - this.folderIconEL!.style.marginLeft = value + 'px'; + if (this.folderIcon) { + this.folderIcon.style.marginLeft = value + 'px'; + } } + set folderTextLeft(value: number) { this.nameEL!.style.marginLeft = value + 'px'; } @@ -675,7 +709,6 @@ export class TraceRow extends HTMLElement { this.checkBoxEL = this.shadowRoot?.querySelector('.lit-check-box'); this.collectEL = this.shadowRoot?.querySelector('.collect'); this.describeEl = this.shadowRoot?.querySelector('.describe'); - this.folderIconEL = this.shadowRoot?.querySelector('.icon'); this.nameEL = this.shadowRoot?.querySelector('.name'); this.canvasVessel = this.shadowRoot?.querySelector('.panel-vessel'); this.tipEL = this.shadowRoot?.querySelector('.tip'); @@ -714,6 +747,20 @@ export class TraceRow extends HTMLElement { } }); this.funcExpand = true; + if (this.rowSettingTree) { + this.rowSettingTree.onChange = (e: any): void => { + // @ts-ignore + this.rowSettingPop!.visible = false; + if (this.rowSettingTree?.multiple) { + // @ts-ignore + this.rowSettingPop!.visible = true; + } else { + // @ts-ignore + this.rowSettingPop!.visible = false; + } + this.onRowSettingChangeHandler?.(this.rowSettingTree!.getCheckdKeys(), this.rowSettingTree!.getCheckdNodes()); + }; + } this.checkType = '-1'; } @@ -788,6 +835,7 @@ export class TraceRow extends HTMLElement { } return []; } + expandFunc(): void { if (this._enableCollapseChart && !this.funcExpand) { this.style.height = `${this.funcMaxHeight}px`; @@ -813,10 +861,9 @@ export class TraceRow extends HTMLElement { this.style.height = `${this.funcMaxHeight}px`; this.funcExpand = true; } - setTimeout(() => { - TraceRow.range!.refresh = true; - this.draw(false); - }, 200); + TraceRow.range!.refresh = true; + this.needRefresh = true; + this.draw(false); if (this.collect) { window.publish(window.SmartEvent.UI.RowHeightChange, { expand: this.funcExpand, @@ -1031,11 +1078,56 @@ export class TraceRow extends HTMLElement { } } + loadingPin1: number = 0; + loadingPin2: number = 0; + static currentActiveRows:Array = []; + drawFrame(): void { + if (!this.hasAttribute('row-hidden')) { + if (!this.loadingFrame || window.isLastFrame || !this.isComplete) { + if (this.needRefresh || window.isLastFrame) { + this.loadingFrame = true; + this.needRefresh = false; + this.loadingPin1 = TraceRow.range?.startNS || 0; + this.loadingPin2 = TraceRow.range?.endNS || 0; + TraceRow.currentActiveRows.push(`${this.rowType}-${this.rowId}`); + this.supplierFrame!().then((res) => { + if (this.onComplete) { + this.onComplete(); + this.onComplete = undefined; + } + this.dataListCache = res; + this.dataListCache.push(...this.fixedList); + this.isComplete = true; + this.loadingFrame = false; + let idx = TraceRow.currentActiveRows.findIndex(it=> it === `${ this.rowType }-${ this.rowId }`) + if (idx!=-1){ + TraceRow.currentActiveRows.splice(idx, 1); + } + requestAnimationFrame(() => { + this.onThreadHandler?.(true, null); + if (TraceRow.currentActiveRows.isEmpty()){ + window.publish(window.SmartEvent.UI.LoadFinish,""); + } + window.publish(window.SmartEvent.UI.LoadFinishFrame,""); + }); + }); + } else if (this.fixedList.length > 0 && !this.dataListCache.includes(this.fixedList[0])) { + this.dataListCache.push(this.fixedList[0]); + } + } + this.onThreadHandler?.(true, null); + } + } draw(useCache: boolean = false) { this.dpr = window.devicePixelRatio || 1; if (this.sleeping) { return; } + if (this.supplierFrame) { + //如果设置了实时渲染,则调用drawFrame + this.drawFrame(); + return; + } if (this.online) { if (!useCache && !TraceRow.isUserInteraction) { this.supplier?.().then((res) => { @@ -1083,7 +1175,7 @@ export class TraceRow extends HTMLElement { ctx.clip(clipRect); } - canvasRestore(ctx: CanvasRenderingContext2D) { + canvasRestore(ctx: CanvasRenderingContext2D, trace?: SpSystemTrace | null) { drawSelectionRange(ctx, this); ctx.restore(); } @@ -1307,7 +1399,8 @@ export class TraceRow extends HTMLElement { overflow: hidden; user-select: none; text-overflow: ellipsis; - white-space:nowrap + white-space:nowrap; + max-width: 200px; } :host([highlight]) .name{ color: #4b5766; @@ -1326,9 +1419,6 @@ export class TraceRow extends HTMLElement { :host([folder]){ /*background-color: var(--dark-background1,#f5fafb);*/ } - :host([folder]) .icon{ - display: flex; - } :host(:not([folder])){ /*background-color: var(--dark-background,#FFFFFF);*/ } @@ -1347,7 +1437,7 @@ export class TraceRow extends HTMLElement { :host([sticky]) { position: sticky; top: 0; - z-index: 999; + z-index: 1000; } :host([expansion]) { background-color: var(--bark-expansion,#0C65D1); @@ -1495,7 +1585,6 @@ export class TraceRow extends HTMLElement {
- diff --git a/ide/src/trace/component/trace/base/TraceRowConfig.ts b/ide/src/trace/component/trace/base/TraceRowConfig.ts index f7ca496f6..46b97e872 100644 --- a/ide/src/trace/component/trace/base/TraceRowConfig.ts +++ b/ide/src/trace/component/trace/base/TraceRowConfig.ts @@ -491,7 +491,7 @@ export class TraceRowConfig extends BaseElement { let encoder = new TextEncoder(); let tempBuffer = encoder.encode(this.tempString!); a.href = URL.createObjectURL(new Blob([tempBuffer])); - a.download = 'custom_config'; + a.download = 'custom_temp_config'; a.click(); window.URL.revokeObjectURL(a.href); } @@ -535,6 +535,9 @@ export class TraceRowConfig extends BaseElement { for (let subIndex = 0; subIndex < subsystemsData.length; subIndex++) { let currentSystemData = subsystemsData[subIndex]; let currentSubName = currentSystemData.subsystem; + if (!currentSubName) { + continue; + } id++; let subsystemStruct: SubsystemNode = { id: id, @@ -546,10 +549,16 @@ export class TraceRowConfig extends BaseElement { }; if (subSystems.indexOf(subsystemStruct) < 0) { let currentCompDates = currentSystemData.components; + if (!currentCompDates) { + continue; + } for (let compIndex = 0; compIndex < currentCompDates.length; compIndex++) { let currentCompDate = currentCompDates[compIndex]; let currentCompName = currentCompDate.component; let currentChartDates = currentCompDate.charts; + if (!currentCompName || !currentChartDates) { + continue; + } id++; let componentStruct: SubsystemNode = { id: id, @@ -564,6 +573,9 @@ export class TraceRowConfig extends BaseElement { let currentChartDate = currentChartDates[chartIndex]; let currentChartName = currentChartDate.chartName; let currentChartId = currentChartDate.chartId; + if (!currentChartName || !currentChartId) { + continue; + } let findChartNames: Array | undefined = []; let scene: string[] = []; if (this.traceRowList) { diff --git a/ide/src/trace/component/trace/base/TraceSheet.ts b/ide/src/trace/component/trace/base/TraceSheet.ts index 58a457be4..4c58b8224 100644 --- a/ide/src/trace/component/trace/base/TraceSheet.ts +++ b/ide/src/trace/component/trace/base/TraceSheet.ts @@ -137,7 +137,7 @@ export class TraceSheet extends BaseElement { } getComponentByID(id: string): T { - return this.getPaneByID(id)!.children.item(0) as unknown as T; + return this.getPaneByID(id)?.children.item(0) as unknown as T; } getPaneByID(id: string): LitTabpane { @@ -176,16 +176,16 @@ export class TraceSheet extends BaseElement { }); this.litTabs?.activeByKey(`${this.getPaneByID(this.currentPaneID).key}`); }); - this.getComponentByID('box-spt')!.addEventListener('row-click', this.rowClickHandler.bind(this)); - this.getComponentByID('box-pts')!.addEventListener('row-click', this.rowClickHandler.bind(this)); - this.getComponentByID('box-perf-analysis')!.addEventListener('row-click', (evt: MouseEvent) => { + this.getComponentByID('box-spt')?.addEventListener('row-click', this.rowClickHandler.bind(this)); + this.getComponentByID('box-pts')?.addEventListener('row-click', this.rowClickHandler.bind(this)); + this.getComponentByID('box-perf-analysis')?.addEventListener('row-click', (evt: MouseEvent) => { // @ts-ignore if (evt.detail.button === 2) { let pane = this.getPaneByID('box-perf-profile'); this.litTabs!.activeByKey(pane.key); } }); - this.getComponentByID('box-native-statistic-analysis')!.addEventListener('row-click', (e: MouseEvent) => { + this.getComponentByID('box-native-statistic-analysis')?.addEventListener('row-click', (e: MouseEvent) => { //@ts-ignore if (e.detail.button === 2) { let pane = this.getPaneByID('box-native-calltree'); @@ -193,14 +193,14 @@ export class TraceSheet extends BaseElement { this.litTabs!.activeByKey(pane.key); } }); - this.getComponentByID('box-io-tier-statistics-analysis')!.addEventListener('row-click', (evt: MouseEvent) => { + this.getComponentByID('box-io-tier-statistics-analysis')?.addEventListener('row-click', (evt: MouseEvent) => { // @ts-ignore if (evt.detail.button === 2) { let pane = this.getPaneByID('box-io-calltree'); this.litTabs!.activeByKey(pane.key); } }); - this.getComponentByID('box-virtual-memory-statistics-analysis')!.addEventListener( + this.getComponentByID('box-virtual-memory-statistics-analysis')?.addEventListener( 'row-click', (evt: MouseEvent) => { // @ts-ignore @@ -210,7 +210,7 @@ export class TraceSheet extends BaseElement { } } ); - this.getComponentByID('box-file-system-statistics-analysis')!.addEventListener( + this.getComponentByID('box-file-system-statistics-analysis')?.addEventListener( 'row-click', (evt: MouseEvent) => { // @ts-ignore @@ -220,34 +220,42 @@ export class TraceSheet extends BaseElement { } } ); - this.getComponentByID('box-native-statstics')!.addEventListener('row-click', (e: any) => { - this.selection!.statisticsSelectData = e.detail; - let pane = this.getPaneByID('box-native-memory'); - this.litTabs?.activeByKey(pane.key); - (pane.children.item(0) as any)!.fromStastics(this.selection); - }); - this.getComponentByID('box-virtual-memory-statistics')!.addEventListener('row-click', (e: any) => { - this.selection!.fileSystemVMData = { path: e.detail.path }; - let pane = this.getPaneByID('box-vm-events'); - this.litTabs?.activeByKey(pane.key); - if (e.detail.path) { + this.getComponentByID('box-native-statstics')?.addEventListener('row-click', (e: any) => { + if(e.detail.button === 0){ + this.selection!.statisticsSelectData = e.detail; + let pane = this.getPaneByID('box-native-memory'); + this.litTabs?.activeByKey(pane.key); (pane.children.item(0) as any)!.fromStastics(this.selection); } }); - this.getComponentByID('box-io-tier-statistics')!.addEventListener('row-click', (e: any) => { - this.selection!.fileSystemIoData = { path: e.detail.path }; - let pane = this.getPaneByID('box-io-events'); - this.litTabs?.activeByKey(pane.key); - if (e.detail.path) { - (pane.children.item(0) as any)!.fromStastics(this.selection); + this.getComponentByID('box-virtual-memory-statistics')?.addEventListener('row-click', (e: any) => { + if(e.detail.button === 0){ + this.selection!.fileSystemVMData = { path: e.detail.path }; + let pane = this.getPaneByID('box-vm-events'); + this.litTabs?.activeByKey(pane.key); + if (e.detail.path) { + (pane.children.item(0) as any)!.fromStastics(this.selection); + } } }); - this.getComponentByID('box-file-system-statistics')!.addEventListener('row-click', (e: any) => { - this.selection!.fileSystemFsData = e.detail.data; - let pane = this.getPaneByID('box-file-system-event'); - this.litTabs?.activeByKey(pane.key); - if (e.detail.data) { - (pane.children.item(0) as any)!.fromStastics(this.selection); + this.getComponentByID('box-io-tier-statistics')?.addEventListener('row-click', (e: any) => { + if(e.detail.button === 0){ + this.selection!.fileSystemIoData = { path: e.detail.path }; + let pane = this.getPaneByID('box-io-events'); + this.litTabs?.activeByKey(pane.key); + if (e.detail.path) { + (pane.children.item(0) as any)!.fromStastics(this.selection); + } + } + }); + this.getComponentByID('box-file-system-statistics')?.addEventListener('row-click', (e: any) => { + if(e.detail.button === 0){ + this.selection!.fileSystemFsData = e.detail.data; + let pane = this.getPaneByID('box-file-system-event'); + this.litTabs?.activeByKey(pane.key); + if (e.detail.data) { + (pane.children.item(0) as any)!.fromStastics(this.selection); + } } }); } @@ -481,16 +489,12 @@ export class TraceSheet extends BaseElement { data: ThreadStruct, scrollCallback: ((e: ThreadStruct) => void) | undefined, scrollWakeUp: (d: any) => void | undefined, - scrollPreviousData: (d: ThreadStruct) => void, - scrollNextData: (d: ThreadStruct) => void, callback: ((data: Array) => void) | undefined = undefined ) => this.displayTab('current-selection').setThreadData( data, scrollCallback, scrollWakeUp, - scrollPreviousData, - scrollNextData, callback ); displayMemData = (data: ProcessMemStruct): void => @@ -564,13 +568,13 @@ export class TraceSheet extends BaseElement { }; displaySnapshotData = ( data: HeapSnapshotStruct, - dataList: Array, - scrollCallback?: (data: HeapSnapshotStruct, dataList: Array) => void + dataListCache: Array, + scrollCallback?: (data: HeapSnapshotStruct, dataListCache: Array) => void ): void => { - if (dataList.length > 1) { + if (dataListCache.length > 1) { this.displayTab('box-heap-summary', 'box-heap-comparison').setSnapshotData( data, - dataList, + dataListCache, scrollCallback ); let nav = this.shadowRoot!.querySelector('#tabs')!.shadowRoot!.querySelector( @@ -580,10 +584,10 @@ export class TraceSheet extends BaseElement { '#box-heap-comparison > tabpane-comparison' ) as TabPaneComparison; nav!.onclick = (): void => { - tabPaneComparison.initComparison(data, dataList); + tabPaneComparison.initComparison(data, dataListCache); }; } else { - this.displayTab('box-heap-summary').setSnapshotData(data, dataList, scrollCallback); + this.displayTab('box-heap-summary').setSnapshotData(data, dataListCache, scrollCallback); } }; displayFlagData = (flagObj: Flag): void => this.displayTab('box-flag').setCurrentFlag(flagObj); @@ -629,17 +633,17 @@ export class TraceSheet extends BaseElement { 'box-purgeable-pin-comparison-ability' ).data = data; }; - displayPurgTotalVMData = (data: SnapshotStruct, dataList: Array): void => { + displayPurgTotalVMData = (data: SnapshotStruct, dataListCache: Array): void => { data.type = 'VM'; - this.displayTab('box-purgeable-total-comparison-vm').totalData(data, dataList); + this.displayTab('box-purgeable-total-comparison-vm').totalData(data, dataListCache); this.displayTab( 'box-purgeable-total-selection', 'box-purgeable-total-comparison-vm' ).data = data; }; - displayPurgPinVMData = (data: SnapshotStruct, dataList: Array): void => { + displayPurgPinVMData = (data: SnapshotStruct, dataListCache: Array): void => { data.type = 'VM'; - this.displayTab('box-purgeable-pin-comparison-vm').totalData(data, dataList); + this.displayTab('box-purgeable-pin-comparison-vm').totalData(data, dataListCache); this.displayTab('box-purgeable-pin-selection', 'box-purgeable-pin-comparison-vm').data = data; }; @@ -654,9 +658,12 @@ export class TraceSheet extends BaseElement { this.displayTab('box-dma-selection-ability').queryDmaClickDataByDB(data); } }; - displayDmaVmTracker = (data: number, dataList: Array): void => { - if (dataList.length > 0) { - this.displayTab('box-vmTracker-comparison').comparisonDataByDB(data, dataList); + displayDmaVmTracker = (data: number, dataListCache: Array): void => { + if (dataListCache.length > 0) { + this.displayTab('box-vmTracker-comparison').comparisonDataByDB( + data, + dataListCache + ); this.displayTab( 'box-dma-selection-vmTracker', 'box-vmTracker-comparison' @@ -676,11 +683,11 @@ export class TraceSheet extends BaseElement { this.displayTab('box-gpu-memory-selection-ability').data = data; } }; - displayGpuMemoryVmTracker = (data: number, dataList: Array): void => { - if (dataList.length > 0) { + displayGpuMemoryVmTracker = (data: number, dataListCache: Array): void => { + if (dataListCache.length > 0) { this.displayTab('box-gpu-memory-vmTracker-comparison').comparisonDataByDB( data, - dataList + dataListCache ); this.displayTab( 'box-gpu-memory-selection-vmTracker', @@ -795,7 +802,7 @@ export class TraceSheet extends BaseElement { return false; } for (let process of treeData) { - if (!this.lastProcessSet.has(process.ipid)) { + if (!this.lastProcessSet.has(process.pid)) { return false; } } @@ -834,7 +841,7 @@ export class TraceSheet extends BaseElement { isFirst = false; } processArray.push(treeData); - this.lastProcessSet.add(process.ipid); + this.lastProcessSet.add(process.pid); } this.processTree!.treeData = processArray; } else { diff --git a/ide/src/trace/component/trace/base/TraceSheetConfig.ts b/ide/src/trace/component/trace/base/TraceSheetConfig.ts index 7cef081ca..17cd6dea9 100644 --- a/ide/src/trace/component/trace/base/TraceSheetConfig.ts +++ b/ide/src/trace/component/trace/base/TraceSheetConfig.ts @@ -148,7 +148,7 @@ export let tabConfig: any = { 'box-cpu-freq-limit': { title: 'Cpu Frequency Limits', type: TabPaneCpuFreqLimits, - require: (param: SelectionParam) => param.cpuFreqLimitDatas.length > 0, + require: (param: SelectionParam) => param.cpuFreqLimit.length > 0, }, 'box-cpu-thread': { title: 'CPU by thread', @@ -213,7 +213,7 @@ export let tabConfig: any = { 'box-irq-counters': { title: 'Irq Counters', type: TabPaneIrqCounter, - require: (param: SelectionParam) => param.irqMapData.size > 0, + require: (param: SelectionParam) => param.irqCallIds.length > 0 || param.softIrqCallIds.length > 0, }, 'box-fps': { title: 'FPS', @@ -675,7 +675,7 @@ export let tabConfig: any = { type: TabPaneGpufreq, require: (param: SelectionParam) => param.clockMapData.size > 0 && param.clockMapData.size < 2, }, - 'tabpane-gpufreqDataCut': { + 'tabpane-freqDataCut': { title: 'Gpufreq DataCut', type: TabPaneGpufreqDataCut, require: (param: SelectionParam) => param.clockMapData.size > 0 && param.clockMapData.size < 2, diff --git a/ide/src/trace/component/trace/base/Utils.ts b/ide/src/trace/component/trace/base/Utils.ts index 6ba38276b..81acef781 100644 --- a/ide/src/trace/component/trace/base/Utils.ts +++ b/ide/src/trace/component/trace/base/Utils.ts @@ -81,6 +81,15 @@ export class Utils { } } + public static isBinder(data: any): boolean { + return ( + data.funName != null && + (data.funName.toLowerCase().startsWith('binder transaction async') || //binder transaction + data.funName.toLowerCase().startsWith('binder async') || + data.funName.toLowerCase().startsWith('binder reply')) + ); + } + public static transferPTSTitle(value: any) { if (value.startsWith('S-')) { return Utils.getEndState(value.replace('S-', '')); @@ -497,11 +506,11 @@ export class Utils { } } queryNativeHookResponseTypes(val.leftNs, val.rightNs, types, isStatistic).then((res) => { - procedurePool.submitWithName('logic1', 'native-memory-init-responseType', res, undefined, () => {}); + procedurePool.submitWithName('logic0', 'native-memory-init-responseType', res, undefined, () => {}); }); } setCurrentSelectIPid(ipid: number): void { - procedurePool.submitWithName('logic1', 'native-memory-set-current_ipid', ipid, undefined, () => {}); + procedurePool.submitWithName('logic0', 'native-memory-set-current_ipid', ipid, undefined, () => {}); } } diff --git a/ide/src/trace/component/trace/search/Search.ts b/ide/src/trace/component/trace/search/Search.ts index 848405109..e0d7822c2 100644 --- a/ide/src/trace/component/trace/search/Search.ts +++ b/ide/src/trace/component/trace/search/Search.ts @@ -15,7 +15,6 @@ import { BaseElement, element } from '../../../../base-ui/BaseElement'; import { LitIcon } from '../../../../base-ui/icon/LitIcon'; -import { SpSystemTrace } from '../../../component/SpSystemTrace'; const LOCAL_STORAGE_SEARCH_KEY = 'search_key'; @@ -37,7 +36,6 @@ export class LitSearch extends BaseElement { //定义翻页index private retarget_index: number = 0; private _retarge_index: HTMLInputElement | null | undefined; - private systemTrace: SpSystemTrace | null | undefined; get list(): Array { return this._list; @@ -225,19 +223,13 @@ export class LitSearch extends BaseElement { } } else { this.updateSearchHistoryList(this.search!.value); - this.valueChangeHandler?.(this.search!.value); + this.valueChangeHandler?.(this.trimSideSpace(this.search!.value)); } e.stopPropagation(); } - clearTimes(): void { - if (this.systemTrace) { - if (this.systemTrace.times.size > 0) { - for (let timerId of this.systemTrace.times) { - clearTimeout(timerId); - } - } - } + trimSideSpace(str: string): string { + return str.replace(/(^\s*)|(\s*$)/g, ''); } initElements(): void { @@ -249,18 +241,6 @@ export class LitSearch extends BaseElement { this._retarge_index = this.shadowRoot!.querySelector("input[name='retarge_index']"); let _root = this.shadowRoot!.querySelector('.root'); let _prompt = this.shadowRoot!.querySelector('#prompt'); - this.systemTrace = document - .querySelector('body > sp-application') - ?.shadowRoot?.querySelector('#sp-system-trace'); - - let searchKeyup = (e: KeyboardEvent) => { - this.clearTimes(); - document.removeEventListener('keyup', this.systemTrace!.documentOnKeyUp); - document.removeEventListener('keydown', this.systemTrace!.documentOnKeyDown); - this.searchKeyupListener(e); - document.addEventListener('keydown', this.systemTrace!.documentOnKeyDown); - document.addEventListener('keyup', this.systemTrace!.documentOnKeyUp); - }; this.search!.addEventListener('focus', () => { this.searchFocusListener(); @@ -272,8 +252,11 @@ export class LitSearch extends BaseElement { this.index = -1; this._retarge_index!.value = ''; }); - - this.search!.addEventListener('keyup', searchKeyup); + this.search!.addEventListener('keyup', (e: KeyboardEvent) => { + this._retarge_index!.value = ''; + this.index = -1; + this.searchKeyupListener(e); + }); this.shadowRoot?.querySelector('#arrow-left')?.addEventListener('click', (e) => { this.dispatchEvent( new CustomEvent('previous-data', { @@ -295,12 +278,7 @@ export class LitSearch extends BaseElement { // 添加翻页监听事件 this.shadowRoot?.querySelector("input[name='retarge_index']")?.addEventListener('keyup', (e: any) => { - if (e.key === 'Enter') { - this.clearTimes(); - document.removeEventListener('keyup', this.systemTrace!.documentOnKeyUp); - document.removeEventListener('keydown', this.systemTrace!.documentOnKeyDown); - document.removeEventListener('keypress', this.systemTrace!.documentOnKeyPress); - this.search!.removeEventListener('keyup', searchKeyup); + if (e.keyCode == 13) { this.retarget_index = Number(this._retarge_index!.value); if (this.retarget_index <= this._list.length && this.retarget_index != 0) { this.dispatchEvent( @@ -322,14 +300,14 @@ export class LitSearch extends BaseElement { this._retarge_index!.value = ''; }, 2000); } - this._retarge_index?.blur(); - this.search!.addEventListener('keyup', searchKeyup); - document.addEventListener('keyup', this.systemTrace!.documentOnKeyUp); - document.addEventListener('keydown', this.systemTrace!.documentOnKeyDown); - document.addEventListener('keypress', this.systemTrace!.documentOnKeyPress); } e.stopPropagation(); }); + this.shadowRoot?.querySelector("input[name='retarge_index']")?.addEventListener('keydown', (e: any) => { + if (e.keyCode == 13) { + e.stopPropagation(); + } + }); } initHtml(): string { diff --git a/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts b/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts index b11d92eec..0d637915b 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneCurrent.ts @@ -17,7 +17,6 @@ import { BaseElement, element } from '../../../../base-ui/BaseElement'; import { LitTable } from '../../../../base-ui/table/lit-table'; import { MarkStruct } from '../../../bean/MarkStruct'; import { SpSystemTrace } from '../../SpSystemTrace'; -import { ns2s } from '../TimerShaftElement'; import { SlicesTime, StType } from '../timer-shaft/SportRuler'; import { getTimeString } from './TabPaneCurrentSelection'; @@ -285,7 +284,7 @@ export class TabPaneCurrent extends BaseElement { this.slicesTimeList[i - 1].hidden = true; this.systemTrace!.slicesList = this.slicesTimeList || []; document.dispatchEvent(new CustomEvent('slices-change', { detail: this.slicesTimeList[i - 1] })); - // 移除时更新表格内容 + // 移除时更新表格内容 this.setTableData(); } event.stopPropagation(); diff --git a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts index 0fb401712..def1cc8a1 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts @@ -27,6 +27,7 @@ import { queryPrecedingData, queryRunnableTimeByRunning, queryThreadByItid, + queryThreadNearData, queryThreadStateArgs, queryThreadWakeUp, queryThreadWakeUpFrom, @@ -187,6 +188,7 @@ export class TabPaneCurrentSelection extends BaseElement { threadClick?.addEventListener('click', () => { //cpu点击 if (scrollCallback) { + data.state = 'Running'; scrollCallback(data); } }); @@ -233,7 +235,7 @@ export class TabPaneCurrentSelection extends BaseElement { let name = this.transferString(data.funName ?? ''); let isBinder = FuncStruct.isBinder(data); let isAsyncBinder = isBinder && FuncStruct.isBinderAsync(data); - if (data.argsetid !== undefined && data.argsetid !== null) { + if (data.argsetid !== undefined && data.argsetid !== null && data.argsetid >= 0) { this.setTableHeight('700px'); if (isAsyncBinder) { Promise.all([ @@ -350,7 +352,9 @@ export class TabPaneCurrentSelection extends BaseElement { value: getTimeString(data.dur || 0), }); contentList.push({ name: 'depth', value: data.depth }); - contentList.push({ name: 'arg_set_id', value: data.argsetid }); + if (data.argsetid && data.argsetid > -1) { + contentList.push({ name: 'arg_set_id', value: data.argsetid }); + } } private tabCurrentSelectionInit(leftTitleStr: string): void { @@ -455,8 +459,6 @@ export class TabPaneCurrentSelection extends BaseElement { data: ThreadStruct, scrollCallback: ((d: any) => void) | undefined, scrollWakeUp: (d: any) => void | undefined, - scrollPreviousData: (d: any) => void | undefined, - scrollNextData: (d: any) => void | undefined, callback: ((data: Array) => void) | undefined = undefined ): void { //线程信息 @@ -488,10 +490,6 @@ export class TabPaneCurrentSelection extends BaseElement { } if ('Running' === state) { state = state + ' on CPU ' + data.cpu; - } - if (data.cpu === null || data.cpu === undefined) { - list.push({ name: 'State', value: `${state}` }); - } else { list.push({ name: 'State', value: `
@@ -499,6 +497,8 @@ export class TabPaneCurrentSelection extends BaseElement {
`, }); + } else { + list.push({ name: 'State', value: `${state}` }); } let slice = Utils.SCHED_SLICE_MAP.get(`${data.id}-${data.startTime}`); if (slice) { @@ -517,44 +517,6 @@ export class TabPaneCurrentSelection extends BaseElement { name: 'Process', value: this.transferString(processName ?? '') + ' [' + data.pid + '] ', }); - let ThreadRow = document - .querySelector('body > sp-application')! - .shadowRoot!.querySelector('#sp-system-trace')! - .shadowRoot?.querySelector>(`trace-row[row-id='${data.tid}'][row-type='thread']`); - ThreadRow?.dataList.forEach((item, index) => { - if (item === data && index !== 0) { - let previousState = ThreadRow?.dataList[index - 1].state; - if (previousState === 'R') { - previousState = 'Runnable'; - } - if (previousState === 'S') { - previousState = 'Sleeping'; - } - list.push({ - name: 'Previous State', - value: `
-
${previousState}
- -
`, - }); - } - if (item === data && index !== ThreadRow?.dataList.length! - 1) { - let nextState = ThreadRow?.dataList[index + 1].state; - if (nextState === 'R') { - nextState = 'Runnable'; - } - if (nextState === 'S') { - nextState = 'Sleeping'; - } - list.push({ - name: 'Next State', - value: `
-
${nextState}
- -
`, - }); - } - }); let cpu = new CpuStruct(); cpu.id = data.id; cpu.startTime = data.startTime; @@ -562,10 +524,37 @@ export class TabPaneCurrentSelection extends BaseElement { this.queryThreadWakeUpFromData(data.id!, data.startTime!, data.dur!), this.queryThreadWakeUpData(data.id!, data.startTime!, data.dur!), this.queryThreadStateDArgs(data.argSetID), + queryThreadNearData(data.id!, data.startTime!), ]).then((result) => { let fromBean = result[0]; let wakeUps = result[1]; let args = result[2]; + let nearData = result[3]; + let preData: any = undefined; + let nextData: any = undefined; + nearData.sort((near1, near2) => near1.startTime - near2.startTime).forEach((near) => { + if (near.itid === data.id) { + if (near.startTime < data.startTime!) { + preData = near; + list.push({ + name: 'Previous State', + value: `
+
${Utils.getEndState(near.state)}
+ +
`, + }); + } else { + nextData = near; + list.push({ + name: 'Next State', + value: `
+
${Utils.getEndState(near.state)}
+ +
`, + }); + } + } + }); if (fromBean !== null && fromBean !== undefined && fromBean.pid !== 0 && fromBean.tid !== 0) { list.push({ name: 'wakeup from tid', @@ -598,13 +587,31 @@ export class TabPaneCurrentSelection extends BaseElement { callback(jankJumperList); } this.currentSelectionTbl?.shadowRoot?.querySelector('#next-state-click')?.addEventListener('click', () => { - if (scrollNextData) { - scrollNextData(data); + if (nextData && scrollWakeUp !== undefined) { + scrollWakeUp({ + processId: nextData.pid, + tid: nextData.tid, + startTime: nextData.startTime, + dur: nextData.dur, + cpu: nextData.cpu, + id: nextData.itid, + state: nextData.state, + argSetID: nextData.argSetID, + }); } }); this.currentSelectionTbl?.shadowRoot?.querySelector('#previous-state-click')?.addEventListener('click', () => { - if (scrollPreviousData) { - scrollPreviousData(data); + if (preData && scrollWakeUp !== undefined) { + scrollWakeUp({ + processId: preData.pid, + tid: preData.tid, + startTime: preData.startTime, + dur: preData.dur, + cpu: preData.cpu, + id: preData.itid, + state: preData.state, + argSetID: preData.argSetID, + }); } }); this.currentSelectionTbl?.shadowRoot?.querySelector('#state-click')?.addEventListener('click', () => { @@ -620,6 +627,11 @@ export class TabPaneCurrentSelection extends BaseElement { processId: fromBean.pid, tid: fromBean.tid, startTime: fromBean.ts, + dur: fromBean.dur, + cpu: fromBean.cpu, + id: fromBean.itid, + state: 'Running', + argSetID: fromBean.argSetID, }); } }); @@ -629,9 +641,14 @@ export class TabPaneCurrentSelection extends BaseElement { //点击跳转,唤醒和被唤醒的 线程 if (up && scrollWakeUp !== undefined) { scrollWakeUp({ + processId: up.pid, tid: up.tid, startTime: up.ts, - processId: up.pid, + dur: up.dur, + cpu: up.cpu, + id: up.itid, + state: up.state, + argSetID: up.argSetID, }); } }); @@ -783,7 +800,7 @@ export class TabPaneCurrentSelection extends BaseElement { }); list.push({ name: 'Process', - value: data.rs_name + ' ' + data.rs_pid, + value: 'render_service ' + data.rs_pid, }); list.push({ name: 'StartTime(Relative)', @@ -931,7 +948,7 @@ export class TabPaneCurrentSelection extends BaseElement { dur: pt.dur, depth: pt.depth, funName: pt.name, - startTime: useEnd ? (data.startTs || 0) + (data.dur || 0) : data.startTs, + startTs: useEnd ? (data.startTs || 0) + (data.dur || 0) : data.startTs, keepOpen: true, }); } @@ -989,7 +1006,7 @@ export class TabPaneCurrentSelection extends BaseElement { dur: pt.dur, depth: pt.depth, funName: pt.name, - startTime: data.startTs, + startTs: data.startTs, keepOpen: true, }); } @@ -1089,7 +1106,7 @@ export class TabPaneCurrentSelection extends BaseElement { async queryThreadStateDArgs(argSetID: number | undefined): Promise { let list: Array = []; - if (argSetID !== undefined) { + if (argSetID !== undefined && argSetID > 0) { list = await queryThreadStateArgs(argSetID); } return list; diff --git a/ide/src/trace/component/trace/sheet/ability/TabPaneMemoryAbility.ts b/ide/src/trace/component/trace/sheet/ability/TabPaneMemoryAbility.ts index ca6c6d182..1f4cff24d 100644 --- a/ide/src/trace/component/trace/sheet/ability/TabPaneMemoryAbility.ts +++ b/ide/src/trace/component/trace/sheet/ability/TabPaneMemoryAbility.ts @@ -168,7 +168,7 @@ export class TabPaneMemoryAbility extends BaseElement { systemMemorySummary.kReclaimable = Utils.getBinaryKBWithUnit(Number(memorys[i])); break; case 'sys.mem.zram': - systemMemorySummary.zram = Utils.getBinaryKBWithUnit(Number(memorys[i]) * 1000); + systemMemorySummary.zram = Utils.getBinaryKBWithUnit(Number(memorys[i])); break; } } diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts index cf69d4b33..9eb5016a3 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneComparison.ts @@ -261,12 +261,12 @@ export class TabPaneComparison extends BaseElement { this.classFilter(); } - initComparison(data: HeapSnapshotStruct, dataList: Array) { + initComparison(data: HeapSnapshotStruct, dataListCache: Array) { this.clear(); this.retainerTableEl!.snapshotDataSource = []; let fileArr: HeapSnapshotStruct[] = []; let that = this; - for (let file of dataList) { + for (let file of dataListCache) { if (file.id !== data.id) { fileArr.push(file); } diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts index a9654b5e5..f0bd7d84f 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpu.ts @@ -19,6 +19,7 @@ import { SelectionParam } from '../../../../bean/BoxSelection'; import { type JsCpuProfilerChartFrame, JsCpuProfilerTabStruct } from '../../../../bean/JsStruct'; import { procedurePool } from '../../../../database/Procedure'; import { findSearchNode, ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon'; +import { SpSystemTrace } from '../../../SpSystemTrace'; import { type FilterData, TabPaneFilter } from '../TabPaneFilter'; import '../TabPaneFilter'; @@ -39,7 +40,7 @@ export class TabPaneJsCpuCallTree extends BaseElement { private getDataByWorker(args: Array, handler: Function): void { const key = this.currentType === this.TYPE_TOP_DOWN ? 'jsCpuProfiler-call-tree' : 'jsCpuProfiler-bottom-up'; this.callTreeTable!.mode = TableMode.Retract; - procedurePool.submitWithName('logic1', key, args, undefined, (results: Array) => { + procedurePool.submitWithName('logic0', key, args, undefined, (results: Array) => { handler(results); }); } @@ -94,6 +95,7 @@ export class TabPaneJsCpuCallTree extends BaseElement { it.parentId = item.id; }); } + item.name = SpSystemTrace.DATA_DICT.get(item.nameId) || ''; callTreeMap.set(item.id, item); if (item.scriptName === 'unknown') { item.symbolName = item.name; diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuStatistics.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuStatistics.ts index 2fdd9e3ae..7a069b9c7 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuStatistics.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneJsCpuStatistics.ts @@ -22,6 +22,7 @@ import { type JsCpuProfilerChartFrame, JsCpuProfilerStatisticsStruct } from '../ import { procedurePool } from '../../../../database/Procedure'; import { type SampleType } from '../../../../database/logic-worker/ProcedureLogicWorkerJsCpuProfiler'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon'; +import { SpSystemTrace } from '../../../SpSystemTrace'; import { resizeObserver } from '../SheetUtils'; @element('tabpane-js-cpu-statistics') @@ -83,7 +84,7 @@ export class TabPaneJsCpuStatistics extends BaseElement { }; } procedurePool.submitWithName( - 'logic1', + 'logic0', 'jsCpuProfiler-statistics', params, undefined, diff --git a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts index 8eba4f982..9fdc62867 100644 --- a/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts +++ b/ide/src/trace/component/trace/sheet/ark-ts/TabPaneSummary.ts @@ -295,11 +295,11 @@ export class TabPaneSummary extends BaseElement { setSnapshotData( data: HeapSnapshotStruct, - dataList: Array, + dataListCache: Array, scrollCallback: ((d: HeapSnapshotStruct, ds: Array) => void) | undefined ) { if (scrollCallback) { - scrollCallback(data, dataList); + scrollCallback(data, dataListCache); } this.summary = []; this.initSummaryData(data); diff --git a/ide/src/trace/component/trace/sheet/binder/TabPaneBinderDataCut.ts b/ide/src/trace/component/trace/sheet/binder/TabPaneBinderDataCut.ts index 8f57f9c06..7201b9f20 100644 --- a/ide/src/trace/component/trace/sheet/binder/TabPaneBinderDataCut.ts +++ b/ide/src/trace/component/trace/sheet/binder/TabPaneBinderDataCut.ts @@ -28,7 +28,7 @@ import { querySingleFuncNameCycle, queryBinderByThreadId, queryLoopFuncNameCycle import { resizeObserver } from '../SheetUtils'; import { LitChartColumn } from '../../../../../base-ui/chart/column/LitChartColumn'; import '../../../../../base-ui/chart/column/LitChartColumn'; -import { SpSegmentationChart } from '../../../chart/SpSegmentationChart'; +// import { SpSegmentationChart } from '../../../chart/SpSegmentationChart'; @element('tabpane-binder-datacut') export class TabPaneBinderDataCut extends BaseElement { @@ -47,10 +47,8 @@ export class TabPaneBinderDataCut extends BaseElement { private funcNameCycleArr: FuncNameCycle[] | undefined; private cacheBinderArr: BinderGroup[] | undefined; private currentThreadId: string | undefined; - private cycleColumn: HTMLDivElement | null | undefined; set data(threadStatesParam: SelectionParam | any) { - this.parentElement!.style.overflow = 'hidden'; let threadIdDIV = this.shadowRoot!.querySelector('.thread-id-input') as HTMLElement; threadIdDIV.style.border = '1px solid rgb(151,151,151)'; let cycleNameDIV = this.shadowRoot!.querySelector('.cycle-name-input') as HTMLElement; @@ -64,14 +62,6 @@ export class TabPaneBinderDataCut extends BaseElement { this.currentSelectionParam = threadStatesParam; this.threadBindersTbl!.recycleDataSource = []; this.theadClick(this.threadBindersTbl!.recycleDataSource); - let flag = null; - if (!flag) { - flag = new ResizeObserver((entries) => { - // @ts-ignore - let lastHeight = this.threadBindersTbl.tableElement!.offsetHeight; - this.cycleColumn!.style.height = String(lastHeight) + 'px'; - }).observe(this.parentElement!); - } } dispalyQueryArea(b: boolean): void { @@ -108,7 +98,7 @@ export class TabPaneBinderDataCut extends BaseElement { let leftNS: number = this.currentSelectionParam.leftNs; let rightNS: number = this.currentSelectionParam.rightNs; if (threadIdValue !== '' && threadFuncName !== '') { - SpSegmentationChart.setBinderChartData("BINDER", []); + // SpSegmentationChart.setBinderChartData("BINDER", []); this.clickLoop(true); this.clickSingle(false); this.threadBindersTbl!.loading = true; @@ -162,7 +152,7 @@ export class TabPaneBinderDataCut extends BaseElement { let leftNS: number = this.currentSelectionParam.leftNs; let rightNS: number = this.currentSelectionParam.rightNs; if (threadIdValue !== '' && threadFuncName !== '') { - SpSegmentationChart.setBinderChartData("BINDER", []); + // SpSegmentationChart.setBinderChartData("BINDER", []); this.clickLoop(false); this.clickSingle(true); threadId.style.border = '1px solid rgb(151,151,151)'; @@ -503,7 +493,6 @@ export class TabPaneBinderDataCut extends BaseElement { this.cycleAEndRangeDIV = this.shadowRoot?.querySelector('#cycle-a-end-range'); this.cycleBStartRangeDIV = this.shadowRoot?.querySelector('#cycle-b-start-range'); this.cycleBEndRangeDIV = this.shadowRoot?.querySelector('#cycle-b-end-range'); - this.cycleColumn = this.shadowRoot?.querySelector('#cycleColumn'); this.threadStatesDIV = this.shadowRoot!.querySelector('#dataCut'); this.threadStatesDIV?.children[2].children[0].addEventListener('click', (e) => { @@ -541,14 +530,14 @@ export class TabPaneBinderDataCut extends BaseElement { let threaId = currentData.tid; let rowThreadBinderArr = this.findThreadByThreadId(this.cacheBinderArr!, threaId); let binderWithCountList: Array = this.binderWithCountList(rowThreadBinderArr!); - SpSegmentationChart.setBinderChartData('BINDER', binderWithCountList); + // SpSegmentationChart.setBinderChartData('BINDER', binderWithCountList); } if (currentData.type === 'cycle' && currentData.tid + '' + currentData.pid === this.currentThreadId) { currentData.isSelected = true; this.threadBindersTbl!.clearAllSelection(currentData); this.threadBindersTbl!.setCurrentSelection(currentData); - SpSegmentationChart.tabHover('BINDER', true, currentData.idx); + // SpSegmentationChart.tabHover('BINDER', true, currentData.idx); } }); @@ -652,7 +641,6 @@ export class TabPaneBinderDataCut extends BaseElement { } button{ width:40%; - min-width:90px; height:100%; border: solid 1px #666666; background-color: rgba(0,0,0,0); @@ -707,7 +695,7 @@ export class TabPaneBinderDataCut extends BaseElement { width:90px; } .cycle-range-input { - width: 24%; + width: 120px; height: 18px; padding: 1px 5px; border-radius: 12px; @@ -730,7 +718,6 @@ export class TabPaneBinderDataCut extends BaseElement { align-items: center; justify-content: center; margin-top:12px; - margin-bottom:20px; } .labels{ display: flex; @@ -747,7 +734,7 @@ export class TabPaneBinderDataCut extends BaseElement { margin-right: 5px; } .chart_area{ - margin-top:20px; + margin-top:40px; } .chart_title{ line-height: 40px; @@ -787,22 +774,24 @@ export class TabPaneBinderDataCut extends BaseElement {
-
-
- Cycle A: - - ~ - -
-
-
- Cycle B: - +
+
+
+ Cycle A: + ~ - +
-
- +
+
+ Cycle B: + + ~ + +
+
+ +
diff --git a/ide/src/trace/component/trace/sheet/clock/TabPaneClockCounter.ts b/ide/src/trace/component/trace/sheet/clock/TabPaneClockCounter.ts index 7d1b6d2cd..d1afe0da1 100644 --- a/ide/src/trace/component/trace/sheet/clock/TabPaneClockCounter.ts +++ b/ide/src/trace/component/trace/sheet/clock/TabPaneClockCounter.ts @@ -24,7 +24,7 @@ export class TabPaneClockCounter extends BaseElement { private clockCounterRange: HTMLLabelElement | null | undefined; private clockCounterSource: Array = []; - set data(clockCounterValue: SelectionParam | any) { + set data(clockCounterValue: SelectionParam) { //@ts-ignore this.clockCounterTbl?.shadowRoot?.querySelector('.table')?.style?.height = this.parentElement!.clientHeight - 45 + 'px'; @@ -32,12 +32,17 @@ export class TabPaneClockCounter extends BaseElement { 'Selected range: ' + parseFloat(((clockCounterValue.rightNs - clockCounterValue.leftNs) / 1000000.0).toFixed(5)) + ' ms'; + this.getCounterData(clockCounterValue).then(); + } + + async getCounterData(clockCounterValue: SelectionParam) { let dataSource: Array = []; let collect = clockCounterValue.clockMapData; let sumCount = 0; for (let key of collect.keys()) { let counters = collect.get(key); - let sd = this.createSelectCounterData(key, counters, clockCounterValue.leftNs, clockCounterValue.rightNs); + let res = await counters?.({ startNS: clockCounterValue.leftNs, endNS: clockCounterValue.rightNs }); + let sd = this.createSelectCounterData(key, res || [], clockCounterValue.leftNs, clockCounterValue.rightNs); sumCount += Number.parseInt(sd.count || '0'); dataSource.push(sd); } diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneCounterSample.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneCounterSample.ts index 1ccb2edf1..158115754 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneCounterSample.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneCounterSample.ts @@ -116,7 +116,7 @@ export class TabPaneCounterSample extends BaseElement { } } } - row.canvasRestore(context); + row.canvasRestore(context, this.systemTrace); } } }); diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneFrequencySample.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneFrequencySample.ts index aa57af0d9..1bf8dfeb7 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneFrequencySample.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneFrequencySample.ts @@ -12,6 +12,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { BaseElement, element } from '../../../../../base-ui/BaseElement'; import { LitTable } from '../../../../../base-ui/table/lit-table'; import { SelectionParam } from '../../../../bean/BoxSelection'; @@ -117,7 +118,7 @@ export class TabPaneFrequencySample extends BaseElement { context.fillStyle = '#333'; context.textBaseline = 'middle'; context.fillText(s, 4, 5 + 9); - row.canvasRestore(context); + row.canvasRestore(context, this.systemTrace); } } }); diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPanePTS.ts b/ide/src/trace/component/trace/sheet/cpu/TabPanePTS.ts index 61f78e9a7..2df4b2613 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPanePTS.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPanePTS.ts @@ -46,7 +46,7 @@ export class TabPanePTS extends BaseElement { getDataByPTS(ptsLeftNs: number, ptsRightNs: number, cpus: Array) { this.ptsTbl!.loading = true; procedurePool.submitWithName( - 'logic1', + 'logic0', 'spt-getPTS', { leftNs: ptsLeftNs, rightNs: ptsRightNs, cpus: cpus }, undefined, diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneSPT.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneSPT.ts index dc2aa50f9..8ac72012d 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneSPT.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneSPT.ts @@ -53,7 +53,7 @@ export class TabPaneSPT extends BaseElement { getDataBySPT(leftNs: number, rightNs: number, cpus: Array) { this.sptTbl!.loading = true; procedurePool.submitWithName( - 'logic1', + 'logic0', 'spt-getSPT', { leftNs: leftNs, rightNs: rightNs, cpus: cpus }, undefined, diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneSchedPriority.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneSchedPriority.ts index a50f76775..1fe39def3 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneSchedPriority.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneSchedPriority.ts @@ -83,7 +83,7 @@ export class TabPaneSchedPriority extends BaseElement { // thread_state表中runnable数据的Map const runnableMap = new Map(); procedurePool.submitWithName( - 'logic1', + 'logic0', 'spt-getCpuPriorityByTime', { leftNs: sptParam.leftNs, rightNs: sptParam.rightNs }, undefined, diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneCallTree.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneCallTree.ts index fcd02b482..c79666e4a 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneCallTree.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneCallTree.ts @@ -749,7 +749,7 @@ export class TabPaneCallTree extends BaseElement {
- + diff --git a/ide/src/trace/component/trace/sheet/frame/TabFrameSpacing.ts b/ide/src/trace/component/trace/sheet/frame/TabFrameSpacing.ts index a81ea2165..9f30defe3 100644 --- a/ide/src/trace/component/trace/sheet/frame/TabFrameSpacing.ts +++ b/ide/src/trace/component/trace/sheet/frame/TabFrameSpacing.ts @@ -72,12 +72,12 @@ export class TabFrameSpacing extends BaseElement { case 'W': frameSpacing.value2 = structValue.currentFrameWidth; frameSpacing.value1 = structValue.preFrameWidth; - frameSpacing.screen = FrameSpacingStruct.physicalWidth; + frameSpacing.screen = structValue.physicalWidth; break; case 'H': frameSpacing.value2 = structValue.currentFrameHeight; frameSpacing.value1 = structValue.preFrameHeight; - frameSpacing.screen = FrameSpacingStruct.physicalHeight; + frameSpacing.screen = structValue.physicalHeight; break; case 'X': frameSpacing.value2 = structValue.x; diff --git a/ide/src/trace/component/trace/sheet/freq/TabPaneCpuFreqLimits.ts b/ide/src/trace/component/trace/sheet/freq/TabPaneCpuFreqLimits.ts index 0f28cfa15..435a664f9 100644 --- a/ide/src/trace/component/trace/sheet/freq/TabPaneCpuFreqLimits.ts +++ b/ide/src/trace/component/trace/sheet/freq/TabPaneCpuFreqLimits.ts @@ -20,6 +20,7 @@ import { Utils } from '../../base/Utils'; import { ColorUtils } from '../../base/ColorUtils'; import { CpuFreqLimitsStruct } from '../../../../database/ui-worker/ProcedureWorkerCpuFreqLimits'; import { resizeObserver } from '../SheetUtils'; +import { getCpuLimitFreqBoxSelect } from '../../../../database/SqlLite'; @element('tabpane-cpu-freq-limits') export class TabPaneCpuFreqLimits extends BaseElement { @@ -38,21 +39,14 @@ export class TabPaneCpuFreqLimits extends BaseElement { this.cpuFreqLimitsTbl!.shadowRoot!.querySelector('.table').style.height = this.parentElement!.clientHeight - 25 + 'px'; let list: any[] = []; - cpuFreqLimitSelection.cpuFreqLimitDatas.forEach((limitRowDatas: any) => { - for (let i = 0, len = limitRowDatas.length; i < len; i++) { - let it = limitRowDatas[i]; - if (it.startNs > cpuFreqLimitSelection.rightNs) { - break; - } - if (i === limitRowDatas.length - 1) { + getCpuLimitFreqBoxSelect(cpuFreqLimitSelection.cpuFreqLimit, cpuFreqLimitSelection.rightNs).then((res) => { + for (let it of res) { + if (!it.dur || it.startNs + it.dur > cpuFreqLimitSelection.rightNs) { it.dur = (cpuFreqLimitSelection.rightNs || 0) - (it.startNs || 0); - } else { - it.dur = (limitRowDatas[i + 1].startNs || 0) - (it.startNs || 0); } - list.push(it); } + this.formatData(res, cpuFreqLimitSelection.leftNs, cpuFreqLimitSelection.rightNs); }); - this.formatData(list, cpuFreqLimitSelection.leftNs, cpuFreqLimitSelection.rightNs); } initElements(): void { diff --git a/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqDataCut.ts b/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqDataCut.ts index 1a44c571d..24f4c4bf1 100644 --- a/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqDataCut.ts +++ b/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqDataCut.ts @@ -26,1154 +26,892 @@ import { LitChartScatter } from '../../../../../base-ui/chart/scatter/LitChartSc @element('tabpane-freqdatacut') export class TabPaneFreqDataCut extends BaseElement { - private threadStatesTbl: LitTable | null | undefined; - private threadStatesTblSource: Array = []; - private currentSelectionParam: SelectionParam | any; - private threadStatesDIV: HTMLDivElement | null | undefined; - private scatterInput: HTMLInputElement | null | undefined; - private initData: Map> = new Map(); - private processArr: Array = []; - private threadArr: Array = []; - private statisticsScatter: LitChartScatter | null | undefined; + private threadStatesTbl: LitTable | null | undefined; + private threadStatesTblSource: Array = []; + private currentSelectionParam: SelectionParam | any; + private threadStatesDIV: HTMLDivElement | null | undefined; + private scatterInput: HTMLInputElement | null | undefined; + private initData: Map> = new Map(); + private processArr: Array = []; + private threadArr: Array = []; + private statisticsScatter: LitChartScatter | null | undefined; - set data(threadStatesParam: SelectionParam) { - if (this.currentSelectionParam === threadStatesParam) { - return; - } - this.currentSelectionParam = threadStatesParam; - this.initData = new Map(); - this.threadArr = []; - this.initUI(); - this.init(threadStatesParam); - let pidArr: Array = []; - // 整理进程级的数组信息 - let processArr: Array = - threadStatesParam.processIds.length > 1 - ? [...new Set(threadStatesParam.processIds)] - : threadStatesParam.processIds; - for (let i of processArr) { - pidArr.push( - new TabPaneFreqUsageConfig( - Utils.PROCESS_MAP.get(i) === null ? 'Process ' + i : Utils.PROCESS_MAP.get(i) + ' ' + i, - '', i, '', 0, '', '', 0, '', 0, 'process', -1, []) - ); + set data(threadStatesParam: SelectionParam | any) { + if (this.currentSelectionParam === threadStatesParam) { + return; + } + this.currentSelectionParam = threadStatesParam; + this.initData = new Map(); + this.threadArr = []; + this.initUI(); + this.init(threadStatesParam); + let pidArr: Array = []; + // 整理进程级的数组信息 + let processArr: Array = threadStatesParam.processIds.length > 1 ? [...new Set(threadStatesParam.processIds)] : threadStatesParam.processIds; + for (let i of processArr) { + pidArr.push(new TabPaneFreqUsageConfig(Utils.PROCESS_MAP.get(i) === null ? 'Process ' + i : Utils.PROCESS_MAP.get(i) + ' ' + i, '', i, '', 0, '', '', 0, '', 0, 'process', -1, [])); + } + // 拷贝给私有属性,以便后续进行数据切割时免除整理进程层级数据 + this.processArr = pidArr; } - // 拷贝给私有属性,以便后续进行数据切割时免除整理进程层级数据 - this.processArr = pidArr; - } - /** - * 初始化数据 - */ - async init(threadStatesParam: SelectionParam): Promise { - let {runningMap, sum}: { - runningMap: Map>, - sum: number - } - = await this.queryRunningData(threadStatesParam); - let cpuFreqData: Array = await this.queryCpuFreqData( - threadStatesParam - ); - if (runningMap.size > 0) { - // 将cpu频点数据与running状态数据整合,保证其上该段时长内有对应的cpu频点数据 - this.mergeFreqData(runningMap, cpuFreqData, sum); - this.threadStatesTbl!.loading = false; - } else { - this.threadStatesTblSource = []; - this.threadStatesTbl!.recycleDataSource = []; - this.threadStatesTbl!.loading = false; + /** + * 初始化数据 + */ + async init(threadStatesParam: SelectionParam | any): Promise { + let [runningData, sum]: Array = await this.queryRunningData(threadStatesParam); + let cpuFreqData: Array = await this.queryCpuFreqData(threadStatesParam); + if (runningData.size > 0) { + // 将cpu频点数据与running状态数据整合,保证其上该段时长内有对应的cpu频点数据 + this.mergeFreqData(runningData, cpuFreqData, sum); + this.threadStatesTbl!.loading = false; + } else { + this.threadStatesTblSource = []; + this.threadStatesTbl!.recycleDataSource = []; + this.threadStatesTbl!.loading = false; + } } - } - /** - * 重置UI输入框等组件为默认状态 - */ - initUI(): void { - this.threadStatesTblSource = []; - this.threadStatesTbl!.recycleDataSource = []; - this.threadStatesTbl!.loading = true; - // @ts-ignore - this.threadStatesTbl.value = []; - // @ts-ignore - this.shadowRoot?.querySelector('#dataCutThreadId').style.border = '1px solid rgb(151,151,151)'; - // @ts-ignore - this.shadowRoot?.querySelector('#dataCutThreadFunc').style.border = '1px solid rgb(151,151,151)'; - // @ts-ignore - this.shadowRoot?.querySelector('#maxFreq').style.border = '1px solid rgb(151,151,151)'; - // @ts-ignore - this.shadowRoot?.querySelector('#maxHz').style.border = '1px solid rgb(151,151,151)'; - // @ts-ignore - this.shadowRoot?.querySelector('#cycle-a-start-range').value = ''; - // @ts-ignore - this.shadowRoot?.querySelector('#cycle-a-end-range').value = ''; - // @ts-ignore - this.shadowRoot?.querySelector('#cycle-b-start-range').value = ''; - // @ts-ignore - this.shadowRoot?.querySelector('#cycle-b-end-range').value = ''; - // @ts-ignore - this.shadowRoot?.querySelector('#cycleQuery')!.style.display = 'none'; - // @ts-ignore - this.statisticsScatter!.config = undefined; - this.parentElement!.style.overflow = 'hidden'; - } - /** - * 查询cpu频点信息 - */ - async queryCpuFreqData(threadStatesParam: SelectionParam): Promise> { - // 查询cpu及id信息 - let result: Array<{ id: number; cpu: number }> = await queryCpuFreqFilterId(); - // 以键值对形式将cpu及id进行对应,后续会将频点数据与其对应cpu进行整合 - let idMap: Map = new Map(); - let queryId: Array = []; - for (let i = 0; i < result.length; i++) { - queryId.push(result[i].id); - idMap.set(result[i].id, result[i].cpu); + /** + * 重置UI输入框等组件为默认状态 + */ + initUI(): void { + this.threadStatesTblSource = []; + this.threadStatesTbl!.recycleDataSource = []; + this.threadStatesTbl!.loading = true; + let tableValue: any = this.threadStatesTbl; + tableValue.value = []; + let divRoot1: any = this.shadowRoot?.querySelector('#dataCutThreadId'); + divRoot1.value = ''; + divRoot1.style.border = '1px solid rgb(151,151,151)'; + let divRoot2: any = this.shadowRoot?.querySelector('#dataCutThreadFunc'); + divRoot2.value = ''; + divRoot2.style.border = '1px solid rgb(151,151,151)'; + let divRoot3: any = this.shadowRoot?.querySelector('#maxFreq'); + divRoot3.style.border = '1px solid rgb(151,151,151)'; + let divRoot4: any = this.shadowRoot?.querySelector('#maxHz'); + divRoot4.style.border = '1px solid rgb(151,151,151)'; + let divRoot5: any = this.shadowRoot?.querySelector('#cycle-a-start-range'); + divRoot5.value = '' + let divRoot6: any = this.shadowRoot?.querySelector('#cycle-a-end-range'); + divRoot6.value = ''; + let divRoot7: any = this.shadowRoot?.querySelector('#cycle-b-start-range'); + divRoot7.value = ''; + let divRoot8: any = this.shadowRoot?.querySelector('#cycle-b-end-range'); + divRoot8.value = ''; + // @ts-ignore + this.shadowRoot?.querySelector('#cycleQuery')!.style.display = 'none'; + // @ts-ignore + this.statisticsScatter!.config = undefined; } - let dealArr: Array = []; - // 通过id去查询频点数据 - let res: Array<{ - startNS: number; - filter_id: number; - value: number; - dur: number} - > = await queryCpuFreqUsageData(queryId); - for (let i of res) { - dealArr.push( - new TabPaneCpuFreqConfig( - i.startNS + threadStatesParam.recordStartNs, - idMap.get(i.filter_id)!, - i.value, - i.dur - )); + /** + * 查询cpu频点信息 + */ + async queryCpuFreqData(threadStatesParam: SelectionParam | any): Promise> { + // 查询cpu及id信息 + let result: Array = await queryCpuFreqFilterId(); + // 以键值对形式将cpu及id进行对应,后续会将频点数据与其对应cpu进行整合 + let IdMap: Map = new Map(); + let queryId: Array = []; + for (let i = 0; i < result.length; i++) { + queryId.push(result[i].id); + IdMap.set(result[i].id, result[i].cpu); + } + let dealArr: Array = []; + // 通过id去查询频点数据 + let res: Array = await queryCpuFreqUsageData(queryId); + for (let i of res) { + let obj = new TabPaneCpuFreqConfig(i.startNS + threadStatesParam.recordStartNs, IdMap.get(i.filter_id)!, i.value, i.dur) + dealArr.push(obj); + } + return dealArr; } - return dealArr; - } - /** - * 查询框选区域内的所有running状态数据 - */ - async queryRunningData(threadStatesParam: SelectionParam): - Promise<{runningMap: Map>; sum: number}> { - let result: Array<{ - pid: number; - tid: number; - cpu: number; - dur: number; - ts: number; - process: string; - thread: string; - }> = await getTabRunningPercent(threadStatesParam.threadIds, threadStatesParam.leftNs, threadStatesParam.rightNs); - let needDeal: Map> = new Map(); - let sum: number = 0; - if (result !== null && result.length > 0) { - let processArr: Array = threadStatesParam.processIds.length > 1 - ? [...new Set(threadStatesParam.processIds)] : threadStatesParam.processIds; - for (let e of result) { - if (processArr.includes(e.pid)) { - if (needDeal.get(e.pid + '_' + e.tid) === undefined) { - this.threadArr.push( - new TabPaneFreqUsageConfig(Utils.THREAD_MAP.get(e.tid) + ' ' + e.tid, - '', e.pid, e.tid, 0, '', '', 0, '', 0, 'thread', -1, []) - ); - needDeal.set(e.pid + '_' + e.tid, new Array()); - } - if (e.ts < threadStatesParam.leftNs + threadStatesParam.recordStartNs && - e.ts + e.dur > threadStatesParam.leftNs + threadStatesParam.recordStartNs) { - const ts = e.ts; - e.ts = threadStatesParam.leftNs + threadStatesParam.recordStartNs; - e.dur = ts + e.dur - (threadStatesParam.leftNs + threadStatesParam.recordStartNs); - } - if (e.ts + e.dur > threadStatesParam.rightNs + threadStatesParam.recordStartNs) { - e.dur = threadStatesParam.rightNs + threadStatesParam.recordStartNs - e.ts; - } - e.process = Utils.PROCESS_MAP.get(e.pid) === null ? '[NULL]' : Utils.PROCESS_MAP.get(e.pid)!; - e.thread = Utils.THREAD_MAP.get(e.tid) === null ? '[NULL]' : Utils.THREAD_MAP.get(e.tid)!; - let arr: Array<{ - pid: number; - tid: number; - cpu: number; - dur: number; - ts: number; - process: string; - thread: string; - }> | undefined = needDeal.get(e.pid + '_' + e.tid); - sum += e.dur; - arr?.push(e); + /** + * 查询框选区域内的所有running状态数据 + */ + async queryRunningData(threadStatesParam: SelectionParam | any): Promise> { + let result: Array = await getTabRunningPercent(threadStatesParam.threadIds, threadStatesParam.leftNs, threadStatesParam.rightNs); + let needDeal: Map> = new Map(), sum: number = 0; + if (result != null && result.length > 0) { + let processArr: Array = threadStatesParam.processIds.length > 1 ? [...new Set(threadStatesParam.processIds)] : threadStatesParam.processIds; + for (let e of result) { + if (processArr.includes(e.pid)) { + if (needDeal.get(e.pid + '_' + e.tid) === undefined) { + this.threadArr.push(new TabPaneFreqUsageConfig(Utils.THREAD_MAP.get(e.tid) + ' ' + e.tid, '', e.pid, e.tid, 0, '', '', 0, '', 0, 'thread', -1, [])); + needDeal.set(e.pid + '_' + e.tid, new Array()); + } + if ((e.ts < (threadStatesParam.leftNs + threadStatesParam.recordStartNs)) && ((e.ts + e.dur) > (threadStatesParam.leftNs + threadStatesParam.recordStartNs))) { + const ts = e.ts; + e.ts = threadStatesParam.leftNs + threadStatesParam.recordStartNs; + e.dur = ts + e.dur - (threadStatesParam.leftNs + threadStatesParam.recordStartNs); + } + if ((e.ts + e.dur) > (threadStatesParam.rightNs + threadStatesParam.recordStartNs)) { + e.dur = threadStatesParam.rightNs + threadStatesParam.recordStartNs - e.ts; + } + let process = Utils.PROCESS_MAP.get(e.pid); + let thread = Utils.THREAD_MAP.get(e.tid); + e.process = process == null || process.length == 0 ? '[NULL]' : process; + e.thread = thread == null || thread.length == 0 ? '[NULL]' : thread; + let arr: any = needDeal.get(e.pid + '_' + e.tid); + sum += e.dur; + arr.push(e); + } + } } - } + return [needDeal, sum]; } - return {'runningMap': needDeal, 'sum': sum}; - } - /** - * 将cpu频点数据与running状态数据整合,保证其上该段时长内有对应的cpu频点数据 - */ - mergeFreqData( - needDeal: Map>, - dealArr: Array, - sum: number - ): void { - needDeal.forEach((value: Array, key: string) => { - let resultList: Array = []; - for (let i = 0; i < value.length; i++) { - for (let j = 0; j < dealArr.length; j++) { - // 只需要判断running状态数据与频点数据cpu相同的情况 - if (value[i].cpu === dealArr[j].cpu) { - // running状态数据的开始时间大于频点数据开始时间,小于频点结束时间。且running状态数据的持续时间小于频点结束时间减去running状态数据开始时间的情况 - if (value[i].ts > dealArr[j].startNS && - value[i].ts < dealArr[j].startNS + dealArr[j].dur && - value[i].dur < dealArr[j].startNS + dealArr[j].dur - value[i].ts) { - resultList.push(new TabPaneFreqUsageConfig(value[i].thread, value[i].ts, value[i].pid, - value[i].tid, 0, value[i].cpu,dealArr[j].value, value[i].dur, '', (value[i].dur / sum) * 100, - 'freqdata', -1, undefined)); - break; - } - // running状态数据的开始时间大于频点数据开始时间,小于频点结束时间。且running状态数据的持续时间大于频点结束时间减去running状态数据开始时间的情况 - if (value[i].ts > dealArr[j].startNS && - value[i].ts < dealArr[j].startNS + dealArr[j].dur && - value[i].dur > dealArr[j].startNS + dealArr[j].dur - value[i].ts) { - resultList.push(new TabPaneFreqUsageConfig(value[i].thread, value[i].ts, value[i].pid, - value[i].tid, 0, value[i].cpu, dealArr[j].value, dealArr[j].startNS + dealArr[j].dur - value[i].ts, '', - ((dealArr[j].startNS + dealArr[j].dur - value[i].ts) / sum) * 100, 'freqdata', -1, undefined)); - } - // running状态数据的开始时间小于频点数据开始时间,running状态数据的结束时间大于频点数据开始时间。且running状态数据在频点数据开始时间后的持续时间小于频点数据持续时间的情况 - if (value[i].ts < dealArr[j].startNS && - value[i].ts + value[i].dur > dealArr[j].startNS && - value[i].dur + value[i].ts - dealArr[j].startNS < dealArr[j].dur) { - resultList.push(new TabPaneFreqUsageConfig(value[i].thread, dealArr[j].startNS, value[i].pid, - value[i].tid, 0, value[i].cpu, dealArr[j].value, value[i].dur + value[i].ts - dealArr[j].startNS, '', - ((value[i].dur + value[i].ts - dealArr[j].startNS) / sum) * 100, 'freqdata', -1, undefined )); - break; + /** + * 将cpu频点数据与running状态数据整合,保证其上该段时长内有对应的cpu频点数据 + */ + mergeFreqData(needDeal: Map>, dealArr: Array, sum: number): void { + needDeal.forEach((value: Array, key: string) => { + let resultList: Array = []; + for (let i = 0; i < value.length; i++) { + for (let j = 0; j < dealArr.length; j++) { + // 只需要判断running状态数据与频点数据cpu相同的情况 + if (value[i].cpu === dealArr[j].cpu) { + // running状态数据的开始时间大于频点数据开始时间,小于频点结束时间。且running状态数据的持续时间小于频点结束时间减去running状态数据开始时间的情况 + if (value[i].ts > dealArr[j].startNS && value[i].ts < (dealArr[j].startNS + dealArr[j].dur) && value[i].dur < (dealArr[j].startNS + dealArr[j].dur - value[i].ts)) { + resultList.push(new TabPaneFreqUsageConfig(value[i].thread, value[i].ts, value[i].pid, value[i].tid, 0, value[i].cpu, dealArr[j].value, value[i].dur, '', value[i].dur / sum * 100, 'freqdata', -1, undefined)); + break; + } + // running状态数据的开始时间大于频点数据开始时间,小于频点结束时间。且running状态数据的持续时间大于频点结束时间减去running状态数据开始时间的情况 + if (value[i].ts > dealArr[j].startNS && value[i].ts < (dealArr[j].startNS + dealArr[j].dur) && value[i].dur > (dealArr[j].startNS + dealArr[j].dur - value[i].ts)) { + resultList.push(new TabPaneFreqUsageConfig(value[i].thread, value[i].ts, value[i].pid, value[i].tid, 0, value[i].cpu, dealArr[j].value, (dealArr[j].startNS + dealArr[j].dur - value[i].ts), '', (dealArr[j].startNS + dealArr[j].dur - value[i].ts) / sum * 100, 'freqdata', -1, undefined)); + } + // running状态数据的开始时间小于频点数据开始时间,running状态数据的结束时间大于频点数据开始时间。且running状态数据在频点数据开始时间后的持续时间小于频点数据持续时间的情况 + if (value[i].ts < dealArr[j].startNS && (value[i].ts + value[i].dur) > dealArr[j].startNS && (value[i].dur + value[i].ts - dealArr[j].startNS) < dealArr[j].dur) { + resultList.push(new TabPaneFreqUsageConfig(value[i].thread, dealArr[j].startNS, value[i].pid, value[i].tid, 0, value[i].cpu, dealArr[j].value, (value[i].dur + value[i].ts - dealArr[j].startNS), '', (value[i].dur + value[i].ts - dealArr[j].startNS) / sum * 100, 'freqdata', -1, undefined)); + break; + } + // running状态数据的开始时间小于频点数据开始时间,running状态数据的结束时间大于频点数据开始时间。且running状态数据在频点数据开始时间后的持续时间大于频点数据持续时间的情况 + if (value[i].ts < dealArr[j].startNS && (value[i].ts + value[i].dur) > dealArr[j].startNS && (value[i].dur + value[i].ts - dealArr[j].startNS) > dealArr[j].dur) { + resultList.push(new TabPaneFreqUsageConfig(value[i].thread, dealArr[j].startNS, value[i].pid, value[i].tid, 0, value[i].cpu, dealArr[j].value, dealArr[j].dur, '', dealArr[j].dur / sum * 100, 'freqdata', -1, undefined)); + } + // running状态数据的开始时间小于频点数据开始时间,running状态数据的持续时间小于频点数据开始时间的情况 + if (value[i].ts < dealArr[j].startNS && (value[i].ts + value[i].dur) < dealArr[j].startNS) { + resultList.push(new TabPaneFreqUsageConfig(value[i].thread, value[i].ts, value[i].pid, value[i].tid, 0, value[i].cpu, 'unknown', value[i].dur, '', value[i].dur / sum * 100, 'freqdata', -1, undefined)); + break; + } + } + } } - // running状态数据的开始时间小于频点数据开始时间,running状态数据的结束时间大于频点数据开始时间。且running状态数据在频点数据开始时间后的持续时间大于频点数据持续时间的情况 - if (value[i].ts < dealArr[j].startNS && - value[i].ts + value[i].dur > dealArr[j].startNS && - value[i].dur + value[i].ts - dealArr[j].startNS > dealArr[j].dur) { - resultList.push(new TabPaneFreqUsageConfig( value[i].thread, dealArr[j].startNS, value[i].pid, value[i].tid, - 0, value[i].cpu, dealArr[j].value, dealArr[j].dur, '', (dealArr[j].dur / sum) * 100, 'freqdata', -1, undefined)); + this.initData.set(key, resultList); + }) + } + /** + * single方式切割数据功能 + */ + dataSingleCut(threadId: HTMLInputElement, threadFunc: HTMLInputElement, resultList: Map>): void { + threadId.style.border = '1px solid rgb(151,151,151)'; + threadFunc.style.border = '1px solid rgb(151,151,151)'; + let threadIdValue = threadId.value.trim(); + let threadFuncName = threadFunc.value.trim(); + let leftNS = this.currentSelectionParam.leftNs; + let rightNS = this.currentSelectionParam.rightNs; + let tableValue: any = this.threadStatesTbl; + tableValue.value = []; + if (threadIdValue != '' && threadFuncName != '') { + // 根据用户输入的线程ID,方法名去查询数据库,得到对应的方法起始时间,持续时间等数据,以便作为依据进行后续数据切割 + querySearchFuncData(threadFuncName, Number(threadIdValue), leftNS, rightNS).then(result => { + if (result != null && result.length > 0) { + // targetMap为全局initData的拷贝对象,dealArr数组用来存放周期切割依据数据 + let targetMap: Map> = new Map(), dealArr: Array = []; + // 新创建map对象接收传过来的实参map + resultList.forEach((item: Array, key: string) => { + targetMap.set(key, JSON.parse(JSON.stringify(item))); + }) + // 整理周期切割依据的数据 + for (let i of result) { + if (i.startTime + this.currentSelectionParam.recordStartNs + i.dur < this.currentSelectionParam.rightNs + this.currentSelectionParam.recordStartNs) { + dealArr.push({ 'ts': i.startTime + this.currentSelectionParam.recordStartNs, 'dur': i.dur }); + } + } + let cycleMap: Map> = new Map(), totalList: Map> = new Map(); + this.mergeSingleData(dealArr, targetMap, cycleMap, totalList); + // 拷贝线程数组,防止数据污染 + let threadArr = JSON.parse(JSON.stringify(this.threadArr)); + // 拷贝进程数组,防止数据污染 + let processArr = JSON.parse(JSON.stringify(this.processArr)); + // 将周期层级防止到线程层级下 + this.mergeThreadData(threadArr, cycleMap); + // 将原始数据放置到对应的线程层级下,周期数据前 + let totalData = this.merge(totalList); + this.mergeTotalData(threadArr, totalData); + // 合并数据到进程层级下 + this.mergePidData(processArr, threadArr); + this.fixedDeal(processArr); + this.threadStatesTblSource = processArr; + this.threadStatesTbl!.recycleDataSource = processArr; + this.threadStatesTbl!.loading = false; + this.threadClick(processArr); + } else { + this.threadStatesTblSource = []; + this.threadStatesTbl!.recycleDataSource = []; + this.threadStatesTbl!.loading = false; + } + }) + } else { + this.threadStatesTbl!.loading = false; + if (threadIdValue == '') { + threadId.style.border = '2px solid rgb(255,0,0)'; } - // running状态数据的开始时间小于频点数据开始时间,running状态数据的持续时间小于频点数据开始时间的情况 - if (value[i].ts < dealArr[j].startNS && value[i].ts + value[i].dur < dealArr[j].startNS) { - resultList.push(new TabPaneFreqUsageConfig(value[i].thread, value[i].ts, value[i].pid, value[i].tid, - 0, value[i].cpu, 'unknown', value[i].dur, '', (value[i].dur / sum) * 100, 'freqdata', -1, undefined)); - break; + if (threadFuncName == '') { + threadFunc.style.border = '2px solid rgb(255,0,0)'; } - } } - } - this.initData.set(key, resultList); - }); - } - /** - * single方式切割数据功能 - */ - dataSingleCut( - threadId: HTMLInputElement, - threadFunc: HTMLInputElement, - resultList: Map> - ): void { - let threadIdValue: string = threadId.value.trim(); - let threadFuncName: string = threadFunc.value.trim(); - let leftNS: number = this.currentSelectionParam.leftNs; - let rightNS: number = this.currentSelectionParam.rightNs; - // @ts-ignore - this.threadStatesTbl.value = []; - if (threadIdValue !== '' && threadFuncName !== '') { - // 根据用户输入的线程ID,方法名去查询数据库,得到对应的方法起始时间,持续时间等数据,以便作为依据进行后续数据切割 - querySearchFuncData(threadFuncName, Number(threadIdValue), leftNS, rightNS).then((result) => { - if (result !== null && result.length > 0) { - // targetMap为全局initData的拷贝对象,dealArr数组用来存放周期切割依据数据 - let targetMap: Map> = new Map(); - let dealArr: Array = []; - // 新创建map对象接收传过来的实参map - resultList.forEach((item: Array, key: string) => { - targetMap.set(key, JSON.parse(JSON.stringify(item))); - }); - // 整理周期切割依据的数据 - for (let i of result) { - if ( - i.startTime + this.currentSelectionParam.recordStartNs + i.dur < - this.currentSelectionParam.rightNs + this.currentSelectionParam.recordStartNs) { - dealArr.push({ts: i.startTime + this.currentSelectionParam.recordStartNs, dur: i.dur}); + } + /** + * 整合Single切割方式中的频点数据与方法周期数据 + */ + mergeSingleData(dealArr: Array, targetMap: Map>, cycleMap: Map>, totalList: Map>): void { + let timeDur = this.currentSelectionParam.recordStartNs; + targetMap.forEach((value, key) => { + cycleMap.set(key, new Array()); + totalList.set(key, new Array()); + for (let i = 0; i < dealArr.length; i++) { + let cpuArr: Array = [], resList: Array = [], cpuMap: Map> = new Map(); + // 时间倍数值 + const countMutiple = 1000000; + cpuMap.set(key, new Array()); + cycleMap.get(key)?.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[0].thread, ((dealArr[i].ts - timeDur) / 1000000).toFixed(3), '', '', 0, '', '', 0, (dealArr[i].dur / 1000000).toFixed(3), 0, 'cycle', i + 1, [])); + for (let j = 0; j < value.length; j++) { + // 判断若用户导入json文件,则替换为对应cpu下的对应频点的算力值进行算力消耗计算 + let consumptionMap: Map | undefined ; + if (SpSegmentationChart.freqInfoMapData.size > 0 ) { + consumptionMap = SpSegmentationChart.freqInfoMapData.get(value[j].cpu); + } + + // 若存在算力值,则直接取值做计算。若不存在算力值,且频点值不为unknown的情况,则取频点值做计算,若为unknown,则取0做兼容 + const consumption = (consumptionMap && consumptionMap.get(value[j].freq)) ? consumptionMap.get(value[j].freq) : (value[j].freq == 'unknown' ? 0 : value[j].freq); + if (!cpuArr.includes(value[j].cpu)) { + cpuArr.push(value[j].cpu); + cpuMap.get(key)?.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, 0, value[j].cpu, '', 0, '', 0, 'cpu', -1, [])); + } + // 以下为频点数据按Single周期切割数据如何取舍的判断条件,dealArr为周期切割依据,value为某一线程下的频点汇总数据 + // 如果频点数据开始时间大于某一周期起始时间,小于该周期的结束时间。且频点数据结束时间小于周期结束时间的情况 + if (dealArr[i].ts < value[j].ts && dealArr[i].ts + dealArr[i].dur > value[j].ts && dealArr[i].ts + dealArr[i].dur > value[j].ts + value[j].dur) { + resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, (consumption * value[j].dur) / countMutiple, value[j].cpu, value[j].freq, value[j].dur, '', value[j].percent, 'freqdata', i, undefined)); + totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, (consumption * value[j].dur) / countMutiple, value[j].cpu, value[j].freq, value[j].dur, '', value[j].percent, 'freqdata', i, undefined)); + } + // 如果频点数据开始时间大于某一周期起始时间,小于该周期的结束时间。且频点数据结束时间大于等于周期结束时间的情况 + if (dealArr[i].ts < value[j].ts && dealArr[i].ts + dealArr[i].dur > value[j].ts && dealArr[i].ts + dealArr[i].dur <= value[j].ts + value[j].dur) { + resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, (dealArr[i].ts + dealArr[i].dur - value[j].ts) * consumption / countMutiple, value[j].cpu, value[j].freq, dealArr[i].ts + dealArr[i].dur - value[j].ts, '', (dealArr[i].ts + dealArr[i].dur - value[j].ts) / value[j].dur * value[j].percent, 'freqdata', i, undefined)); + totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, (dealArr[i].ts + dealArr[i].dur - value[j].ts) * consumption / countMutiple, value[j].cpu, value[j].freq, dealArr[i].ts + dealArr[i].dur - value[j].ts, '', (dealArr[i].ts + dealArr[i].dur - value[j].ts) / value[j].dur * value[j].percent, 'freqdata', i, undefined)); + break; + } + // 如果频点数据开始时间小于某一周期起始时间,结束时间大于该周期的开始时间。且频点数据结束时间大于周期结束时间的情况 + if (dealArr[i].ts > value[j].ts && value[j].ts + value[j].dur > dealArr[i].ts && value[j].ts + value[j].dur > dealArr[i].ts + dealArr[i].dur) { + resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, dealArr[i].dur * consumption / countMutiple, value[j].cpu, value[j].freq, dealArr[i].dur, '', dealArr[i].dur / value[j].dur * value[j].percent, 'freqdata', i, undefined)); + totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, dealArr[i].dur * consumption / countMutiple, value[j].cpu, value[j].freq, dealArr[i].dur, '', dealArr[i].dur / value[j].dur * value[j].percent, 'freqdata', i, undefined)); + break; + } + // 如果频点数据开始时间小于某一周期起始时间,结束时间大于该周期的开始时间。且频点数据结束时间小于等于周期结束时间的情况 + if (dealArr[i].ts > value[j].ts && value[j].ts + value[j].dur > dealArr[i].ts && value[j].ts + value[j].dur <= dealArr[i].ts + dealArr[i].dur) { + resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, (value[j].ts + value[j].dur - dealArr[i].ts) * consumption / countMutiple, value[j].cpu, value[j].freq, value[j].ts + value[j].dur - dealArr[i].ts, '', (value[j].ts + value[j].dur - dealArr[i].ts) / value[j].dur * value[j].percent, 'freqdata', i, undefined)); + totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, (value[j].ts + value[j].dur - dealArr[i].ts) * consumption / countMutiple, value[j].cpu, value[j].freq, value[j].ts + value[j].dur - dealArr[i].ts, '', (value[j].ts + value[j].dur - dealArr[i].ts) / value[j].dur * value[j].percent, 'freqdata', i, undefined)); + } + } + this.mergeData(resList); + // 整理排序相同周期下的数据 + this.mergeCpuData(cpuMap.get(key)!, resList); + // 将cpu数据放置到对应周期层级下 + this.mergeCycleData(cycleMap.get(key)![i], cpuMap.get(key)); } - } - let cycleMap: Map> = new Map(); - let totalList: Map> = new Map(); - this.mergeSingleData(dealArr, targetMap, cycleMap, totalList); - // 拷贝线程数组,防止数据污染 - let threadArr: Array = JSON.parse(JSON.stringify(this.threadArr)); - // 拷贝进程数组,防止数据污染 - let processArr: Array = JSON.parse(JSON.stringify(this.processArr)); - // 将周期层级防止到线程层级下 - this.mergeThreadData(threadArr, cycleMap); - // 将原始数据放置到对应的线程层级下,周期数据前 - let totalData = this.merge(totalList); - this.mergeTotalData(threadArr, totalData); - // 合并数据到进程层级下 - this.mergePidData(processArr, threadArr); - this.fixedDeal(processArr); - this.threadStatesTblSource = processArr; - this.threadStatesTbl!.recycleDataSource = processArr; - this.threadStatesTbl!.loading = false; - this.threadClick(processArr); - } else { - this.threadStatesTblSource = []; - this.threadStatesTbl!.recycleDataSource = []; - this.threadStatesTbl!.loading = false; - } - }); - } else { - this.threadStatesTbl!.loading = false; - if (threadIdValue === '') { - threadId.style.border = '2px solid rgb(255,0,0)'; - } - if (threadFuncName === '') { - threadFunc.style.border = '2px solid rgb(255,0,0)'; - } + }); } - } - /** - * 整合Single切割方式中的频点数据与方法周期数据 - */ - mergeSingleData( - dealArr: Array<{ts: number, dur: number}>, - targetMap: Map>, - cycleMap: Map>, - totalList: Map> - ): void { - let timeDur = this.currentSelectionParam.recordStartNs; - targetMap.forEach((value: any, key) => { - cycleMap.set(key, new Array()); - totalList.set(key, new Array()); - for (let i = 0; i < dealArr.length; i++) { - let cpuArr: Array = []; - let resList: Array = []; - let cpuMap: Map> = new Map(); - // 时间倍数值 - const countMutiple: number = 1000000; - cpuMap.set(key, new Array()); - cycleMap.get(key)?.push( - new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[0].thread, - ((dealArr[i].ts - timeDur) / 1000000).toFixed(3), key.split('_')[0], key.split('_')[1], - 0, '', '', 0, (dealArr[i].dur / 1000000).toFixed(3), 0, 'cycle', i + 1, [] )); - for (let j = 0; j < value.length; j++) { - // 判断若用户导入json文件,则替换为对应cpu下的对应频点的算力值进行算力消耗计算 - // @ts-ignore - let consumptionMap: Map = - SpSegmentationChart.freqInfoMapData.size > 0 && SpSegmentationChart.freqInfoMapData.get(value[j].cpu); - // 若存在算力值,则直接取值做计算。若不存在算力值,且频点值不为unknown的情况,则取频点值做计算,若为unknown,则取0做兼容 - const consumption: number = consumptionMap && consumptionMap.get(value[j].freq) - ? consumptionMap.get(value[j].freq) : (value[j].freq === 'unknown' ? 0 : value[j].freq); - if (!cpuArr.includes(value[j].cpu)) { - cpuArr.push(value[j].cpu); - cpuMap.get(key)?.push( - new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', - value[j].pid, value[j].tid, 0, value[j].cpu, '', 0, '', 0, 'cpu', -1, [])); - } - // 以下为频点数据按Single周期切割数据如何取舍的判断条件,dealArr为周期切割依据,value为某一线程下的频点汇总数据 - // 如果频点数据开始时间大于某一周期起始时间,小于该周期的结束时间。且频点数据结束时间小于周期结束时间的情况 - if (dealArr[i].ts < value[j].ts && - dealArr[i].ts + dealArr[i].dur > value[j].ts && - dealArr[i].ts + dealArr[i].dur > value[j].ts + value[j].dur) { - resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', - value[j].pid, value[j].tid, (consumption * value[j].dur) / countMutiple, value[j].cpu, - value[j].freq, value[j].dur, '', value[j].percent, 'freqdata', i, undefined)); - totalList.get(key)?.push(new TabPaneFreqUsageConfig( - value[j].thread, '', value[j].pid, value[j].tid, (consumption * value[j].dur) / countMutiple, - value[j].cpu, value[j].freq, value[j].dur, '', value[j].percent, 'freqdata', i, undefined)); - } - // 如果频点数据开始时间大于某一周期起始时间,小于该周期的结束时间。且频点数据结束时间大于等于周期结束时间的情况 - if (dealArr[i].ts < value[j].ts && - dealArr[i].ts + dealArr[i].dur > value[j].ts && - dealArr[i].ts + dealArr[i].dur <= value[j].ts + value[j].dur) { - resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread,'', - value[j].pid, value[j].tid, ((dealArr[i].ts + dealArr[i].dur - value[j].ts) * consumption) / countMutiple, - value[j].cpu, value[j].freq, dealArr[i].ts + dealArr[i].dur - value[j].ts, '', - ((dealArr[i].ts + dealArr[i].dur - value[j].ts) / value[j].dur) * value[j].percent, - 'freqdata', i, undefined)); - totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, - ((dealArr[i].ts + dealArr[i].dur - value[j].ts) * consumption) / countMutiple, value[j].cpu, - value[j].freq, dealArr[i].ts + dealArr[i].dur - value[j].ts, '', - ((dealArr[i].ts + dealArr[i].dur - value[j].ts) / value[j].dur) * value[j].percent, - 'freqdata', i, undefined)); - break; - } - // 如果频点数据开始时间小于某一周期起始时间,结束时间大于该周期的开始时间。且频点数据结束时间大于周期结束时间的情况 - if (dealArr[i].ts > value[j].ts && - value[j].ts + value[j].dur > dealArr[i].ts && - value[j].ts + value[j].dur > dealArr[i].ts + dealArr[i].dur) { - resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, - '', value[j].pid, value[j].tid, (dealArr[i].dur * consumption) / countMutiple, value[j].cpu, - value[j].freq, dealArr[i].dur, '', (dealArr[i].dur / value[j].dur) * value[j].percent, - 'freqdata', i, undefined)); - totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, - (dealArr[i].dur * consumption) / countMutiple, value[j].cpu, value[j].freq, dealArr[i].dur, '', - (dealArr[i].dur / value[j].dur) * value[j].percent, 'freqdata', i, undefined)); - break; - } - // 如果频点数据开始时间小于某一周期起始时间,结束时间大于该周期的开始时间。且频点数据结束时间小于等于周期结束时间的情况 - if (dealArr[i].ts > value[j].ts && - value[j].ts + value[j].dur > dealArr[i].ts && - value[j].ts + value[j].dur <= dealArr[i].ts + dealArr[i].dur) { - resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread,'', - value[j].pid, value[j].tid, ((value[j].ts + value[j].dur - dealArr[i].ts) * consumption) / countMutiple, - value[j].cpu, value[j].freq, value[j].ts + value[j].dur - dealArr[i].ts, '', - ((value[j].ts + value[j].dur - dealArr[i].ts) / value[j].dur) * value[j].percent, 'freqdata', i, undefined)); - totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, - ((value[j].ts + value[j].dur - dealArr[i].ts) * consumption) / countMutiple, value[j].cpu, value[j].freq, - value[j].ts + value[j].dur - dealArr[i].ts, '', ((value[j].ts + value[j].dur - dealArr[i].ts) / value[j].dur) * - value[j].percent, 'freqdata', i, undefined)); - } - } - this.mergeData(resList); - // 整理排序相同周期下的数据 - this.mergeCpuData(cpuMap.get(key)!, resList); - // 将cpu数据放置到对应周期层级下 - this.mergeCycleData(cycleMap.get(key)![i], cpuMap.get(key)!); - } - }); - } - - /** - * Loop方式切割数据功能 - */ - dataLoopCut( - threadId: HTMLInputElement, - threadFunc: HTMLInputElement, - resultList: Map> - ): void { - let threadIdValue = threadId.value.trim(); - let threadFuncName = threadFunc.value.trim(); - let leftNS = this.currentSelectionParam.leftNs; - let rightNS = this.currentSelectionParam.rightNs; - // @ts-ignore - this.threadStatesTbl.value = []; - if (threadIdValue !== '' && threadFuncName !== '') { - querySearchFuncData(threadFuncName, Number(threadIdValue), leftNS, rightNS).then((res) => { - if (res !== null && res.length > 0) { - // targetMap为全局initData的拷贝对象,cutArr数组用来存放周期切割依据数据 - let targetMap: Map> = new Map(); - let cutArr: Array = []; - // 新创建map对象接收传过来的实参map - resultList.forEach((item: Array, key: string) => { - targetMap.set(key, JSON.parse(JSON.stringify(item))); - }); - // 根据线程id及方法名获取的数据,处理后用作切割时间依据,时间跨度为整个方法开始时间到末个方法开始时间 - for (let i of res) { - cutArr[cutArr.length - 1] && (cutArr[cutArr.length - 1].dur = i.startTime ? i.startTime + - this.currentSelectionParam.recordStartNs - cutArr[cutArr.length - 1].ts : 0); - cutArr.push({ts: i.startTime + this.currentSelectionParam.recordStartNs}); - } - let cycleMap: Map> = new Map(); - let totalList: Map> = new Map(); - this.mergeLoopData(cutArr, targetMap, cycleMap, totalList); - let threadArr: Array = JSON.parse(JSON.stringify(this.threadArr)); - let processArr: Array = JSON.parse(JSON.stringify(this.processArr)); - this.mergeThreadData(threadArr, cycleMap); - let totalData = this.merge(totalList); - this.mergeTotalData(threadArr, totalData); - this.mergePidData(processArr, threadArr); - this.fixedDeal(processArr); - this.threadStatesTblSource = processArr; - this.threadStatesTbl!.recycleDataSource = processArr; - this.threadStatesTbl!.loading = false; - this.threadClick(processArr); + /** + * Loop方式切割数据功能 + */ + dataLoopCut(threadId: HTMLInputElement, threadFunc: HTMLInputElement, resultList: Map>): void { + threadId.style.border = '1px solid rgb(151,151,151)'; + threadFunc.style.border = '1px solid rgb(151,151,151)'; + let threadIdValue = threadId!.value.trim(); + let threadFuncName = threadFunc.value.trim(); + let leftNS = this.currentSelectionParam.leftNs; + let rightNS = this.currentSelectionParam.rightNs; + let tableValue: any = this.threadStatesTbl; + tableValue.value = []; + if (threadIdValue !== '' && threadFuncName !== '') { + querySearchFuncData(threadFuncName, Number(threadIdValue), leftNS, rightNS).then(res => { + if (res !== null && res.length > 0) { + // targetMap为全局initData的拷贝对象,cutArr数组用来存放周期切割依据数据 + let targetMap: Map> = new Map(), cutArr: Array = []; + // 新创建map对象接收传过来的实参map + resultList.forEach((item: Array, key: string) => { + targetMap.set(key, JSON.parse(JSON.stringify(item))); + }) + // 根据线程id及方法名获取的数据,处理后用作切割时间依据,时间跨度为整个方法开始时间到末个方法开始时间 + for (let i of res) { + cutArr[cutArr.length - 1] && (cutArr[cutArr.length - 1].dur = i.startTime ? i.startTime + this.currentSelectionParam.recordStartNs - cutArr[cutArr.length - 1].ts : 0); + cutArr.push({ 'ts': i.startTime + this.currentSelectionParam.recordStartNs }); + } + let cycleMap: Map> = new Map(); + let totalList: Map> = new Map(); + this.mergeLoopData(cutArr, targetMap, cycleMap, totalList); + let threadArr: Array = JSON.parse(JSON.stringify(this.threadArr)); + let processArr: Array = JSON.parse(JSON.stringify(this.processArr)); + this.mergeThreadData(threadArr, cycleMap); + let totalData = this.merge(totalList); + this.mergeTotalData(threadArr, totalData); + this.mergePidData(processArr, threadArr); + this.fixedDeal(processArr); + this.threadStatesTblSource = processArr; + this.threadStatesTbl!.recycleDataSource = processArr; + this.threadStatesTbl!.loading = false; + this.threadClick(processArr); + } else { + this.threadStatesTblSource = []; + this.threadStatesTbl!.recycleDataSource = []; + this.threadStatesTbl!.loading = false; + } + }) } else { - this.threadStatesTblSource = []; - this.threadStatesTbl!.recycleDataSource = []; - this.threadStatesTbl!.loading = false; + this.threadStatesTbl!.loading = false; + if (threadIdValue === '') { + threadId.style.border = '2px solid rgb(255,0,0)'; + } + if (threadFuncName === '') { + threadFunc.style.border = '2px solid rgb(255,0,0)'; + } } - }); - } else { - this.threadStatesTbl!.loading = false; - if (threadIdValue === '') { - threadId.style.border = '2px solid rgb(255,0,0)'; - } - if (threadFuncName === '') { - threadFunc.style.border = '2px solid rgb(255,0,0)'; - } } - } - /** - * 整合Loop切割方式中的频点数据与方法周期数据 - */ - mergeLoopData( - cutArr: Array<{ts: number, dur: number}>, - targetMap: Map>, - cycleMap: Map>, - totalList: Map> - ): void { - let timeDur: number = this.currentSelectionParam.recordStartNs; - targetMap.forEach((value, key) => { - cycleMap.set(key, new Array()); - totalList.set(key, new Array()); - for (let i = 0; i < cutArr.length - 1; i++) { - let cpuArr: Array = []; - let resList: Array = []; - let cpuMap: Map> = new Map(); - // 时间倍数值 - const countMutiple: number = 1000000; - cpuMap.set(key, new Array()); - // 创建周期层级数据 - cycleMap.get(key)?.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[0].thread, - ((cutArr[i].ts - timeDur) / 1000000).toFixed(3), key.split('_')[0], key.split('_')[1], 0, '', - '', 0, (cutArr[i].dur / 1000000).toFixed(3), 0, 'cycle', i + 1, [])); - for (let j = 0; j < value.length; j++) { - // 判断若用户导入json文件,则替换为对应cpu下的对应频点的算力值进行算力消耗计算 - // @ts-ignore - let consumptionMap: Map = - SpSegmentationChart.freqInfoMapData.size > 0 && SpSegmentationChart.freqInfoMapData.get(value[j].cpu); - // 若存在算力值,则直接取值做计算。若不存在算力值,且频点值不为unknown的情况,则取频点值做计算,若为unknown,则取0做兼容 - const consumption: number = consumptionMap && consumptionMap.get(value[j].freq) ? - consumptionMap.get(value[j].freq) : (value[j].freq === 'unknown' ? 0 : value[j].freq); - if (!cpuArr.includes(value[j].cpu)) { - cpuArr.push(value[j].cpu); - // 创建cpu层级数据,以便后续生成树结构 - cpuMap.get(key)?.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, - '', value[j].pid, value[j].tid, 0, value[j].cpu, '', 0, '', 0, 'cpu', -1, [])); - } - // 以下为频点数据按Loop周期切割数据如何取舍的判断条件,cutArr为周期切割依据,value为某一线程下的频点汇总数据 - // 如果频点数据开始时间大于某一周期起始时间,且结束时间小于等于下一同名方法开始时间的情况 - if (value[j].ts >= cutArr[i].ts && value[j].ts + value[j].dur <= cutArr[i + 1].ts) { - resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', - value[j].pid, value[j].tid, (consumption * value[j].dur) / countMutiple, value[j].cpu, - value[j].freq, value[j].dur, '', value[j].percent, 'freqdata', i, undefined)); - totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, - value[j].tid, (consumption * value[j].dur) / countMutiple, value[j].cpu, value[j].freq, - value[j].dur, '', value[j].percent, 'freqdata', i, undefined)); - } - // 如果频点数据开始时间大于某一周期起始时间,且结束时间大于下一同名方法开始时间的情况 - if (value[j].ts >= cutArr[i].ts && value[j].ts + value[j].dur > cutArr[i + 1].ts) { - if (cutArr[i + 1].ts - value[j].ts > 0) { - resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', - value[j].pid, value[j].tid, (consumption * (cutArr[i + 1].ts - value[j].ts)) / countMutiple, - value[j].cpu, value[j].freq, cutArr[i + 1].ts - value[j].ts, '', - value[j].percent * ((cutArr[i + 1].ts - value[j].ts) / value[j].dur), 'freqdata', i, undefined)); - totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, - (consumption * (cutArr[i + 1].ts - value[j].ts)) / countMutiple, value[j].cpu, value[j].freq, - cutArr[i + 1].ts - value[j].ts, '', value[j].percent * ((cutArr[i + 1].ts - value[j].ts) / value[j].dur), - 'freqdata', i, undefined)); - break; + /** + * 整合Loop切割方式中的频点数据与方法周期数据 + */ + mergeLoopData(cutArr: Array, targetMap: Map>, cycleMap: Map>, totalList: Map>): void { + let timeDur: number = this.currentSelectionParam.recordStartNs; + targetMap.forEach((value, key) => { + cycleMap.set(key, new Array()); + totalList.set(key, new Array()); + for (let i = 0; i < cutArr.length - 1; i++) { + let cpuArr: Array = [], resList: Array = [], cpuMap: Map> = new Map(); + // 时间倍数值 + const countMutiple = 1000000; + cpuMap.set(key, new Array()); + // 创建周期层级数据 + cycleMap.get(key)?.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[0].thread, ((cutArr[i].ts - timeDur) / 1000000).toFixed(3), '', '', 0, '', '', 0, (cutArr[i].dur / 1000000).toFixed(3), 0, 'cycle', i + 1, [])); + for (let j = 0; j < value.length; j++) { + // 判断若用户导入json文件,则替换为对应cpu下的对应频点的算力值进行算力消耗计算 + let consumptionMap: Map | undefined; + if (SpSegmentationChart.freqInfoMapData.size > 0){ + consumptionMap = SpSegmentationChart.freqInfoMapData.get(value[j].cpu); + } + // 若存在算力值,则直接取值做计算。若不存在算力值,且频点值不为unknown的情况,则取频点值做计算,若为unknown,则取0做兼容 + const consumption = (consumptionMap && consumptionMap.get(value[j].freq)) ? consumptionMap.get(value[j].freq) : (value[j].freq == 'unknown' ? 0 : value[j].freq); + if (!cpuArr.includes(value[j].cpu)) { + cpuArr.push(value[j].cpu); + // 创建cpu层级数据,以便后续生成树结构 + cpuMap.get(key)?.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, 0, value[j].cpu, '', 0, '', 0, 'cpu', -1, [])); + } + // 以下为频点数据按Loop周期切割数据如何取舍的判断条件,cutArr为周期切割依据,value为某一线程下的频点汇总数据 + // 如果频点数据开始时间大于某一周期起始时间,且结束时间小于等于下一同名方法开始时间的情况 + if (value[j].ts >= cutArr[i].ts && (value[j].ts + value[j].dur) <= cutArr[i + 1].ts) { + resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, (consumption * value[j].dur) / countMutiple, value[j].cpu, value[j].freq, value[j].dur, '', value[j].percent, 'freqdata', i, undefined)); + totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, (consumption * value[j].dur) / countMutiple, value[j].cpu, value[j].freq, value[j].dur, '', value[j].percent, 'freqdata', i, undefined)); + } + // 如果频点数据开始时间大于某一周期起始时间,且结束时间大于下一同名方法开始时间的情况 + if (value[j].ts >= cutArr[i].ts && (value[j].ts + value[j].dur) > cutArr[i + 1].ts) { + if (cutArr[i + 1].ts - value[j].ts > 0) { + resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, (consumption * (cutArr[i + 1].ts - value[j].ts)) / countMutiple, value[j].cpu, value[j].freq, cutArr[i + 1].ts - value[j].ts, '', value[j].percent * ((cutArr[i + 1].ts - value[j].ts) / value[j].dur), 'freqdata', i, undefined)); + totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, (consumption * (cutArr[i + 1].ts - value[j].ts)) / countMutiple, value[j].cpu, value[j].freq, cutArr[i + 1].ts - value[j].ts, '', value[j].percent * ((cutArr[i + 1].ts - value[j].ts) / value[j].dur), 'freqdata', i, undefined)); + break; + } + } + // 如果频点数据开始时间小于某一周期起始时间,且结束时间大于下一同名方法开始时间的情况 + if (value[j].ts < cutArr[i].ts && (value[j].ts + value[j].dur) > cutArr[i + 1].ts) { + resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, (consumption * (cutArr[i + 1].ts - cutArr[i].ts)) / countMutiple, value[j].cpu, value[j].freq, cutArr[i + 1].ts - cutArr[i].ts, '', value[j].percent * ((cutArr[i + 1].ts - cutArr[i].ts) / value[j].dur), 'freqdata', i, undefined)); + totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, (consumption * (cutArr[i + 1].ts - cutArr[i].ts)) / countMutiple, value[j].cpu, value[j].freq, cutArr[i + 1].ts - cutArr[i].ts, '', value[j].percent * ((cutArr[i + 1].ts - cutArr[i].ts) / value[j].dur), 'freqdata', i, undefined)); + } + // 如果频点数据开始时间小于某一周期起始时间,结束时间大于该方法开始时间。且频点数据结束时间小于下一同名方法开始时间 + if (value[j].ts < cutArr[i].ts && (value[j].ts + value[j].dur) > cutArr[i].ts && (value[j].ts + value[j].dur) < cutArr[i + 1].ts) { + resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, (consumption * (value[j].dur + value[j].ts - cutArr[i].ts)) / countMutiple, value[j].cpu, value[j].freq, value[j].dur + value[j].ts - cutArr[i].ts, '', value[j].percent * ((value[j].dur + value[j].ts - cutArr[i].ts) / value[j].dur), 'freqdata', i, undefined)); + totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, (consumption * (value[j].dur + value[j].ts - cutArr[i].ts)) / countMutiple, value[j].cpu, value[j].freq, value[j].dur + value[j].ts - cutArr[i].ts, '', value[j].percent * ((value[j].dur + value[j].ts - cutArr[i].ts) / value[j].dur), 'freqdata', i, undefined)); + } + } + // 合并相同周期内的数据 + this.mergeData(resList); + // 整理排序相同周期下的数据 + this.mergeCpuData(cpuMap.get(key)!, resList); + // 将cpu数据放置到对应周期层级下 + this.mergeCycleData(cycleMap.get(key)![i], cpuMap.get(key)); } - } - // 如果频点数据开始时间小于某一周期起始时间,且结束时间大于下一同名方法开始时间的情况 - if (value[j].ts < cutArr[i].ts && value[j].ts + value[j].dur > cutArr[i + 1].ts) { - resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread,'', value[j].pid, - value[j].tid, (consumption * (cutArr[i + 1].ts - cutArr[i].ts)) / countMutiple, value[j].cpu, value[j].freq, - cutArr[i + 1].ts - cutArr[i].ts, '', value[j].percent * ((cutArr[i + 1].ts - cutArr[i].ts) / value[j].dur), - 'freqdata', i, undefined)); - totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, - (consumption * (cutArr[i + 1].ts - cutArr[i].ts)) / countMutiple, value[j].cpu, value[j].freq, - cutArr[i + 1].ts - cutArr[i].ts, '', value[j].percent * ((cutArr[i + 1].ts - cutArr[i].ts) / value[j].dur), - 'freqdata', i, undefined)); - } - // 如果频点数据开始时间小于某一周期起始时间,结束时间大于该方法开始时间。且频点数据结束时间小于下一同名方法开始时间 - if (value[j].ts < cutArr[i].ts && - value[j].ts + value[j].dur > cutArr[i].ts && value[j].ts + value[j].dur < cutArr[i + 1].ts) { - resList.push(new TabPaneFreqUsageConfig('cycle' + (i + 1) + '—' + value[j].thread, '', value[j].pid, value[j].tid, - (consumption * (value[j].dur + value[j].ts - cutArr[i].ts)) / countMutiple, value[j].cpu, value[j].freq, - value[j].dur + value[j].ts - cutArr[i].ts, '', value[j].percent * - ((value[j].dur + value[j].ts - cutArr[i].ts) / value[j].dur), 'freqdata', i, undefined)); - totalList.get(key)?.push(new TabPaneFreqUsageConfig(value[j].thread, '', value[j].pid, value[j].tid, - (consumption * (value[j].dur + value[j].ts - cutArr[i].ts)) / countMutiple, value[j].cpu, value[j].freq, - value[j].dur + value[j].ts - cutArr[i].ts, '', value[j].percent * ((value[j].dur + value[j].ts - cutArr[i].ts) / - value[j].dur), 'freqdata', i, undefined)); - } - } - // 合并相同周期内的数据 - this.mergeData(resList); - // 整理排序相同周期下的数据 - this.mergeCpuData(cpuMap.get(key)!, resList); - // 将cpu数据放置到对应周期层级下 - this.mergeCycleData(cycleMap.get(key)![i], cpuMap.get(key)!); - } - }); - } - - /** - * 切割后整合好的周期频点数据放置到对应的线程下 - */ - mergeThreadData( - threadArr: Array, - cycleMap: Map> - ): void { - for (let i = 0; i < threadArr.length; i++) { - let cycleMapData: Array | undefined = cycleMap.get( - threadArr[i].pid + '_' + threadArr[i].tid - ); - for (let j = 0; j < cycleMapData!.length; j++) { - threadArr[i].children?.push(cycleMapData![j]); - threadArr[i].count += cycleMapData![j].count; - threadArr[i].dur += cycleMapData![j].dur; - // @ts-ignore - threadArr[i].percent += cycleMapData![j].percent; - } + }); } - } - /** - * 切割后整合好的线程级频点数据放置到对应的进程 - */ - mergePidData( - pidArr: Array, - threadArr: Array - ): void { - for (let i = 0; i < pidArr.length; i++) { - for (let j = 0; j < threadArr.length; j++) { - if (pidArr[i].pid === threadArr[j].pid) { - pidArr[i].children?.push(threadArr[j]); - pidArr[i].count += threadArr[j].count; - pidArr[i].dur += threadArr[j].dur; - // @ts-ignore - pidArr[i].percent += threadArr[j].percent; + /** + * 切割后整合好的周期频点数据放置到对应的线程下 + */ + mergeThreadData(threadArr: Array, cycleMap: Map>): void { + for (let i = 0; i < threadArr.length; i++) { + let cycleMapData = cycleMap.get(threadArr[i].pid + '_' + threadArr[i].tid); + for (let j = 0; j < cycleMapData!.length; j++) { + threadArr[i].children.push(cycleMapData![j]); + threadArr[i].count += cycleMapData![j].count; + threadArr[i].dur += cycleMapData![j].dur; + threadArr[i].percent += cycleMapData![j].percent; + } } - } } - } - /** - * 合并相同周期内运行所在cpu相同、频点相同的数据 - */ - mergeData(resList: Array): void { - // 合并相同周期内的数据 - for (let i = 0; i < resList.length; i++) { - for (let j = i + 1; j < resList.length; j++) { - if ( - resList[i].cpu === resList[j].cpu && - resList[i].freq === resList[j].freq && - resList[i].id === resList[j].id - ) { - resList[i].dur += resList[j].dur; - // @ts-ignore - resList[i].percent += resList[j].percent; - resList[i].count += resList[j].count; - resList.splice(j, 1); - j--; + /** + * 切割后整合好的线程级频点数据放置到对应的进程 + */ + mergePidData(pidArr: Array, threadArr: Array): void { + for (let i = 0; i < pidArr.length; i++) { + for (let j = 0; j < threadArr.length; j++) { + if (pidArr[i].pid === threadArr[j].pid) { + pidArr[i].children.push(threadArr[j]); + pidArr[i].count += threadArr[j].count; + pidArr[i].dur += threadArr[j].dur; + pidArr[i].percent += threadArr[j].percent; + } + } } - } } - } - /** - * 将cpu层级数据放到对应的周期层级下 - */ - mergeCycleData( - obj: TabPaneFreqUsageConfig, - arr: Array - ): void { - for (let i = 0; i < arr!.length; i++) { - if (arr![i].count === 0 && arr![i].dur === 0) { - continue; - } - obj.children?.push(arr![i]); - obj.count += arr![i].count; - obj.dur += arr![i].dur; - // @ts-ignore - obj.percent += arr![i].percent; - } - } - /** - * 将切割好的不区分周期的数据作为total数据放到对应的线程层级下,周期数据前 - */ - mergeTotalData( - threadArr: Array, - totalData: Array - ): void { - for (let i = 0; i < threadArr.length; i++) { - for (let j = 0; j < totalData.length; j++) { - if ( - Number(threadArr[i].pid) === Number(totalData[j].pid) && - Number(threadArr[i].tid) === Number(totalData[j].tid) - ) { - totalData[j].thread = 'TotalData'; - // @ts-ignore - threadArr[i].children.unshift(totalData[j]); + /** + * 合并相同周期内运行所在cpu相同、频点相同的数据 + */ + mergeData(resList: Array): void { + // 合并相同周期内的数据 + for (let i = 0; i < resList.length; i++) { + for (let j = i + 1; j < resList.length; j++) { + if (resList[i].cpu === resList[j].cpu && resList[i].freq === resList[j].freq && resList[i].id === resList[j].id) { + resList[i].dur += resList[j].dur; + resList[i].percent += resList[j].percent; + resList[i].count += resList[j].count; + resList.splice(j, 1); + j--; + } + } } - } } - } - /** - * 整理排序相同周期下的数据 - */ - mergeCpuData( - cpuArray: Array, - resList: Array - ): void { - // 以算力消耗降序排列 - resList.sort((a, b) => b.count - a.count); - // 以cpu升序排列 - cpuArray.sort((a: any, b: any) => a.cpu - b.cpu); - cpuArray.forEach((item: any) => { - for (let s = 0; s < resList.length; s++) { - if (item.cpu === resList[s].cpu) { - item.children.push(resList[s]); - item.count += resList[s].count; - item.dur += resList[s].dur; - item.percent += resList[s].percent; - } - } - }); - } - /** - * 切割好的不区分周期的数据,以相同cpu相同频点的进行整合 - */ - merge( - totalList: Map> - ): Array { - let result: Array = new Array(); - totalList.forEach((value: any, key: any) => { - let countNum = result.push( - new TabPaneFreqUsageConfig('', '', key.split('_')[0], key.split('_')[1], - 0, '', '', 0, '', 0, 'cycle', 0, [] - ) - ); - let cpuArr: Array = []; - let flagArr: Array = []; - for (let i = 0; i < value.length; i++) { - if (!flagArr.includes(value[i].cpu)) { - flagArr.push(value[i].cpu); - let flag = cpuArr.push( - new TabPaneFreqUsageConfig(value[i].thread, '', value[i].pid, value[i].tid, - 0, value[i].cpu, '', 0, '', 0, 'cpu', -1, [] - ) - ); - result[countNum - 1].children?.push(cpuArr[flag - 1]); - } - for (let j = i + 1; j < value.length; j++) { - if (value[i].cpu === value[j].cpu && value[i].freq === value[j].freq) { - value[i].dur += value[j].dur; - value[i].percent += value[j].percent; - value[i].count += value[j].count; - value.splice(j, 1); - j--; - } - } - } - result[countNum - 1].children?.sort((a: any, b: any) => a.cpu - b.cpu); - for (let i = 0; i < cpuArr.length; i++) { - for (let j = 0; j < value.length; j++) { - if (cpuArr[i].cpu === value[j].cpu) { - cpuArr[i].children.push(value[j]); - cpuArr[i].dur += value[j].dur; - cpuArr[i].count += value[j].count; - cpuArr[i].percent += value[j].percent; - } + /** + * 将cpu层级数据放到对应的周期层级下 + */ + mergeCycleData(obj: TabPaneFreqUsageConfig, arr: Array | undefined): void { + for (let i = 0; i < arr!.length; i++) { + if (arr![i].count === 0 && arr![i].dur === 0) { + continue; + } + obj.children?.push(arr![i]); + obj.count += arr![i].count; + obj.dur += arr![i].dur; + obj.percent += arr![i].percent; } - result[countNum - 1].dur += cpuArr[i].dur; - result[countNum - 1].count += cpuArr[i].count; - result[countNum - 1].percent += cpuArr[i].percent; - } - }); - return result; - } - /** - * 递归整理数据,取小数位数,转换单位 - */ - fixedDeal(arr: Array): void { - if (arr === undefined) { - return; } - for (let i = 0; i < arr.length; i++) { - // @ts-ignore - arr[i].percent = arr[i].percent.toFixed(2); - // @ts-ignore - arr[i].dur = (arr[i].dur / 1000000).toFixed(3); - if (arr[i].freq !== '') { - if (arr[i].freq === 'unknown') { - arr[i].freq = 'unknown'; - } else { - // @ts-ignore - arr[i].freq = arr[i].freq / 1000; + /** + * 将切割好的不区分周期的数据作为total数据放到对应的线程层级下,周期数据前 + */ + mergeTotalData(threadArr: Array, totalData: Array): void { + for (let i = 0; i < threadArr.length; i++) { + for (let j = 0; j < totalData.length; j++) { + if (Number(threadArr[i].pid) === Number(totalData[j].pid) && Number(threadArr[i].tid) === Number(totalData[j].tid)) { + totalData[j].thread = 'TotalData'; + threadArr[i].children.unshift(totalData[j]); + } + } } - } - if (!(SpSegmentationChart.freqInfoMapData.size > 0)) { - // @ts-ignore - arr[i].count = (arr[i].count / 1000).toFixed(3); - } else { - // @ts-ignore - arr[i].count = arr[i].count.toFixed(3); - } - // @ts-ignore - this.fixedDeal(arr[i].children); } - } + /** + * 整理排序相同周期下的数据 + */ + mergeCpuData(cpuArray: Array, resList: Array): void { + // 以算力消耗降序排列 + resList.sort((a, b) => b.count - a.count); + // 以cpu升序排列 + cpuArray.sort((a: any, b: any) => a.cpu - b.cpu); + cpuArray.forEach((item: any) => { + for (let s = 0; s < resList.length; s++) { + if (item.cpu === resList[s].cpu) { + item.children.push(resList[s]); + item.count += resList[s].count; + item.dur += resList[s].dur; + item.percent += resList[s].percent; + } + } + }); - /** - * 绑定表格点击事件 - */ - private threadClick(data: Array): void { - let labels = this.threadStatesTbl?.shadowRoot?.querySelector('.th > .td')!.querySelectorAll('label'); - if (labels) { - for (let i = 0; i < labels.length; i++) { - let label = labels[i].innerHTML; - labels[i].addEventListener('click', (e) => { - if (!this.threadStatesTblSource.length && !this.threadStatesTbl!.recycleDataSource.length) { - data = []; - } - if (label.includes('Process') && i === 0) { - this.threadStatesTbl!.setStatus(data, false); - this.threadStatesTbl!.recycleDs = this.threadStatesTbl!.meauseTreeRowElement(data, RedrawTreeForm.Retract); - } else if (label.includes('Thread') && i === 1) { - for (let item of data) { - item.status = true; - if (item.children !== undefined && item.children.length > 0) { - this.threadStatesTbl!.setStatus(item.children, false); - } + } + /** + * 切割好的不区分周期的数据,以相同cpu相同频点的进行整合 + */ + merge(totalList: Map>): Array { + let result: Array = new Array(); + totalList.forEach((value: any, key: any) => { + let countNum = result.push(new TabPaneFreqUsageConfig('', '', key.split('_')[0], key.split('_')[1], 0, '', '', 0, '', 0, 'cycle', 0, [])); + let cpuArr: Array = []; + let flagArr: Array = []; + for (let i = 0; i < value.length; i++) { + if (!flagArr.includes(value[i].cpu)) { + flagArr.push(value[i].cpu); + let flag = cpuArr.push(new TabPaneFreqUsageConfig(value[i].thread, '', value[i].pid, value[i].tid, 0, value[i].cpu, '', 0, '', 0, 'cpu', -1, [])); + result[countNum - 1].children?.push(cpuArr[flag - 1]); + } + for (let j = i + 1; j < value.length; j++) { + if (value[i].cpu === value[j].cpu && value[i].freq === value[j].freq) { + value[i].dur += value[j].dur; + value[i].percent += value[j].percent; + value[i].count += value[j].count; + value.splice(j, 1); + j--; + } + } } - this.threadStatesTbl!.recycleDs = this.threadStatesTbl!.meauseTreeRowElement( data, RedrawTreeForm.Retract); - } else if (label.includes('Cycle') && i === 2) { - for (let item of data) { - item.status = true; - for (let value of item.children ? item.children : []) { - value.status = true; - if (value.children !== undefined && value.children.length > 0) { - this.threadStatesTbl!.setStatus(value.children, false); + result[countNum - 1].children?.sort((a: any, b: any) => a.cpu - b.cpu); + for (let i = 0; i < cpuArr.length; i++) { + for (let j = 0; j < value.length; j++) { + if (cpuArr[i].cpu === value[j].cpu) { + cpuArr[i].children.push(value[j]); + cpuArr[i].dur += value[j].dur; + cpuArr[i].count += value[j].count; + cpuArr[i].percent += value[j].percent; + } } - } + result[countNum - 1].dur += cpuArr[i].dur; + result[countNum - 1].count += cpuArr[i].count; + result[countNum - 1].percent += cpuArr[i].percent; } - this.threadStatesTbl!.recycleDs = this.threadStatesTbl!.meauseTreeRowElement(data, RedrawTreeForm.Retract); - } else if (label.includes('CPU') && i === 3) { - this.threadStatesTbl!.setStatus(data, true); - this.threadStatesTbl!.recycleDs = this.threadStatesTbl!.meauseTreeRowElement(data, RedrawTreeForm.Expand); - } }); - } + return result; } - } - /** - * 散点图渲染数据整理 - */ - render(res: Array, str: string, queryCycleScatter: Array): void { - let maxFreq: HTMLInputElement = this.scatterInput!.querySelector('#maxFreq')!; - let maxHz: HTMLInputElement = this.scatterInput!.querySelector('#maxHz')!; - if (maxFreq.value && maxHz.value) { - if (/^[0-9]*$/.test(maxFreq.value) && /^[0-9]*$/.test(maxHz.value)) { - this.organizeData(res, str, queryCycleScatter, maxFreq.value, maxHz.value); - } else { - if (!/^[0-9]*$/.test(maxFreq.value)) { - maxFreq.style.border = '2px solid rgb(255,0,0)'; + /** + * 递归整理数据,取小数位数,转换单位 + */ + fixedDeal(arr: Array): void { + if (arr === undefined) { + return; } - if (!/^[0-9]*$/.test(maxHz.value)) { - maxHz.style.border = '2px solid rgb(255,0,0)'; + for (let i = 0; i < arr.length; i++) { + arr[i].percent = arr[i].percent > 100 ? 100 : arr[i].percent; + arr[i].percent = arr[i].percent.toFixed(2); + arr[i].dur = (arr[i].dur / 1000000).toFixed(3); + if (arr[i].freq !== '') { + if (arr[i].freq === 'unknown') { + arr[i].freq = 'unknown'; + } else { + arr[i].freq = arr[i].freq / 1000; + } + } + if(!(SpSegmentationChart.freqInfoMapData.size > 0)) { + arr[i].count = (arr[i].count / 1000).toFixed(3); + }else{ + arr[i].count = (arr[i].count).toFixed(3); + } + this.fixedDeal(arr[i].children); } - } - } else { - if (maxFreq.value === '') { - maxFreq.style.border = '2px solid rgb(255,0,0)'; - } - if (maxHz.value === '') { - maxHz.style.border = '2px solid rgb(255,0,0)'; - } - SpSegmentationChart.setChartData('CPU-FREQ', []); - } - } - /** - * 数据整理 - */ - organizeData( - res: Array, - str: string, - queryCycleScatter: Array, - maxFreqValue: string, - maxHzValue: string - ): void { - // @ts-ignore - this.shadowRoot?.querySelector('#cycleQuery')!.style.display = 'block'; - // @ts-ignore - let freq: Map = SpSegmentationChart.freqInfoMapData.size > 0 && - SpSegmentationChart.freqInfoMapData.get(SpSegmentationChart.freqInfoMapData.size - 1); - // @ts-ignore - let yAxis: number = freq && freq.get(Number(maxFreqValue) * 1000) - ? freq.get(Number(maxFreqValue) * 1000) : Number(maxFreqValue); - let xAxis: number = (yAxis * 1000) / Number(maxHzValue); - // 需要做筛选时,会利用下面的cycleA、cycleB数组 - let scatterArr: Array> = []; - let traceRowdata: Array<{ - dur: number; - startNS: number; - value: number; - cycle: number; - }> = []; - let cycleA: Array> = []; - let cycleB: Array> = []; - let cycleAStart: number = queryCycleScatter[0] || 0; - let cycleAEnd: number = queryCycleScatter[1] || 0; - let cycleBStart: number = queryCycleScatter[2] || 0; - let cycleBEnd: number = queryCycleScatter[3] || 0; - for (let i = 1; i < res.length; i++) { - const count: number = Number(res[i].count); - const dur: number = Number(res[i].cdur); - const rdur: number = Number(res[i].dur); //MHz·ms ms ms - scatterArr.push([count, count / dur, i, dur, rdur]); - traceRowdata.push({ - dur: dur * 1000000, - value: count, - startNS: Number(res[i].ts) * 1000000, - cycle: i - 1, - }); - if (dur >= cycleAStart && dur < cycleAEnd) { - cycleA.push([count, count / dur, i, dur, rdur]); - } - if (dur >= cycleBStart && dur < cycleBEnd) { - cycleB.push([count, count / dur, i, dur, rdur]); - } } - this.setConfig(Number(maxHzValue), str, scatterArr, yAxis, xAxis, cycleA, cycleB); - SpSegmentationChart.setChartData('CPU-FREQ', traceRowdata); - } - /** - * 配置散点图 - */ - setConfig( - maxHz: number, - str: string, - scatterArr: Array>, - yAxis: number, - xAxis: number, - cycleA: Array>, - cycleB: Array> - ): void { - this.statisticsScatter!.config = { - // 纵轴坐标值 - yAxisLabel: [ - Math.round(yAxis / 5), - Math.round((yAxis * 2) / 5), - Math.round((yAxis * 3) / 5), - Math.round((yAxis * 4) / 5), - Math.round(yAxis), - ], - // 横轴坐标值 - xAxisLabel: [ - Math.round(xAxis / 5), - Math.round((xAxis * 2) / 5), - Math.round((xAxis * 3) / 5), - Math.round((xAxis * 4) / 5), - Math.round(xAxis), - Math.round((xAxis * 6) / 5), - ], - // 横轴字段、纵轴字段 - AxisLabel: ['负载', '算力供给'], - // 是否加载最大负载线及均衡线 - drawload: true, - // 最大负载线及均衡线值 - load: [xAxis, maxHz], - // 绘制点数据信息存储数组 - paintingData: [], - // 当前移入点坐标信息 - hoverData: {}, - // 颜色池 - colorPool: () => ['#2f72f8', '#ffab67', '#a285d2'], - // 移入数据点时是否触发函数 - //@ts-ignore - hoverEvent: SpSegmentationChart.tabHover, - // 渐变色背景信息 - globalGradient: undefined, - // 渲染数据点 - data: [scatterArr, cycleA, cycleB], - // 散点图title - title: str, - colorPoolText: (): Array => ['Total', 'CycleA', 'CycleB'], - tip: (data: any): string => { - return ` -
- Cycle: ${data.c[2]};
- Comsumption: ${data.c[0]};
- Cycle_dur: ${data.c[3]} ms;
- Running_dur: ${data.c[4]} ms;
-
- `; - }, - }; - } + /** + * 绑定表格点击事件 + */ + private threadClick(data: Array): void { + let labels = this.threadStatesTbl?.shadowRoot?.querySelector('.th > .td')!.querySelectorAll('label'); + if (labels) { + for (let i = 0; i < labels.length; i++) { + let label = labels[i].innerHTML; + labels[i].addEventListener('click', (e) => { + if (!this.threadStatesTblSource.length && !this.threadStatesTbl!.recycleDataSource.length) { + data = []; + } + if (label.includes('Process') && i === 0) { + this.threadStatesTbl!.setStatus(data, false); + this.threadStatesTbl!.recycleDs = this.threadStatesTbl!.meauseTreeRowElement(data, RedrawTreeForm.Retract); + } else if (label.includes('Thread') && i === 1) { + for (let item of data) { + item.status = true; + if (item.children != undefined && item.children.length > 0) { + this.threadStatesTbl!.setStatus(item.children, false); + } + } + this.threadStatesTbl!.recycleDs = this.threadStatesTbl!.meauseTreeRowElement(data, RedrawTreeForm.Retract); + } else if (label.includes('Cycle') && i === 2) { + for (let item of data) { + item.status = true; + for (let value of item.children ? item.children : []) { + value.status = true; + if (value.children != undefined && value.children.length > 0) { + this.threadStatesTbl!.setStatus(value.children, false); + } + } + } + this.threadStatesTbl!.recycleDs = this.threadStatesTbl!.meauseTreeRowElement(data, RedrawTreeForm.Retract); + } else if (label.includes('CPU') && i === 3) { + this.threadStatesTbl!.setStatus(data, true); + this.threadStatesTbl!.recycleDs = this.threadStatesTbl!.meauseTreeRowElement(data, RedrawTreeForm.Expand); + } + }); + } + } + } + /** + * 散点图渲染数据整理 + */ + render(res: Array, str: string, queryCycleScatter: Array): void { + let maxFreq: HTMLInputElement = this.scatterInput!.querySelector('#maxFreq')!; + let maxHz: HTMLInputElement = this.scatterInput!.querySelector('#maxHz')!; + maxFreq.style.border = '1px solid rgb(151,151,151)'; + maxHz.style.border = '1px solid rgb(151,151,151)'; + if (maxFreq.value && maxHz.value) { + if (/^[0-9]*$/.test(maxFreq.value) && /^[0-9]*$/.test(maxHz.value)) { + // @ts-ignore + this.shadowRoot?.querySelector('#cycleQuery')!.style.display = 'block'; + let freq: Map | undefined; + if (SpSegmentationChart.freqInfoMapData.size > 0){ + freq = SpSegmentationChart.freqInfoMapData.get(SpSegmentationChart.freqInfoMapData.size - 1) + } + // @ts-ignore + let yAxis: number = (freq && freq.get(Number(maxFreq.value) * 1000)) ? freq.get(Number(maxFreq.value) * 1000) : Number(maxFreq.value); + let xAxis: number = yAxis * 1000 / Number(maxHz.value);//MHz·s + // 需要做筛选时,会利用下面的cycleA、cycleB数组 + let scatterArr: Array> = [], traceRowdata: Array = [], cycleA: Array> = [], cycleB: Array> = []; + let cycleAStart: number = queryCycleScatter[0] || 0, cycleAEnd: number = queryCycleScatter[1] || 0, cycleBStart: number = queryCycleScatter[2] || 0, cycleBEnd: number = queryCycleScatter[3] || 0; + for (let i = 1; i < res.length; i++) { + const count: number = Number(res[i].count), dur: number = Number(res[i].cdur), r_dur: number = Number(res[i].dur);//MHz·ms ms ms + scatterArr.push([count, count / dur, i, dur, r_dur]); + traceRowdata.push( + { + 'dur': dur * 1000000, + 'value': count, + 'freq': Math.round(count / dur) * 1000, + 'startNS': Number(res[i].ts) * 1000000, + 'cycle': i - 1 + } + ); + if (dur >= cycleAStart && dur < cycleAEnd) { + cycleA.push([count, count / dur, i, dur, r_dur]); + } + if (dur >= cycleBStart && dur < cycleBEnd) { + cycleB.push([count, count / dur, i, dur, r_dur]); + } + } + this.statisticsScatter!.config = { + // 纵轴坐标值 + yAxisLabel: [Math.round(yAxis / 5), Math.round(yAxis * 2 / 5), Math.round(yAxis * 3 / 5), Math.round(yAxis * 4 / 5), Math.round(yAxis)], + // 横轴坐标值 + xAxisLabel: [Math.round(xAxis / 5), Math.round(xAxis * 2 / 5), Math.round(xAxis * 3 / 5), Math.round(xAxis * 4 / 5), Math.round(xAxis), Math.round(xAxis * 6 / 5)], + // 横轴字段、纵轴字段 + AxisLabel: ['负载', '算力供给'], + // 是否加载最大负载线及均衡线 + drawload: true, + // 最大负载线及均衡线值 + load: [xAxis, Number(maxHz.value)], + // 绘制点数据信息存储数组 + paintingData: [], + // 当前移入点坐标信息 + hoverData: {}, + // 颜色池 + colorPool: () => ['#2f72f8', '#ffab67', '#a285d2'], + // 移入数据点时是否触发函数 + //@ts-ignore + hoverEvent: SpSegmentationChart.tabHover, + // 渐变色背景信息 + globalGradient: undefined, + // 渲染数据点 + data: [scatterArr, cycleA, cycleB], + // 散点图title + title: str, + colorPoolText: () => ['Total', 'CycleA', 'CycleB'], + tip: (data: any) => { + return ` +
+ Cycle: ${data.c[2]};
+ Comsumption: ${data.c[0]};
+ Cycle_dur: ${data.c[3]} ms;
+ Running_dur: ${data.c[4]} ms;
+
+ ` + } + }; + SpSegmentationChart.setChartData('CPU-FREQ', traceRowdata); + } else { + if (!/^[0-9]*$/.test(maxFreq.value)) { + maxFreq.style.border = '2px solid rgb(255,0,0)'; + } + if (!/^[0-9]*$/.test(maxHz.value)) { + maxHz.style.border = '2px solid rgb(255,0,0)'; + } + } + } else { + if (maxFreq.value === '') { + maxFreq.style.border = '2px solid rgb(255,0,0)'; + maxFreq.setAttribute('placeholder', 'Please input maxFreq'); + } + if (maxHz.value === '') { + maxHz.style.border = '2px solid rgb(255,0,0)'; + maxHz.setAttribute('placeholder', 'Please input Fps'); + } + SpSegmentationChart.setChartData('CPU-FREQ', []); - initElements(): void { - this.threadStatesTbl = this.shadowRoot?.querySelector('#tb-running-datacut'); - // 绑定事件 - this.addListener(); - this.statisticsScatter = this.shadowRoot?.querySelector('#chart-scatter'); - // 增加表格thread层级点击更新散点图事件、周期层级点击高亮泳道图对应段事件 - let scatterData: Array = new Array(); - let str: string = ''; - this.threadStatesTbl!.addEventListener('row-click', (evt): void => { - // @ts-ignore - if (evt.detail.flag === 'thread') { - // @ts-ignore - scatterData = evt.detail.children; - // @ts-ignore - str = evt.detail.thread; - this.render(scatterData, str, []); - } - // @ts-ignore - if (evt.detail.flag === 'cycle' && evt.detail.pid === scatterData[evt.detail.id - 1].pid - // @ts-ignore - && evt.detail.tid === scatterData[evt.detail.id - 1].tid && evt.detail.id > 0) { - // @ts-ignore - SpSegmentationChart.tabHover('CPU-FREQ', true, evt.detail.id - 1); - } - }); - this.scatterInput = this.shadowRoot?.querySelector('.chart-box'); - this.shadowRoot?.querySelector('#query-btn')!.addEventListener('click', (e) => { - // @ts-ignore - let cycleAStartValue = this.shadowRoot?.querySelector('#cycle-a-start-range')!.value; - // @ts-ignore - let cycleAEndValue = this.shadowRoot?.querySelector('#cycle-a-end-range')!.value; - // @ts-ignore - let cycleBStartValue = this.shadowRoot?.querySelector('#cycle-b-start-range')!.value; - // @ts-ignore - let cycleBEndValue = this.shadowRoot?.querySelector('#cycle-b-end-range')!.value; - let queryCycleScatter = [Number(cycleAStartValue), Number(cycleAEndValue), Number(cycleBStartValue), Number(cycleBEndValue)]; - this.render(scatterData, str, queryCycleScatter); - }); - } - /** - * 配置监听事件 - */ - addListener(): void { - // 绑定single、loop按钮点击事件 - this.threadStatesDIV = this.shadowRoot?.querySelector('#dataCut'); - this.threadStatesDIV?.children[2].children[0].addEventListener('click', (e) => { - this.threadStatesTbl!.loading = true; - // @ts-ignore - this.dataSingleCut(this.threadStatesDIV?.children[0]!, this.threadStatesDIV?.children[1]!, this.initData); - } - ); - this.threadStatesDIV?.children[2].children[1].addEventListener('click', (e) => { - this.threadStatesTbl!.loading = true; - // @ts-ignore - this.dataLoopCut(this.threadStatesDIV?.children[0]!, this.threadStatesDIV?.children[1]!, this.initData); - } - ); - this.threadStatesDIV?.children[0].addEventListener('focus', (e) => { - // @ts-ignore - this.threadStatesDIV?.children[0]!.style.border = '1px solid rgb(151,151,151)'; - } - ); - this.threadStatesDIV?.children[1].addEventListener('focus', (e) => { - // @ts-ignore - this.threadStatesDIV?.children[1]!.style.border = '1px solid rgb(151,151,151)'; - } - ); - this.shadowRoot?.querySelector('#maxFreq')?.addEventListener('focus', (e) => { - // @ts-ignore - this.shadowRoot?.querySelector('#maxFreq')!.style.border = '1px solid rgb(151,151,151)'; - }); - this.shadowRoot?.querySelector('#maxHz')?.addEventListener('focus', (e) => { - // @ts-ignore - this.shadowRoot?.querySelector('#maxHz')!.style.border = '1px solid rgb(151,151,151)'; - }); - } + } + } - connectedCallback(): void { - super.connectedCallback(); - resizeObserver(this.parentElement!, this.threadStatesTbl!); - } + initElements(): void { + this.threadStatesTbl = this.shadowRoot?.querySelector('#tb-running-datacut'); + // 绑定single、loop按钮点击事件 + this.threadStatesDIV = this.shadowRoot?.querySelector('#dataCut'); + this.threadStatesDIV?.children[2].children[0].addEventListener('click', (e) => { + this.threadStatesTbl!.loading = true; + // @ts-ignore + this.dataSingleCut(this.threadStatesDIV?.children[0]!, this.threadStatesDIV?.children[1]!, this.initData); + }) + this.threadStatesDIV?.children[2].children[1].addEventListener('click', (e) => { + this.threadStatesTbl!.loading = true; + // @ts-ignore + this.dataLoopCut(this.threadStatesDIV?.children[0]!, this.threadStatesDIV?.children[1]!, this.initData); + }) + this.statisticsScatter = this.shadowRoot?.querySelector('#chart-scatter'); + // 增加表格thread层级点击更新散点图事件、周期层级点击高亮泳道图对应段事件 + let scatterData: Array = new Array(); + let str: string = ''; + this.threadStatesTbl!.addEventListener('row-click', (evt): void => { + // @ts-ignore + if (evt.detail.flag === 'thread') { + // @ts-ignore + scatterData = evt.detail.children; + // @ts-ignore + str = evt.detail.thread; + this.render(scatterData, str, []); + } + // @ts-ignore + if (evt.detail.flag === 'cycle') { + // @ts-ignore + SpSegmentationChart.tabHover('CPU-FREQ', true, evt.detail.id - 1); - initHtml(): string { - return ` - -
- - -
- - -
-
- - -
- - - - - - - - - - - - - - - - - - -
- -
-
- maxFreq: - - Fps: - + + initHtml(): string { + return ` + +
+ + +
+ +
-
+
+ + +
+ + + + + + + + + + + + + + + + + +
- -

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 ZI7WMU-*H9O#zo-ku<;*<(u_{t{tr9%%7p*` literal 0 HcmV?d00001 diff --git a/ide/src/figures/deploy/put_bin.png b/ide/src/figures/deploy/put_bin.png new file mode 100644 index 0000000000000000000000000000000000000000..7945c95d265437d89924d8d19072f643f7b19b62 GIT binary patch literal 7684 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�~NY}WjTql8xI1+FV?*+P=^>8p4 zV!l}VJa0h!&m9D^B8!1EuOnEcIih+ zk8*`_#^B6^*lXhzHtq9@3`No0V>aMKLOa!IuZ5gr zDmT>Y(tRD(U*`5sIGBVzT>B_xC8$irxstqyTTx>7UJ`8w9E%70!4+8AYF7_#Fi?ii z-btsG3=#^_ILF5Z)hA}?FLL(ho;L6_F7cb(w-HU>lH0>_$E_Qgr`|gT38RrmaW&n zzAi+j|4FO^93?g~)$nw7P>iz{ImVeZgfeQo^y0Td?R?GAmretq)whzK+Y~m7?KZGK z6!nB07{GtWIHWcoGn7(MGxQ#p?T{9QzIj)hm%sW?ix;%xUonp?u7wZ;anA3@la&4U zUC38Z4`X}#bOxXisJEY$MeW(lwY78N*ViC}kdnY6ym&Cua#hj0*k5oUS6kzns0vFO z7s2fOCY+VknRmOPz=x&L>7$`p65bvvIIRm;vLPb0-j45YSPFMLOTFC=<#V8a)t&?- zjs@PsvmnQMrWA+Ux*Am1f0d|R%XHldSl-;zikY<4lZv|1?+$nQ4!;HfR7;BVFOQe% i@GS*h7m$xc^U#xrNcrh}Sd+kR0IbhDoU1awjQKAyXFYxZ literal 0 HcmV?d00001 diff --git a/ide/src/index.ts b/ide/src/index.ts index bd5dd96a2..758be7e66 100644 --- a/ide/src/index.ts +++ b/ide/src/index.ts @@ -1,17 +1,16 @@ -/* - * Copyright (C) 2022 Huawei Device Co., Ltd. - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ +// Copyright (c) 2021 Huawei Device Co., Ltd. +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + import './trace/SpApplication'; import { SpApplication } from './trace/SpApplication'; document.body.innerHTML = ''; diff --git a/ide/src/js-heap/LoadDatabase.ts b/ide/src/js-heap/LoadDatabase.ts index 0357eae83..b48e818c7 100644 --- a/ide/src/js-heap/LoadDatabase.ts +++ b/ide/src/js-heap/LoadDatabase.ts @@ -41,8 +41,8 @@ export class LoadDatabase { private async loadFile(listener: ParseListener) { this.fileModule = new Array(); - let result = await queryHeapFile(); - for (let row of result) { + let results = await queryHeapFile(); + for (let row of results) { let fileStruct = new FileStruct(); fileStruct.id = row.id; fileStruct.name = row.name; diff --git a/ide/src/statistics/util/SpStatisticsHttpUtil.ts b/ide/src/statistics/util/SpStatisticsHttpUtil.ts index ef9029776..c92138028 100644 --- a/ide/src/statistics/util/SpStatisticsHttpUtil.ts +++ b/ide/src/statistics/util/SpStatisticsHttpUtil.ts @@ -54,6 +54,7 @@ export class SpStatisticsHttpUtil { } catch { warn('Connect Server Failed') } + return ''; } diff --git a/ide/src/trace/SpApplication.ts b/ide/src/trace/SpApplication.ts index 0c2de7120..282145cc8 100644 --- a/ide/src/trace/SpApplication.ts +++ b/ide/src/trace/SpApplication.ts @@ -59,7 +59,7 @@ import { type SpKeyboard } from './component/SpKeyboard'; import './component/SpKeyboard'; import { parseKeyPathJson } from './component/Utils'; import { Utils } from './component/trace/base/Utils'; -import '../base-ui/chart/scatter/LitChartScatter'; +import "../base-ui/chart/scatter/LitChartScatter"; @element('sp-application') export class SpApplication extends BaseElement { @@ -160,6 +160,10 @@ export class SpApplication extends BaseElement { return this.hasAttribute('wasm'); } + set wasm(d: any) { + this.setAttribute('wasm', ''); + } + get server(): boolean { return this.hasAttribute('server'); } @@ -684,11 +688,17 @@ export class SpApplication extends BaseElement { litSearch.valueChangeHandler = (value: string) => { litSearch!.isClearValue = false; if (value.length > 0) { - let list = spSystemTrace!.searchCPU(value); - spSystemTrace!.searchFunction(list, value).then((mixedResults) => { - if (litSearch.searchValue != '') { - litSearch.list = spSystemTrace!.searchSdk(mixedResults, value); - } + let list: any[] = []; + progressEL.loading = true; + spSystemTrace!.searchCPU(value).then((cpus) => { + list = cpus; + spSystemTrace!.searchFunction(list, value).then((mixedResults) => { + if (litSearch.searchValue != '') { + litSearch.list = spSystemTrace!.searchSdk(mixedResults, value); + litSearch.index = spSystemTrace!.showStruct(false, -1, litSearch.list); + } + progressEL.loading = false; + }); }); } else { let indexEL = litSearch.shadowRoot!.querySelector('#index'); @@ -701,10 +711,10 @@ export class SpApplication extends BaseElement { spSystemTrace?.timerShaftEL?.removeTriangle('inverted'); } }; - spSystemTrace?.addEventListener('previous-data', (ev: any) => { + spSystemTrace?.addEventListener('trace-previous-data', (ev: any) => { litSearch.index = spSystemTrace!.showStruct(true, litSearch.index, litSearch.list); }); - spSystemTrace?.addEventListener('next-data', (ev: any) => { + spSystemTrace?.addEventListener('trace-next-data', (ev: any) => { litSearch.index = spSystemTrace!.showStruct(false, litSearch.index, litSearch.list); }); @@ -767,7 +777,7 @@ export class SpApplication extends BaseElement { litSearch.setPercent('Json Parse Failed!', -1); window.setTimeout(() => { litSearch.setPercent('Json Parse Failed!', 101); - }, 2000); + }, 1000); } } else { window.publish(window.SmartEvent.UI.KeyPath, []); @@ -869,7 +879,7 @@ export class SpApplication extends BaseElement { function postLog(filename: string, fileSize: string) { log('postLog filename is: ' + filename + ' fileSize: ' + fileSize); - fetch(`https://${window.location.host.split(':')[0]}:9000/logger`, { + fetch(`https://${window.location.host.split(':')[0]}:${window.location.port}/logger`, { method: 'POST', headers: { 'Content-Type': 'application/json', @@ -984,6 +994,7 @@ export class SpApplication extends BaseElement { //if cpu count > 1 or SchedulingAnalysis config 'enable' then show Scheduling-Analysis menu else hide it menus.splice(1, 1); } + return menus; } @@ -1086,7 +1097,7 @@ export class SpApplication extends BaseElement { } else { fd.append('file', ev as any); } - let uploadPath = `https://${window.location.host.split(':')[0]}:9000/application/upload`; + let uploadPath = `https://${window.location.host.split(':')[0]}:${window.location.port}/application/upload`; if (that.vs) { uploadPath = `http://${window.location.host.split(':')[0]}:${window.location.port}/application/upload`; } @@ -1115,7 +1126,7 @@ export class SpApplication extends BaseElement { if (res != undefined) { dbName = res; info('get trace db'); - let loadPath = `https://${window.location.host.split(':')[0]}:9000`; + let loadPath = `https://${window.location.host.split(':')[0]}:${window.location.port}`; if (that.vs) { loadPath = `http://${window.location.host.split(':')[0]}:${window.location.port}`; } @@ -1283,6 +1294,11 @@ export class SpApplication extends BaseElement { ); getTraceFileByPage(that.currentPageNum); }); + } else { + progressEL.loading = false; + litSearch.setPercent('The basic trace file in the large-file scenario is missing!', -1); + that.freshMenuDisable(false); + return; } }, 'long_trace' @@ -1474,6 +1490,7 @@ export class SpApplication extends BaseElement { if (headerStr.indexOf('OHOSPROF') !== 0 && rowTraceStr.indexOf('49df') !== 0) { isAllowTrace = false; } + cutTraceFile.style.display = 'block'; DbPool.sharedBuffer = null; } let index = 2; @@ -1589,7 +1606,6 @@ export class SpApplication extends BaseElement { let openFileInit = () => { this.clearTraceFileCache(); - cutTraceFile.style.display = 'block'; SpStatisticsHttpUtil.addOrdinaryVisitAction({ event: 'open_trace', action: 'open_trace', @@ -1643,27 +1659,46 @@ export class SpApplication extends BaseElement { let traceTypePage: Array = []; let allFileSize = 0; let readSize = 0; + let normalTraceNames: Array = []; + let specialTraceNames: Array = []; for (let index = 0; index < detail.length; index++) { let file = detail[index]; let fileName = file.name as string; allFileSize += file.size; - if (that.fileTypeList.some((fileType) => fileName.toLowerCase().includes(fileType))) { - continue; + let specialMatch = fileName.match(/_(arkts|ebpf|hiperf)\.htrace$/); + let normalMatch = fileName.match(/_\d{8}_\d{6}_\d+\.htrace$/); + if (normalMatch) { + normalTraceNames.push(fileName); + let fileNameStr = fileName.split('.')[0]; + let pageMatch = fileNameStr.match(/\d+$/); + if (pageMatch) { + traceTypePage.push(Number(pageMatch[0])); + } + } else if (specialMatch) { + specialTraceNames.push(fileName); } - let firstLastIndexOf = fileName.lastIndexOf('.'); - let firstText = fileName.slice(0, firstLastIndexOf); - let resultLastIndexOf = firstText.lastIndexOf('_'); - traceTypePage.push(Number(firstText.slice(resultLastIndexOf + 1, firstText.length)) - 1); + } + if (normalTraceNames.length <= 0) { + progressEL.loading = false; + litSearch.setPercent('No large trace files exists in the folder!', -1); + that.freshMenuDisable(false); + return; } traceTypePage.sort((leftNum: number, rightNum: number) => leftNum - rightNum); - const readFiles = async (files: FileList, traceTypePage: Array) => { + const readFiles = async (files: FileList, traceTypePage: Array, normalNames: Array, specialNames: Array) => { const promises = Array.from(files).map((file) => { - let types = that.fileTypeList.filter((type) => file.name.toLowerCase().includes(type.toLowerCase())); - return readFile(file, types, traceTypePage); + if (normalNames.indexOf(file.name.toLowerCase()) >= 0) { + return readFile(file, true, traceTypePage); + } else if (specialNames.indexOf(file.name.toLowerCase()) >= 0) { + return readFile(file, false, traceTypePage); + } else { + return; + } }); return Promise.all(promises); }; - const readFile = async (file: any, types: Array, traceTypePage: Array) => { + const readFile = async (file: any, isNormalType: boolean, traceTypePage: Array) => { + info('reading long trace file ', file.name); return new Promise((resolve, reject) => { let fileName = file.name; let fr = new FileReader(); @@ -1677,14 +1712,14 @@ export class SpApplication extends BaseElement { let maxSize = 48 * 1024 * 1024; let fileType = 'trace'; let pageNumber = 0; - if (types.length > 0) { - fileType = types[0]; + let firstLastIndexOf = fileName.lastIndexOf('.'); + let firstText = fileName.slice(0, firstLastIndexOf); + let resultLastIndexOf = firstText.lastIndexOf('_'); + let searchResult = firstText.slice(resultLastIndexOf + 1, firstText.length) + if (isNormalType) { + pageNumber = traceTypePage.lastIndexOf(Number(searchResult) + 1); } else { - let firstLastIndexOf = fileName.lastIndexOf('.'); - let firstText = fileName.slice(0, firstLastIndexOf); - let resultLastIndexOf = firstText.lastIndexOf('_'); - let searchNumber = Number(firstText.slice(resultLastIndexOf + 1, firstText.length)) - 1; - pageNumber = traceTypePage.lastIndexOf(searchNumber); + fileType = searchResult; } let chunk = maxSize; let offset = 0; @@ -1704,7 +1739,7 @@ export class SpApplication extends BaseElement { timStamp: timStamp, }) .then(() => { - if (index === 1 && types.length === 0) { + if (index === 1 && isNormalType) { that.longTraceHeadMessageList.push({ pageNum: pageNumber, data: data.slice(offset, 1024), @@ -1759,10 +1794,11 @@ export class SpApplication extends BaseElement { fr.onerror = function () { reject(false); }; + info('read over long trace file ', file.name); }); }; litSearch.setPercent('Read in file: ', 1); - readFiles(detail, traceTypePage).then(() => { + readFiles(detail, traceTypePage, normalTraceNames, specialTraceNames).then(() => { litSearch.setPercent('Cut in file: ', 1); sendCutFileMessage(timStamp); }); @@ -2371,16 +2407,8 @@ export class SpApplication extends BaseElement { return; } let recordStartNS = (window as any).recordStartNS; - let offset = Math.floor((cutRightNs - cutLeftNs) * 0.1); - let cutLeftTs = recordStartNS + cutLeftNs - offset; - if (cutLeftNs - offset < 0) { - cutLeftTs = recordStartNS; - } - let recordEndNS = (window as any).recordEndNS; - let cutRightTs = recordStartNS + cutRightNs + offset; - if (cutRightTs > recordEndNS) { - cutRightTs = recordEndNS; - } + let cutLeftTs = recordStartNS + cutLeftNs; + let cutRightTs = recordStartNS + cutRightNs; let minCutDur = 1_000_000; if (cutRightTs - cutLeftTs < minCutDur) { let unitTs = (cutRightTs - cutLeftTs) / 2; @@ -2392,14 +2420,13 @@ export class SpApplication extends BaseElement { threadPool.cutFile(cutLeftTs, cutRightTs, (status: boolean, msg: string, cutBuffer?: ArrayBuffer) => { progressEL.loading = false; if (status) { + FlagsConfig.updateFlagsConfig('FfrtConvert', 'Disabled'); let traceFileName = this.traceFileName as string; let cutIndex = traceFileName.indexOf('_cut_'); let fileType = traceFileName.substring(traceFileName.lastIndexOf('.')); let traceName = document.title.replace(/\s*\([^)]*\)/g, '').trim(); if (cutIndex != -1) { traceName = traceName.substring(0, cutIndex); - } else { - traceName = traceName; } let blobUrl = URL.createObjectURL(new Blob([cutBuffer!])); window.open( @@ -2478,7 +2505,7 @@ export class SpApplication extends BaseElement { if (isServer) { if (dbName != '') { let file = dbName?.substring(0, dbName?.lastIndexOf('.')) + fileName.substring(fileName.lastIndexOf('.')); - a.href = `https://${window.location.host.split(':')[0]}:9000` + file; + a.href = `https://${window.location.host.split(':')[0]}:${window.location.port}` + file; } else { return; } @@ -2552,13 +2579,17 @@ export class SpApplication extends BaseElement { }); } } else { - const fd = new FormData(); - fd.append('convertType', 'download'); - fd.append('filePath', filePath); - fd.append('file', new File([DbPool.sharedBuffer!], fileName)); - Cmd.uploadFile(fd, (res: Response) => { - if (res.ok) { - this.itemIconLoading(mainMenu, 'Current Trace', 'Download File', false); + this.readTraceFileBuffer().then((buffer) => { + if (buffer) { + const fd = new FormData(); + fd.append('convertType', 'download'); + fd.append('filePath', filePath); + fd.append('file', new File([buffer], fileName)); + Cmd.uploadFile(fd, (res: Response) => { + if (res.ok) { + this.itemIconLoading(mainMenu, 'Current Trace', 'Download File', false); + } + }); } }); } @@ -2566,23 +2597,6 @@ export class SpApplication extends BaseElement { }); } - private stopDownLoading(mainMenu: LitMainMenu, title: string = 'Download File') { - let querySelectorAll = mainMenu.shadowRoot?.querySelectorAll('lit-main-menu-group'); - querySelectorAll!.forEach((menuGroup) => { - let attribute = menuGroup.getAttribute('title'); - if (attribute === 'Current Trace') { - let querySelectors = menuGroup.querySelectorAll('lit-main-menu-item'); - querySelectors.forEach((item) => { - if (item.getAttribute('title') == title) { - item!.setAttribute('icon', 'download'); - let querySelector1 = item!.shadowRoot?.querySelector('.icon') as LitIcon; - querySelector1.removeAttribute('spin'); - } - }); - } - }); - } - freshMenuDisable(disable: boolean) { let mainMenu = this.shadowRoot?.querySelector('#main-menu') as LitMainMenu; // @ts-ignore diff --git a/ide/src/trace/bean/BoxSelection.ts b/ide/src/trace/bean/BoxSelection.ts index 0744b5623..f990d2bfb 100644 --- a/ide/src/trace/bean/BoxSelection.ts +++ b/ide/src/trace/bean/BoxSelection.ts @@ -50,13 +50,15 @@ export class SelectionParam { cpuFreqFilterNames: Array = []; cpuStateFilterIds: Array = []; cpuFreqFilterIds: Array = []; - cpuFreqLimitDatas: Array> = []; threadIds: Array = []; processIds: Array = []; processTrackIds: Array = []; virtualTrackIds: Array = []; - clockMapData: Map> = new Map>(); - irqMapData: Map> = new Map>(); + cpuFreqLimit: Array = []; + clockMapData: Map Promise> | undefined) | undefined> + = new Map (Promise> | undefined)) | undefined>(); + irqCallIds: Array = []; + softIrqCallIds: Array = []; funTids: Array = []; funAsync: Array<{ name: string; pid: number }> = []; nativeMemory: Array = []; @@ -112,8 +114,10 @@ export class SelectionParam { gpuMemoryAbilityData: Array = []; dmaVmTrackerData: Array = []; gpuMemoryTrackerData: Array = []; - hiLogs: Array = []; - hiSysEvents: Array = []; + hiLogs: Array = []; + sysAllEventsData: Array = []; + sysAlllogsData: Array = []; + hiSysEvents: Array = []; } export class BoxJumpParam { diff --git a/ide/src/trace/bean/FuncStruct.ts b/ide/src/trace/bean/FuncStruct.ts index 399e9b90f..b1da74e03 100644 --- a/ide/src/trace/bean/FuncStruct.ts +++ b/ide/src/trace/bean/FuncStruct.ts @@ -26,6 +26,7 @@ export class FuncStruct extends BaseStruct { dur: number | undefined; funName: string | undefined; id: number | undefined; + callid: number | undefined; is_main_thread: number | undefined; parent_id: number | undefined; startTs: number | undefined; diff --git a/ide/src/trace/bean/JsStruct.ts b/ide/src/trace/bean/JsStruct.ts index a94bc0204..22ae8175d 100644 --- a/ide/src/trace/bean/JsStruct.ts +++ b/ide/src/trace/bean/JsStruct.ts @@ -16,11 +16,11 @@ import { SampleType } from '../database/logic-worker/ProcedureLogicWorkerJsCpuProfiler'; const ROW_TYPE = 'cpu-profiler'; export class JsCpuProfilerUIStruct { - name: string; + nameId: number; depth: number; selfTime: number; totalTime: number; - url: string; + urlId: number; line: number; column: number; scriptName: string; @@ -29,56 +29,58 @@ export class JsCpuProfilerUIStruct { constructor( id: number, - name: string, + nameId: number, depth: number, selfTime: number, totalTime: number, - url: string, + urlId: number, line: number, column: number ) { this.id = id; this.parentId = -1; - this.name = name; + this.nameId = nameId; this.depth = depth; this.selfTime = selfTime; this.totalTime = totalTime; - this.url = url; + this.urlId = urlId; this.line = line; this.column = column; this.scriptName = ''; - if (url) { - let dirs = url.split('/'); - this.scriptName = dirs.pop() || ''; - } } } export class JsCpuProfilerChartFrame extends JsCpuProfilerUIStruct { + nameId: number; + urlId: number; startTime: number; endTime: number; children: Array; + childrenIds: Array; samplesIds: Array; isSelect: boolean = false; parent?: JsCpuProfilerChartFrame; constructor( id: number, - name: string, + nameId: number, startTime: number, endTime: number, totalTime: number, depth: number, - url: string, + urlId: number, line: number, column: number ) { - super(id, name, depth, 0, totalTime, url, line, column); + super(id, nameId, depth, 0, totalTime, urlId, line, column); this.id = id; this.startTime = startTime; this.endTime = endTime; + this.nameId = nameId; + this.urlId = urlId; this.children = new Array(); this.samplesIds = new Array(); + this.childrenIds = new Array(); } } @@ -95,20 +97,23 @@ export class JsCpuProfilerTabStruct extends JsCpuProfilerUIStruct { totalTimeStr: string = ''; //totalTime unit conversion isSearch: boolean = false; //filter data bold status: boolean = false; + name: string = ''; constructor( - name: string, + nameId: number, selfTime: number, totalTime: number, depth: number, - url: string, + urlId: number, line: number, column: number, + scriptName: string, id: number ) { - super(id, name, depth, selfTime, totalTime, url, line, column); + super(id, nameId, depth, selfTime, totalTime, urlId, line, column); this.chartFrameChildren = new Array(); this.children = new Array(); + this.scriptName = scriptName; } } diff --git a/ide/src/trace/bean/KeyPathStruct.ts b/ide/src/trace/bean/KeyPathStruct.ts index 4e572b487..4eb901829 100644 --- a/ide/src/trace/bean/KeyPathStruct.ts +++ b/ide/src/trace/bean/KeyPathStruct.ts @@ -17,6 +17,7 @@ export class KeyPathStruct { tid: number; threadName: string; tsArray: Array; + constructor(tid: number, threadName: string, tsArray: Array) { this.tid = tid; this.threadName = threadName; diff --git a/ide/src/trace/bean/ProcessMemStruct.ts b/ide/src/trace/bean/ProcessMemStruct.ts index 6e733e483..707ea38ed 100644 --- a/ide/src/trace/bean/ProcessMemStruct.ts +++ b/ide/src/trace/bean/ProcessMemStruct.ts @@ -18,7 +18,7 @@ import { ColorUtils } from '../component/trace/base/ColorUtils'; export class ProcessMemStruct extends BaseStruct { static hoverProcessMemStruct: ProcessMemStruct | undefined; - trackId: number | undefined; + // trackId: number | undefined; processName: string | undefined; pid: number | undefined; upid: number | undefined; diff --git a/ide/src/trace/bean/ThreadStruct.ts b/ide/src/trace/bean/ThreadStruct.ts index 48b8b870d..c15900dfd 100644 --- a/ide/src/trace/bean/ThreadStruct.ts +++ b/ide/src/trace/bean/ThreadStruct.ts @@ -34,6 +34,7 @@ export class ThreadStruct extends BaseStruct { tid: number | undefined; upid: number | undefined; utid: number | undefined; + switchCount:number | undefined; cpu: number | undefined; dur: number | undefined; end_ts: number | undefined; diff --git a/ide/src/trace/bean/WakeupBean.ts b/ide/src/trace/bean/WakeupBean.ts index 739be80e3..3510d1869 100644 --- a/ide/src/trace/bean/WakeupBean.ts +++ b/ide/src/trace/bean/WakeupBean.ts @@ -24,5 +24,7 @@ export class WakeupBean { schedulingDesc: string | undefined; ts: number | undefined; itid: number | undefined; + state: string | undefined; + argSetID: number | undefined; schedulingLatency: number | undefined; } diff --git a/ide/src/trace/component/SpHelp.ts b/ide/src/trace/component/SpHelp.ts index ae3f0aefe..5d81388be 100644 --- a/ide/src/trace/component/SpHelp.ts +++ b/ide/src/trace/component/SpHelp.ts @@ -130,7 +130,6 @@ export class SpHelp extends BaseElement { title: 'Native Memory抓取和展示说明', icon: '', clickHandler: function (item: MenuItem) { - console.log('22222'); SpStatisticsHttpUtil.addOrdinaryVisitAction({ event: 'native', action: 'help_doc', diff --git a/ide/src/trace/component/SpRecordTrace.ts b/ide/src/trace/component/SpRecordTrace.ts index f1b3d6a4e..b1174d761 100644 --- a/ide/src/trace/component/SpRecordTrace.ts +++ b/ide/src/trace/component/SpRecordTrace.ts @@ -2254,6 +2254,9 @@ export class SpRecordTrace extends BaseElement { memoryconfig.reportSysmemVmemInfo = true; memoryconfig.reportProcessMemInfo = true; } + if (this.spVmTracker!.startSamp) { + memoryconfig.reportProcessMemInfo = true; + } if (hasSmaps || hasMonitorMemory) { memoryconfig.reportPurgeableAshmemInfo = true; memoryconfig.reportDmaMemInfo = true; diff --git a/ide/src/trace/component/SpSystemTrace.ts b/ide/src/trace/component/SpSystemTrace.ts index 248a4b6ba..57ef09b21 100644 --- a/ide/src/trace/component/SpSystemTrace.ts +++ b/ide/src/trace/component/SpSystemTrace.ts @@ -19,11 +19,13 @@ import './trace/base/TraceRow'; import { queryBySelectAllocationOrReturn, queryBySelectExecute, - queryCpuKeyPathData, queryEbpfSamplesCount, querySceneSearchFunc, querySearchFunc, threadPool, + queryCpuKeyPathData, + queryTaskPoolRelationData, + queryTaskPoolOtherRelationData, } from '../database/SqlLite'; import { RangeSelectStruct, TraceRow } from './trace/base/TraceRow'; import { TimerShaftElement } from './trace/TimerShaftElement'; @@ -36,7 +38,7 @@ import { SpApplication } from '../SpApplication'; import { Flag } from './trace/timer-shaft/Flag'; import { SlicesTime, SportRuler } from './trace/timer-shaft/SportRuler'; import { SpHiPerf } from './chart/SpHiPerf'; -import { SearchSdkBean, SearchThreadProcessBean } from '../bean/SearchFuncBean'; +import { SearchSdkBean } from '../bean/SearchFuncBean'; import { error, info } from '../../log/Log'; import { drawFlagLineSegment, @@ -105,30 +107,15 @@ import { LitSearch } from './trace/search/Search'; import { TabPaneFlag } from './trace/timer-shaft/TabPaneFlag'; import { LitTabpane } from '../../base-ui/tabs/lit-tabpane'; import { HiPerfCallChartStruct } from '../database/ui-worker/ProcedureWorkerHiPerfCallChart'; -import { type HiSysEventStruct } from '../database/ui-worker/ProcedureWorkerHiSysEvent'; import { InitAnalysis } from '../database/logic-worker/ProcedureLogicWorkerCommon'; +import { searchCpuDataSender } from '../database/data-trafic/CpuDataSender'; import { type SpKeyboard } from '../component/SpKeyboard'; -import { drawVSync, enableVSync, resetVSync } from './chart/VSync'; +import { enableVSync, resetVSync } from './chart/VSync'; +import {QueryEnum} from "../database/data-trafic/QueryEnum"; -function dpr() { +function dpr(): number { return window.devicePixelRatio || 1; } -//节流处理 -function throttle(fn: any, t: number, ev: any): any { - let timer: any = null; - return function () { - if (!timer) { - timer = setTimeout(function () { - if (ev) { - fn(ev); - } else { - fn(); - } - timer = null; - }, t); - } - }; -} export class CurrentSlicesTime { startTime: number | undefined; @@ -151,6 +138,7 @@ export class SpSystemTrace extends BaseElement { static sliceRangeMark: any; static wakeupList: Array = []; static keyPathList: Array = []; + static jsProfilerMap: Map = new Map(); times: Set = new Set(); currentSlicesTime: CurrentSlicesTime = new CurrentSlicesTime(); intersectionObserver: IntersectionObserver | undefined; @@ -254,7 +242,7 @@ export class SpSystemTrace extends BaseElement { }; } - addPointPair(startPoint: PairPoint, endPoint: PairPoint) { + addPointPair(startPoint: PairPoint, endPoint: PairPoint): void { if (startPoint.rowEL.collect) { startPoint.rowEL.translateY = startPoint.rowEL.getBoundingClientRect().top - 195; } else { @@ -272,17 +260,17 @@ export class SpSystemTrace extends BaseElement { this.linkNodes.push([startPoint, endPoint]); } - clearPointPair() { + clearPointPair(): void { this.linkNodes.length = 0; } - removeLinkLinesByBusinessType(...businessTypes: string[]) { + removeLinkLinesByBusinessType(...businessTypes: string[]): void { this.linkNodes = this.linkNodes.filter((pointPair) => { return !(businessTypes.indexOf(pointPair[0].business) > -1); }); } - hiddenLinkLinesByBusinessType(...businessTypes: string[]) { + hiddenLinkLinesByBusinessType(...businessTypes: string[]): void { this.linkNodes.map((value) => { if (businessTypes.indexOf(value[0].business) !== -1) { value[0].hidden = true; @@ -291,7 +279,7 @@ export class SpSystemTrace extends BaseElement { }); } - showLinkLinesByBusinessType(...businessTypes: string[]) { + showLinkLinesByBusinessType(...businessTypes: string[]): void { this.linkNodes.map((value) => { if (businessTypes.indexOf(value[0].business) !== -1) { value[0].hidden = false; @@ -301,6 +289,7 @@ export class SpSystemTrace extends BaseElement { } initElements(): void { + window.subscribe(window.SmartEvent.UI.LoadFinishFrame, () => this.drawAllLines()); this.traceSheetEL = this.shadowRoot?.querySelector('.trace-sheet'); let rightButton: HTMLElement | null | undefined = this.traceSheetEL?.shadowRoot ?.querySelector('#current-selection > tabpane-current-selection') @@ -368,7 +357,7 @@ export class SpSystemTrace extends BaseElement { } cpuFavoriteRow!.setAttribute('collect-type', ''); let replaceRow = document.createElement('div'); - replaceRow.setAttribute('row-id', `${cpuFavoriteRow.rowId}-${cpuFavoriteRow.rowType}`); + replaceRow.setAttribute('row-id', cpuFavoriteRow.rowId + '-' + cpuFavoriteRow.rowType); replaceRow.setAttribute('type', 'replaceRow'); replaceRow.setAttribute('row-parent-id', cpuFavoriteRow.rowParentId); replaceRow.style.display = 'none'; @@ -590,14 +579,14 @@ export class SpSystemTrace extends BaseElement { ev.dataTransfer.dropEffect = 'move'; }); currentRow.addEventListener('drop', (ev: any) => { - if (this.favoriteChartListEL != null && this.currentClickRow != null && this.currentClickRow !== currentRow) { + if (this.favoriteChartListEL !== null && this.currentClickRow !== null && this.currentClickRow !== currentRow) { let rect = currentRow.getBoundingClientRect(); if (ev.clientY >= rect.top && ev.clientY < rect.top + rect.height / 2) { //向上移动 - this.favoriteChartListEL.insertRowBefore(this.currentClickRow, currentRow); + this.favoriteChartListEL!.insertRowBefore(this.currentClickRow!, currentRow); } else if (ev.clientY <= rect.bottom && ev.clientY > rect.top + rect.height / 2) { //向下移动 - this.favoriteChartListEL.insertRowBefore(this.currentClickRow, currentRow.nextSibling); + this.favoriteChartListEL!.insertRowBefore(this.currentClickRow!, currentRow.nextSibling); } this.refreshFavoriteCanvas(); } @@ -621,7 +610,7 @@ export class SpSystemTrace extends BaseElement { }); }); SpSystemTrace.scrollViewWidth = this.getScrollWidth(); - this.rangeSelect.selectHandler = (rows, refreshCheckBox) => { + this.rangeSelect.selectHandler = (rows, refreshCheckBox): void => { rows.forEach((item) => { this.setAttribute('clickRow', item.rowType!); this.setAttribute('rowName', item.name); @@ -698,7 +687,12 @@ export class SpSystemTrace extends BaseElement { selection.cpuFreqFilterNames.push(filterName); } } else if (it.rowType == TraceRow.ROW_TYPE_CPU_FREQ_LIMIT) { - selection.cpuFreqLimitDatas.push(it.dataList!); + selection.cpuFreqLimit.push({ + maxFilterId: it.getAttribute('maxFilterId'), + minFilterId: it.getAttribute('minFilterId'), + cpu: it.getAttribute('cpu'), + }); + // selection.cpuFreqLimitDatas.push(it.dataList!); } else if (it.rowType == TraceRow.ROW_TYPE_PROCESS) { this.pushPidToSelection(selection, it.rowId!); if (it.getAttribute('hasStartup') === 'true') { @@ -790,7 +784,7 @@ export class SpSystemTrace extends BaseElement { Math.min(filterFunc.startTs!, rangeData!.startNS || 0) < filterFunc.dur! + (rangeData!.endNS || 0) - (rangeData!.startNS || 0) && filterFunc.funName!.indexOf('H:Task ') >= 0; - let taskData = it.dataList.filter((taskData: FuncStruct) => { + let taskData = it.dataListCache.filter((taskData: FuncStruct) => { taskData!.tid = parseInt(it.rowId!); return isIntersect(taskData, TraceRow.rangeSelectObject!); }); @@ -996,34 +990,13 @@ export class SpSystemTrace extends BaseElement { } else if (it.rowType == TraceRow.ROW_TYPE_VMTRACKER_SHM) { selection.vmtrackershm.push(...intersectData(it)!); } else if (it.rowType == TraceRow.ROW_TYPE_CLOCK) { - selection.clockMapData.set( - it.rowId || '', - it.dataList.filter((clockData) => { - return Utils.getTimeIsCross( - clockData.startNS, - clockData.startNS + clockData.dur, - TraceRow.rangeSelectObject?.startNS || 0, - TraceRow.rangeSelectObject?.endNS || 0 - ); - }) - ); + selection.clockMapData.set(it.rowId || '', it.getCacheData); } else if (it.rowType == TraceRow.ROW_TYPE_IRQ) { - it.dataList.forEach((irqData) => { - if ( - Utils.getTimeIsCross( - irqData.startNS, - irqData.startNS + irqData.dur, - TraceRow.rangeSelectObject?.startNS || 0, - TraceRow.rangeSelectObject?.endNS || 0 - ) - ) { - if (selection.irqMapData.has(irqData.name)) { - selection.irqMapData.get(irqData.name)?.push(irqData); - } else { - selection.irqMapData.set(irqData.name, [irqData]); - } - } - }); + if (it.getAttribute('cat') === 'irq') { + selection.irqCallIds.push(parseInt(it.getAttribute('callId') || '-1')); + } else { + selection.softIrqCallIds.push(parseInt(it.getAttribute('callId') || '-1')); + } } else if (it.rowType === TraceRow.ROW_TYPE_VM_TRACKER) { let vMTrackerChildRows: Array> = [ ...this.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), @@ -1048,28 +1021,28 @@ export class SpSystemTrace extends BaseElement { selection.gpuMemoryTrackerData.push(...intersectData(item)!); } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL) { selection.gpu.gl = - item.dataList.filter( + item.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { selection.gpu.graph = - item.dataList.filter( + item.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { selection.gpu.gpuTotal = - item.dataList.filter( + item.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW) { selection.gpu.gpuWindow = - item.dataList.filter( + item.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) @@ -1110,28 +1083,28 @@ export class SpSystemTrace extends BaseElement { selection.gpuMemoryTrackerData.push(...intersectData(th)!); } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL) { selection.gpu.gl = - th.dataList.filter( + th.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { selection.gpu.graph = - th.dataList.filter( + th.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { selection.gpu.gpuTotal = - th.dataList.filter( + th.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW) { selection.gpu.gpuWindow = - th.dataList.filter( + th.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) @@ -1144,28 +1117,28 @@ export class SpSystemTrace extends BaseElement { selection.dmaVmTrackerData.push(...intersectData(it)!); } else if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL) { selection.gpu.gl = - it.dataList.filter( + it.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; } else if (it.rowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { selection.gpu.graph = - it.dataList.filter( + it.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; } else if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { selection.gpu.gpuTotal = - it.dataList.filter( + it.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) ).length > 0; } else if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW) { selection.gpu.gpuWindow = - it.dataList.filter( + it.dataListCache.filter( (it) => (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) @@ -1177,7 +1150,7 @@ export class SpSystemTrace extends BaseElement { filterJank.dur! + (rangeData!.endNS || 0) - (rangeData!.startNS || 0); if (it.name == 'Actual Timeline') { selection.jankFramesData = []; - let jankDatas = it.dataList.filter((jankData: any) => { + let jankDatas = it.dataListCache.filter((jankData: any) => { return isIntersect(jankData, TraceRow.rangeSelectObject!); }); selection.jankFramesData.push(jankDatas); @@ -1185,7 +1158,7 @@ export class SpSystemTrace extends BaseElement { selection.jankFramesData = []; it.childrenList.forEach((child) => { if (child.rowType == TraceRow.ROW_TYPE_JANK && child.name == 'Actual Timeline') { - let jankDatas = child.dataList.filter((jankData: any) => { + let jankDatas = child.dataListCache.filter((jankData: any) => { return isIntersect(jankData, TraceRow.rangeSelectObject!); }); selection.jankFramesData.push(jankDatas); @@ -1198,18 +1171,18 @@ export class SpSystemTrace extends BaseElement { ? TraceRow.rangeSelectObject?.startNS : TraceRow.range?.startNS; let minNodeId, maxNodeId; - if (!it.dataList || it.dataList.length === 0) { + if (!it.dataListCache || it.dataListCache.length === 0) { return; } - for (let sample of it.dataList) { + for (let sample of it.dataListCache) { if (sample.timestamp * 1000 <= startNS!) { minNodeId = sample.lastAssignedId; } // 个别文件的sample的最大timestamp小于时间的框选结束时间,不能给maxNodeId赋值 - // 所以加上此条件:sample.timestamp === it.dataList[it.dataList.length -1].timestamp + // 所以加上此条件:sample.timestamp === it.dataListCache[it.dataListCache.length -1].timestamp if ( sample.timestamp * 1000 >= endNS! || - sample.timestamp === it.dataList[it.dataList.length - 1].timestamp + sample.timestamp === it.dataListCache[it.dataListCache.length - 1].timestamp ) { if (maxNodeId === undefined) { maxNodeId = sample.lastAssignedId; @@ -1218,15 +1191,18 @@ export class SpSystemTrace extends BaseElement { } // If the start time range of the selected box is greater than the end time of the sampled data - if (startNS! >= it.dataList[it.dataList.length - 1].timestamp * 1000) { - minNodeId = it.dataList[it.dataList.length - 1].lastAssignedId; + if (startNS! >= it.dataListCache[it.dataListCache.length - 1].timestamp * 1000) { + minNodeId = it.dataListCache[it.dataListCache.length - 1].lastAssignedId; } // If you select the box from the beginning if (startNS! <= TraceRow.range?.startNS!) { minNodeId = HeapDataInterface.getInstance().getMinNodeId(this.snapshotFiles!.id); } //If you select the box from the ending - if (endNS! >= TraceRow.range?.endNS! || endNS! >= it.dataList[it.dataList.length - 1].timestampUs * 1000) { + if ( + endNS! >= TraceRow.range?.endNS! || + endNS! >= it.dataListCache[it.dataListCache.length - 1].timestampUs * 1000 + ) { maxNodeId = HeapDataInterface.getInstance().getMaxNodeId(this.snapshotFiles!.id); } let summary = (this.traceSheetEL?.shadowRoot?.querySelector('#tabs') as LitTabs) @@ -1238,7 +1214,7 @@ export class SpSystemTrace extends BaseElement { let isIntersect = (a: JsCpuProfilerStruct, b: RangeSelectStruct) => Math.max(a.startTime! + a.totalTime!, b!.endNS || 0) - Math.min(a.startTime!, b!.startNS || 0) < a.totalTime! + (b!.endNS || 0) - (b!.startNS || 0); - let frameSelectData = it.dataList.filter((frameSelectData: any) => { + let frameSelectData = it.dataListCache.filter((frameSelectData: any) => { return isIntersect(frameSelectData, TraceRow.rangeSelectObject!); }); let copyFrameSelectData = JSON.parse(JSON.stringify(frameSelectData)); @@ -1247,8 +1223,9 @@ export class SpSystemTrace extends BaseElement { frameSelectDataIdArr.push(data.id); } let jsCpuProfilerData = copyFrameSelectData.filter((item: any) => { - if (item.depth == 0) { + if (item.depth === 0) { setSelectState(item, frameSelectDataIdArr); + item.isSelect = true; return item; } }); @@ -1258,7 +1235,7 @@ export class SpSystemTrace extends BaseElement { Math.max(animationStruct.startTs! + animationStruct.dur!, selectStruct!.endNS || 0) - Math.min(animationStruct.startTs!, selectStruct!.startNS || 0) < animationStruct.dur! + (selectStruct!.endNS || 0) - (selectStruct!.startNS || 0); - let frameAnimationList = it.dataList.filter((frameAnimationBean: FrameAnimationStruct) => { + let frameAnimationList = it.dataListCache.filter((frameAnimationBean: FrameAnimationStruct) => { return isIntersect(frameAnimationBean, TraceRow.rangeSelectObject!); }); selection.frameAnimation.push(...frameAnimationList); @@ -1266,7 +1243,7 @@ export class SpSystemTrace extends BaseElement { let appName = it.getAttribute('model-name'); let isSelect = (dynamicStruct: FrameDynamicStruct, b: RangeSelectStruct) => dynamicStruct.ts >= b.startNS! && dynamicStruct.ts <= b.endNS!; - let frameDynamicList = it.dataList.filter( + let frameDynamicList = it.dataListCache.filter( (frameAnimationBean: FrameDynamicStruct) => isSelect(frameAnimationBean, TraceRow.rangeSelectObject!) && frameAnimationBean.groupId !== -1 && @@ -1277,7 +1254,7 @@ export class SpSystemTrace extends BaseElement { let appName = it.getAttribute('model-name'); let isSelect = (a: FrameSpacingStruct, b: RangeSelectStruct) => a.currentTs >= b.startNS! && a.currentTs <= b.endNS!; - let frameDatas = it.dataList.filter((frameData: FrameSpacingStruct) => { + let frameDatas = it.dataListCache.filter((frameData: FrameSpacingStruct) => { return ( isSelect(frameData, TraceRow.rangeSelectObject!) && frameData.groupId !== -1 && @@ -1295,26 +1272,9 @@ export class SpSystemTrace extends BaseElement { } else if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_PIN_VM) { selection.purgeablePinVM.push(...intersectData(it)); } else if (it.rowType === TraceRow.ROW_TYPE_LOGS) { - let systemLogs: LogStruct[] = it.dataList.filter( - (logStruct: LogStruct) => - (logStruct.startTs ?? 0) >= TraceRow.rangeSelectObject!.startNS! && - (logStruct.startTs ?? 0) <= TraceRow.rangeSelectObject!.endNS! - ); - let batchSize = 10000; - let totalLogs = systemLogs.length; - let currentIndex = 0; - while (currentIndex < totalLogs) { - let batch = systemLogs.slice(currentIndex, currentIndex + batchSize); - selection.hiLogs.push(...batch); - currentIndex += batchSize; - } + selection.hiLogs.push(it.rowId!); } else if (it.rowType === TraceRow.ROW_TYPE_HI_SYSEVENT) { - let systemEvents: HiSysEventStruct[] = it.dataList.filter( - (systemEventStruct: HiSysEventStruct) => - (systemEventStruct.ts ?? 0) >= TraceRow.rangeSelectObject!.startNS! && - (systemEventStruct.ts ?? 0) <= TraceRow.rangeSelectObject!.endNS! - ); - selection.hiSysEvents.push(...systemEvents); + selection.hiSysEvents.push(it.rowId!); } if (this.rangeTraceRow!.length !== rows.length) { let event = this.createPointEvent(it); @@ -1395,33 +1355,36 @@ export class SpSystemTrace extends BaseElement { subtree: false, }); - this.intersectionObserver = new IntersectionObserver((entries) => { - entries.forEach((it) => { - let tr = it.target as TraceRow; - tr.intersectionRatio = it.intersectionRatio; - if (!it.isIntersecting) { - tr.sleeping = true; - this.invisibleRows.indexOf(tr) == -1 && this.invisibleRows.push(tr); - this.visibleRows = this.visibleRows.filter((it) => !it.sleeping); - } else { - tr.sleeping = false; - this.visibleRows.indexOf(tr) == -1 && this.visibleRows.push(tr); - this.invisibleRows = this.invisibleRows.filter((it) => it.sleeping); - } - this.visibleRows - .filter((vr) => vr.expansion) - .forEach((vr) => { - vr.sticky = this.visibleRows.some((vro) => vr.childrenList.filter((it) => !it.collect).indexOf(vro) >= 0); - }); - this.visibleRows - .filter((vr) => !vr.folder && vr.parentRowEl && vr.parentRowEl.expansion) - .forEach((vr) => (vr.parentRowEl!.sticky = true)); - if (this.handler) { - clearTimeout(this.handler); - } - this.handler = setTimeout(() => this.refreshCanvas(false), 100); - }); - }); + this.intersectionObserver = new IntersectionObserver( + (entries) => { + entries.forEach((it) => { + let tr = it.target as TraceRow; + tr.intersectionRatio = it.intersectionRatio; + if (!it.isIntersecting) { + tr.sleeping = true; + this.invisibleRows.indexOf(tr) == -1 && this.invisibleRows.push(tr); + this.visibleRows = this.visibleRows.filter((it) => !it.sleeping); + } else { + tr.sleeping = false; + this.visibleRows.indexOf(tr) == -1 && this.visibleRows.push(tr); + this.invisibleRows = this.invisibleRows.filter((it) => it.sleeping); + } + this.visibleRows + .filter((vr) => vr.expansion) + .forEach((vr) => { + vr.sticky = this.visibleRows.some((vro) => vr.childrenList.filter((it) => !it.collect).indexOf(vro) >= 0); + }); + this.visibleRows + .filter((vr) => !vr.folder && vr.parentRowEl && vr.parentRowEl.expansion) + .forEach((vr) => (vr.parentRowEl!.sticky = true)); + if (this.handler) { + clearTimeout(this.handler); + } + this.handler = setTimeout(() => this.refreshCanvas(false), 100); + }); + }, + { threshold: [0, 0.01, 0.99, 1] } + ); window.addEventListener('keydown', (ev) => { if (ev.key.toLocaleLowerCase() === 'escape') { this.queryAllTraceRow().forEach((it) => { @@ -1480,7 +1443,7 @@ export class SpSystemTrace extends BaseElement { } // 清除上一次点击调用栈产生的三角旗子 - private clearTriangle(flagList: Array) { + private clearTriangle(flagList: Array): void { this.timerShaftEL!.sportRuler!.times = []; for (let i = 0; i < flagList.length; i++) { if (flagList[i].type === 'triangle') { @@ -1490,7 +1453,7 @@ export class SpSystemTrace extends BaseElement { } } - pushPidToSelection(selection: SelectionParam, id: string) { + pushPidToSelection(selection: SelectionParam, id: string): void { let pid = parseInt(id); if (!selection.processIds.includes(pid)) { selection.processIds.push(pid); @@ -1502,7 +1465,7 @@ export class SpSystemTrace extends BaseElement { } private createPointEvent(it: TraceRow) { - let event = this.eventMap[it.rowType + '']; + let event = this.eventMap[`${it.rowType}`]; if (event) { return event; } else { @@ -1552,11 +1515,11 @@ export class SpSystemTrace extends BaseElement { } } - refreshFavoriteCanvas() { + refreshFavoriteCanvas(): void { this.favoriteChartListEL!.refreshFavoriteCanvas(); } - expansionAllParentRow(currentRow: TraceRow) { + expansionAllParentRow(currentRow: TraceRow): void { let parentRow = this.rowsEL!.querySelector>( `trace-row[row-id='${currentRow.rowParentId}'][folder][scene]` ); @@ -1568,14 +1531,14 @@ export class SpSystemTrace extends BaseElement { } } - canvasPanelConfig() { + canvasPanelConfig(): void { this.canvasPanel!.style.left = `${this.timerShaftEL!.canvas!.offsetLeft!}px`; this.canvasPanel!.width = this.canvasPanel!.offsetWidth * dpr(); this.canvasPanel!.height = this.canvasPanel!.offsetHeight * dpr(); this.canvasPanelCtx!.scale(dpr(), dpr()); } - getScrollWidth() { + getScrollWidth(): number { let totalScrollDiv, scrollDiv, overflowDiv = document.createElement('div'); @@ -1617,7 +1580,7 @@ export class SpSystemTrace extends BaseElement { this.refreshCanvas(true, 'flagChange'); }; - timerShaftELRangeClick = (sliceTime: SlicesTime | undefined | null) => { + timerShaftELRangeClick = (sliceTime: SlicesTime | undefined | null): void => { if (sliceTime) { setTimeout(() => { if (TraceRow.rangeSelectObject) { @@ -1630,8 +1593,9 @@ export class SpSystemTrace extends BaseElement { } }; - timerShaftELRangeChange = (e: any) => { + timerShaftELRangeChange = (e: any): void => { TraceRow.range = e; + // window.queryFromWasm = true; if (TraceRow.rangeSelectObject) { TraceRow.rangeSelectObject!.startX = Math.floor( ns2x( @@ -1657,12 +1621,15 @@ export class SpSystemTrace extends BaseElement { it[0].x = ns2xByTimeShaft(it[0].ns, this.timerShaftEL!); it[1].x = ns2xByTimeShaft(it[1].ns, this.timerShaftEL!); }); + this.invisibleRows.forEach((it) => (it.needRefresh = true)); + this.visibleRows.forEach((it) => (it.needRefresh = true)); this.refreshCanvas(false, 'rangeChange'); + // window.queryFromWasm = false; }; tim: number = -1; top: number = 0; handler: any = undefined; - rowsElOnScroll = (e: any) => { + rowsElOnScroll = (e: any): void => { this.linkNodes.forEach((itln) => { if (itln[0].rowEL.collect) { itln[0].rowEL.translateY = itln[0].rowEL.getBoundingClientRect().top - 195; @@ -1690,7 +1657,7 @@ export class SpSystemTrace extends BaseElement { private scrollTimer: any; - favoriteRowsElOnScroll = (e: any) => { + favoriteRowsElOnScroll = (e: any): void => { this.rowsElOnScroll(e); }; @@ -1703,13 +1670,13 @@ export class SpSystemTrace extends BaseElement { } // refresh main canvas and favorite canvas - refreshCanvas(cache: boolean, from?: string) { - if (this.visibleRows.length == 0) { + refreshCanvas(cache: boolean, from?: string): void { + if (this.visibleRows.length === 0) { return; } //clear main canvas - this.canvasPanelCtx?.clearRect(0, 0, this.canvasPanel!.offsetWidth, this.canvasPanel!.offsetHeight); - this.favoriteChartListEL?.clearRect(); + this.canvasPanelCtx!.clearRect(0, 0, this.canvasPanel!.offsetWidth, this.canvasPanel!.offsetHeight); + this.favoriteChartListEL!.clearRect(); //draw lines for main canvas let rowsContentHeight = this.getRowsContentHeight(); let canvasHeight = @@ -1729,7 +1696,10 @@ export class SpSystemTrace extends BaseElement { } v.draw(cache); }); - //draw flag line segment for canvas + this.drawAllLines(); + } + drawAllLines(): void { + // draw flag line segment for canvas drawFlagLineSegment( this.canvasPanelCtx, this.hoverFlag, @@ -1793,7 +1763,7 @@ export class SpSystemTrace extends BaseElement { this.favoriteChartListEL?.drawLogsLineSegment(this.traceSheetEL!.systemLogFlag, this.timerShaftEL!); // Draw the connection curve - if (this.linkNodes) { + if (this.linkNodes && this.linkNodes.length > 0) { drawLinkLines( this.canvasPanelCtx!, this.linkNodes, @@ -1808,15 +1778,33 @@ export class SpSystemTrace extends BaseElement { this.favoriteChartListEL!.clientHeight ); } - drawVSync(this.canvasPanelCtx!, this.timerShaftEL?.canvas?.clientWidth || 0, canvasHeight); - this.favoriteChartListEL?.drawVSync( - this.timerShaftEL?.canvas?.clientWidth || 0, - this.favoriteChartListEL!.clientHeight - ); } - documentOnMouseDown = (ev: MouseEvent) => { - if (!this.loadTraceCompleted || !this.mouseEventEnable) return; + drawAllLine(row: TraceRow) { + let context: CanvasRenderingContext2D; + if (row.currentContext) { + context = row.currentContext; + } else { + context = row.collect ? this.canvasFavoritePanelCtx! : this.canvasPanelCtx!; + } + let startNS = TraceRow.range!.startNS; + let endNS = TraceRow.range!.endNS; + let totalNS = TraceRow.range!.totalNS; + drawFlagLineSegment(context, this.hoverFlag, this.selectFlag, row.frame, this.timerShaftEL!); + drawWakeUp(context, CpuStruct.wakeupBean, startNS, endNS, totalNS, row.frame); + for (let i = 0; i < SpSystemTrace.wakeupList.length; i++) { + if (i + 1 == SpSystemTrace.wakeupList.length) { + return; + } + drawWakeUpList(context, SpSystemTrace.wakeupList[i + 1], startNS, endNS, totalNS, row.frame); + } + drawLogsLineSegment(context, this.traceSheetEL?.systemLogFlag, row.frame, this.timerShaftEL!); + } + + documentOnMouseDown = (ev: MouseEvent): void => { + if (!this.loadTraceCompleted || !this.mouseEventEnable) { + return; + } if (this.isWASDKeyPress()) { ev.preventDefault(); ev.stopPropagation(); @@ -1833,7 +1821,9 @@ export class SpSystemTrace extends BaseElement { } TraceRow.isUserInteraction = true; - if (this.isMouseInSheet(ev)) return; + if (this.isMouseInSheet(ev)) { + return; + } this.observerScrollHeightEnable = false; if (ev.offsetX > this.timerShaftEL!.canvas!.offsetLeft) { let x = ev.offsetX - this.timerShaftEL!.canvas!.offsetLeft; @@ -1862,7 +1852,7 @@ export class SpSystemTrace extends BaseElement { } }; - onContextMenuHandler = (e: Event) => { + onContextMenuHandler = (e: Event): void => { setTimeout(() => { for (let key of this.keyPressMap.keys()) { if (this.keyPressMap.get(key)) { @@ -1873,9 +1863,13 @@ export class SpSystemTrace extends BaseElement { }, 100); }; - documentOnMouseUp = (ev: MouseEvent) => { - if ((window as any).collectResize) return; - if (!this.loadTraceCompleted || !this.mouseEventEnable) return; + documentOnMouseUp = (ev: MouseEvent): void => { + if ((window as any).collectResize) { + return; + } + if (!this.loadTraceCompleted || !this.mouseEventEnable) { + return; + } if (this.isWASDKeyPress()) { ev.preventDefault(); ev.stopPropagation(); @@ -1891,8 +1885,12 @@ export class SpSystemTrace extends BaseElement { } TraceRow.isUserInteraction = false; this.rangeSelect.isMouseDown = false; - if ((window as any).isSheetMove) return; - if (this.isMouseInSheet(ev)) return; + if ((window as any).isSheetMove) { + return; + } + if (this.isMouseInSheet(ev)) { + return; + } if (ev.offsetX > this.timerShaftEL!.canvas!.offsetLeft) { let x = ev.offsetX - this.timerShaftEL!.canvas!.offsetLeft; let y = ev.offsetY; @@ -1930,10 +1928,14 @@ export class SpSystemTrace extends BaseElement { } documentOnMouseOut = (ev: MouseEvent) => { - if (!this.loadTraceCompleted) return; + if (!this.loadTraceCompleted) { + return; + } TraceRow.isUserInteraction = false; this.isMouseLeftDown = false; - if (this.isMouseInSheet(ev)) return; + if (this.isMouseInSheet(ev)) { + return; + } if (ev.offsetX > this.timerShaftEL!.canvas!.offsetLeft) { this.rangeSelect.mouseOut(ev); this.timerShaftEL?.documentOnMouseOut(ev); @@ -1948,14 +1950,16 @@ export class SpSystemTrace extends BaseElement { ['f', false], ]); - documentOnKeyDown = (ev: KeyboardEvent) => { + documentOnKeyDown = (ev: KeyboardEvent): void => { document.removeEventListener('keyup', this.documentOnKeyUp); this.debounce(this.continueSearch, 250, ev)(); document.addEventListener('keyup', this.documentOnKeyUp); }; - documentOnKeyPress = (ev: KeyboardEvent) => { - if (!this.loadTraceCompleted) return; + documentOnKeyPress = (ev: KeyboardEvent): void => { + if (!this.loadTraceCompleted) { + return; + } let keyPress = ev.key.toLocaleLowerCase(); TraceRow.isUserInteraction = true; if (this.isMousePointInSheet) { @@ -1963,7 +1967,7 @@ export class SpSystemTrace extends BaseElement { } this.observerScrollHeightEnable = false; if (this.keyboardEnable) { - if (keyPress == 'm') { + if (keyPress === 'm') { this.slicestime = this.setSLiceMark(ev.shiftKey); if (this.slicestime) { if (TraceRow.rangeSelectObject) { @@ -1986,18 +1990,21 @@ export class SpSystemTrace extends BaseElement { this.hoverFlag = null; } this.timerShaftEL!.documentOnKeyPress(ev, this.currentSlicesTime); + if (keyPress === 'f') { + this.verticalScrollToRow(); + } } else { this.stopWASD(); } }; - verticalScrollToRow() { + verticalScrollToRow(): void { if (this.currentRow) { this.currentRow.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); } } - setCurrentSlicesTime() { + setCurrentSlicesTime(): void { if (CpuStruct.selectCpuStruct) { if (CpuStruct.selectCpuStruct.startTime && CpuStruct.selectCpuStruct.dur) { this.currentSlicesTime.startTime = CpuStruct.selectCpuStruct.startTime; @@ -2102,8 +2109,8 @@ export class SpSystemTrace extends BaseElement { return this.slicestime; } - stopWASD = () => { - setTimeout(() => { + stopWASD = (): void => { + setTimeout((): void => { for (let key of this.keyPressMap.keys()) { if (this.keyPressMap.get(key)) { this.timerShaftEL?.stopWASD({ key: key }); @@ -2118,15 +2125,15 @@ export class SpSystemTrace extends BaseElement { if (ev.key === 'Enter') { if (ev.shiftKey) { this.dispatchEvent( - new CustomEvent('previous-data', { - detail: {}, + new CustomEvent('trace-previous-data', { + detail: { down: true }, composed: false, }) ); } else { this.dispatchEvent( - new CustomEvent('next-data', { - detail: {}, + new CustomEvent('trace-next-data', { + detail: { down: true }, composed: false, }) ); @@ -2134,13 +2141,12 @@ export class SpSystemTrace extends BaseElement { } }; - documentOnKeyUp = (ev: KeyboardEvent) => { + documentOnKeyUp = (ev: KeyboardEvent): void => { if (this.times.size > 0) { for (let timerId of this.times) { clearTimeout(timerId); } } - if (ev.key.toLocaleLowerCase() === '?') { document .querySelector('body > sp-application')! @@ -2159,14 +2165,14 @@ export class SpSystemTrace extends BaseElement { document.removeEventListener('keydown', this.documentOnKeyDown); if (ev.shiftKey) { this.dispatchEvent( - new CustomEvent('previous-data', { + new CustomEvent('trace-previous-data', { detail: {}, composed: false, }) ); } else { this.dispatchEvent( - new CustomEvent('next-data', { + new CustomEvent('trace-next-data', { detail: {}, composed: false, }) @@ -2196,7 +2202,7 @@ export class SpSystemTrace extends BaseElement { * @param type 标记类型(卡尺和旗子) * @param direction 跳转方向(前一个/后一个) */ - MarkJump(list: Array, type: string, direction: string) { + MarkJump(list: Array, type: string, direction: string): void { this.traceSheetEL = this.shadowRoot?.querySelector('.trace-sheet'); let find = list.find((it) => it.selected); if (!find) { @@ -2262,11 +2268,11 @@ export class SpSystemTrace extends BaseElement { return this.isMousePointInSheet; }; - favoriteChangeHandler = (row: TraceRow) => { + favoriteChangeHandler = (row: TraceRow): void => { info('favoriteChangeHandler', row.frame, row.offsetTop, row.offsetHeight); }; - verticalScrollHandler = (row: TraceRow) => { + verticalScrollHandler = (row: TraceRow): void => { row.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); }; @@ -2345,8 +2351,10 @@ export class SpSystemTrace extends BaseElement { this.rangeSelect.selectHandler?.(this.rangeSelect.rangeTraceRow, false); }; inFavoriteArea: boolean | undefined; - documentOnMouseMove = (ev: MouseEvent) => { - if (!this.loadTraceCompleted || (window as any).flagInputFocus || !this.mouseEventEnable) return; + documentOnMouseMove = (ev: MouseEvent): void => { + if (!this.loadTraceCompleted || (window as any).flagInputFocus || !this.mouseEventEnable) { + return; + } if ((window as any).collectResize) { this.style.cursor = 'row-resize'; this.cancelDrag(); @@ -2357,7 +2365,7 @@ export class SpSystemTrace extends BaseElement { ev.preventDefault(); return; } - if (ev.ctrlKey && ev.button == 0 && this.isMouseLeftDown) { + if (ev.ctrlKey && ev.button === 0 && this.isMouseLeftDown) { this.translateByMouseMove(ev); } this.inFavoriteArea = this.favoriteChartListEL?.containPoint(ev); @@ -2454,7 +2462,7 @@ export class SpSystemTrace extends BaseElement { this.tipEL!.style.display = 'none'; } - selectStructNull() { + selectStructNull(): void { CpuStruct.selectCpuStruct = undefined; CpuStruct.wakeupBean = null; CpuFreqStruct.selectCpuFreqStruct = undefined; @@ -2485,15 +2493,21 @@ export class SpSystemTrace extends BaseElement { } documentOnClick = (ev: MouseEvent) => { - if (!this.loadTraceCompleted) return; + if (!this.loadTraceCompleted) { + return; + } if (this.isWASDKeyPress()) { this.hoverFlag = null; ev.preventDefault(); ev.stopPropagation(); return; } - if ((window as any).isSheetMove) return; - if (this.isMouseInSheet(ev)) return; + if ((window as any).isSheetMove) { + return; + } + if (this.isMouseInSheet(ev)) { + return; + } if ((window as any).isPackUpTable) { (window as any).isPackUpTable = false; return; @@ -2514,7 +2528,7 @@ export class SpSystemTrace extends BaseElement { ) { } else { let inFavoriteArea = this.favoriteChartListEL?.containPoint(ev); - let rows = this.visibleRows.filter((it) => it.focusContain(ev, inFavoriteArea!) && it.collect == inFavoriteArea); + let rows = this.visibleRows.filter((it) => it.focusContain(ev, inFavoriteArea!) && it.collect === inFavoriteArea); if (JankStruct.delJankLineFlag) { this.removeLinkLinesByBusinessType('janks'); } @@ -2551,34 +2565,37 @@ export class SpSystemTrace extends BaseElement { //泳道图点击判定条件 private traceRowClickJudgmentConditions: Map boolean> = new Map boolean>([ - [TraceRow.ROW_TYPE_CPU, () => CpuStruct.hoverCpuStruct !== null && CpuStruct.hoverCpuStruct !== undefined], + [TraceRow.ROW_TYPE_CPU, (): boolean => CpuStruct.hoverCpuStruct !== null && CpuStruct.hoverCpuStruct !== undefined], [ TraceRow.ROW_TYPE_THREAD, - () => ThreadStruct.hoverThreadStruct !== null && ThreadStruct.hoverThreadStruct !== undefined, + (): boolean => ThreadStruct.hoverThreadStruct !== null && ThreadStruct.hoverThreadStruct !== undefined, + ], + [ + TraceRow.ROW_TYPE_FUNC, + (): boolean => FuncStruct.hoverFuncStruct !== null && FuncStruct.hoverFuncStruct !== undefined, ], - [TraceRow.ROW_TYPE_FUNC, () => FuncStruct.hoverFuncStruct !== null && FuncStruct.hoverFuncStruct !== undefined], [ TraceRow.ROW_TYPE_CPU_FREQ, - () => CpuFreqStruct.hoverCpuFreqStruct !== null && CpuFreqStruct.hoverCpuFreqStruct !== undefined, + (): boolean => CpuFreqStruct.hoverCpuFreqStruct !== null && CpuFreqStruct.hoverCpuFreqStruct !== undefined, ], [ TraceRow.ROW_TYPE_CPU_STATE, - () => CpuStateStruct.hoverStateStruct !== null && CpuStateStruct.hoverStateStruct !== undefined, + (): boolean => CpuStateStruct.hoverStateStruct !== null && CpuStateStruct.hoverStateStruct !== undefined, ], [ TraceRow.ROW_TYPE_CPU_FREQ_LIMIT, - () => + (): boolean => CpuFreqLimitsStruct.selectCpuFreqLimitsStruct !== null && CpuFreqLimitsStruct.selectCpuFreqLimitsStruct !== undefined, ], [ TraceRow.ROW_TYPE_CLOCK, - () => ClockStruct.hoverClockStruct !== null && ClockStruct.hoverClockStruct !== undefined, + (): boolean => ClockStruct.hoverClockStruct !== null && ClockStruct.hoverClockStruct !== undefined, ], - [TraceRow.ROW_TYPE_IRQ, () => IrqStruct.hoverIrqStruct !== null && IrqStruct.hoverIrqStruct !== undefined], + [TraceRow.ROW_TYPE_IRQ, (): boolean => IrqStruct.hoverIrqStruct !== null && IrqStruct.hoverIrqStruct !== undefined], [ TraceRow.ROW_TYPE_APP_STARTUP, - () => AppStartupStruct.hoverStartupStruct !== null && AppStartupStruct.hoverStartupStruct !== undefined, + (): boolean => AppStartupStruct.hoverStartupStruct !== null && AppStartupStruct.hoverStartupStruct !== undefined, ], [ TraceRow.ROW_TYPE_ALL_APPSTARTUPS, @@ -2589,69 +2606,70 @@ export class SpSystemTrace extends BaseElement { [TraceRow.ROW_TYPE_HEAP, () => HeapStruct.hoverHeapStruct !== null && HeapStruct.hoverHeapStruct !== undefined], [ TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_HEAP_SNAPSHOT, - () => HeapSnapshotStruct.hoverSnapshotStruct !== null && HeapSnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => + HeapSnapshotStruct.hoverSnapshotStruct !== null && HeapSnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_FRAME_ANIMATION, - () => + (): boolean => FrameAnimationStruct.hoverFrameAnimationStruct !== null && FrameAnimationStruct.hoverFrameAnimationStruct !== undefined, ], [ TraceRow.ROW_TYPE_FRAME_DYNAMIC, - () => + (): boolean => FrameDynamicStruct.hoverFrameDynamicStruct !== null && FrameDynamicStruct.hoverFrameDynamicStruct !== undefined, ], [ TraceRow.ROW_TYPE_FRAME_SPACING, - () => + (): boolean => FrameSpacingStruct.hoverFrameSpacingStruct !== null && FrameSpacingStruct.hoverFrameSpacingStruct !== undefined, ], [ TraceRow.ROW_TYPE_JS_CPU_PROFILER, - () => + (): boolean => JsCpuProfilerStruct.hoverJsCpuProfilerStruct !== null && JsCpuProfilerStruct.hoverJsCpuProfilerStruct !== undefined, ], [ TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_PURGEABLE_PIN_VM, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_DMA_ABILITY, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_DMA_VMTRACKER, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER, - () => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, + (): boolean => SnapshotStruct.hoverSnapshotStruct !== null && SnapshotStruct.hoverSnapshotStruct !== undefined, ], [ TraceRow.ROW_TYPE_GPU_RESOURCE_VMTRACKER, @@ -2717,8 +2735,6 @@ export class SpSystemTrace extends BaseElement { clearTimeout(timeoutJudge); }, 10); let threadClickHandler: any; - let threadClickPreviousHandler: any; - let threadClickNextHandler: any; let cpuClickHandler: any; let jankClickHandler: any; let snapshotClickHandler: any; @@ -2730,7 +2746,22 @@ export class SpSystemTrace extends BaseElement { `trace-row[row-id='${d.cpu}'][row-type='cpu-data']`, (row) => row.rowId === `${d.cpu}` && row.rowType === 'cpu-data' )[0]; - let findEntry = cpuRow!.dataList!.find((dat: any) => dat.startTime === d.startTime); + cpuRow.fixedList = [ + { + startTime: d.startTime, + dur: d.dur, + tid: d.tid, + id: d.id, + processId: d.pid, + cpu: d.cpu, + argSetID: d.argSetID, + }, + ]; + let findEntry = cpuRow!.fixedList[0]; + this.rechargeCpuData( + findEntry, + cpuRow.dataListCache.find((it) => it.startTime > findEntry.startTime) + ); if ( findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || findEntry!.startTime! > TraceRow.range!.endNS @@ -2756,51 +2787,6 @@ export class SpSystemTrace extends BaseElement { cpuClickHandler ); }; - - threadClickPreviousHandler = (d: ThreadStruct) => { - this.observerScrollHeightEnable = false; - let threadRow = this.shadowRoot?.querySelector>( - `trace-row[row-id='${d.tid}'][row-type='thread']` - ); - threadRow?.dataList.forEach((item, index) => { - if (item === d && index !== 0) { - let findEntry = threadRow?.dataList[index - 1]; - this.hoverStructNull(); - this.selectStructNull(); - this.wakeupListNull(); - ThreadStruct.hoverThreadStruct = findEntry; - ThreadStruct.selectThreadStruct = findEntry; - this.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, 'inverted'); - this.traceSheetEL?.displayThreadData( - ThreadStruct.selectThreadStruct!, - threadClickHandler, - cpuClickHandler, - threadClickPreviousHandler, - threadClickNextHandler - ); - } - }); - }; - threadClickNextHandler = (d: ThreadStruct) => { - this.observerScrollHeightEnable = false; - let threadRow = this.shadowRoot?.querySelector>( - `trace-row[row-id='${d.tid}'][row-type='thread']` - ); - let findEntry = threadRow?.dataList.find((dat: any) => dat.startTime === d.startTime! + d.dur!); - this.hoverStructNull(); - this.selectStructNull(); - this.wakeupListNull(); - ThreadStruct.hoverThreadStruct = findEntry; - ThreadStruct.selectThreadStruct = findEntry; - this.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, 'inverted'); - this.traceSheetEL?.displayThreadData( - ThreadStruct.selectThreadStruct!, - threadClickHandler, - cpuClickHandler, - threadClickPreviousHandler, - threadClickNextHandler - ); - }; cpuClickHandler = (d: CpuStruct) => { let traceRow = this.shadowRoot?.querySelector>( `trace-row[row-id='${d.processId}'][row-type='process']` @@ -2815,19 +2801,7 @@ export class SpSystemTrace extends BaseElement { )[0]; let task = () => { if (threadRow) { - let findEntry = threadRow!.dataList!.find((dat) => dat.startTime === d.startTime && dat.dur! > 0); - if (!findEntry) { - findEntry = { - processName: d.processName, - threadName: d.name, - startTime: d.startTime, - state: 'Running', - dur: 0, - pid: d.processId, - tid: d.tid, - cpu: d.cpu, - } as ThreadStruct; - } + let findEntry = threadRow!.fixedList[0]; if ( findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || findEntry!.startTime! > TraceRow.range!.endNS @@ -2847,8 +2821,6 @@ export class SpSystemTrace extends BaseElement { ThreadStruct.selectThreadStruct!, threadClickHandler, cpuClickHandler, - threadClickPreviousHandler, - threadClickNextHandler, (datas) => { this.removeLinkLinesByBusinessType('thread'); datas.forEach((data) => { @@ -2863,11 +2835,24 @@ export class SpSystemTrace extends BaseElement { } }; if (threadRow) { - this.scrollToProcess(`${d.tid}`, `${d.processId}`, 'process', false); - this.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true); + threadRow.fixedList = [ + { + startTime: d.startTime, + dur: d.dur, + cpu: d.cpu, + id: d.id, + tid: d.tid, + state: d.state, + pid: d.processId, + argSetID: d.argSetID, + }, + ]; + if (threadRow!.isComplete) { task(); } else { + this.scrollToProcess(`${d.tid}`, `${d.processId}`, 'process', false); + this.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true); threadRow!.onComplete = task; } } @@ -2881,7 +2866,7 @@ export class SpSystemTrace extends BaseElement { } else { jankRowParent = this.shadowRoot?.querySelector>(`trace-row[row-id='${d.pid}']`); } - // jankRowParent!.expansion = true; + jankRowParent!.expansion = true; let jankRow: any; jankRowParent.childrenList.forEach((item: TraceRow) => { if (item.rowId === `${d.rowId}` && item.rowType === 'janks') { @@ -2891,7 +2876,7 @@ export class SpSystemTrace extends BaseElement { let task = () => { if (jankRow) { JankStruct.selectJankStructList.length = 0; - let findJankEntry = jankRow!.dataList!.find((dat: any) => dat.name == d.name && dat.pid == d.pid); + let findJankEntry = jankRow!.dataListCache!.find((dat: any) => dat.name == d.name && dat.pid == d.pid); if (findJankEntry) { if ( findJankEntry!.ts! + findJankEntry!.dur! < TraceRow.range!.startNS || @@ -2926,15 +2911,12 @@ export class SpSystemTrace extends BaseElement { this.scrollToProcess(jankRow.rowId!, jankRow.rowParentId!, jankRow.rowType!, true); } }; - if (jankRow) { - this.scrollToProcess(jankRow.rowId!, jankRow.rowParentId!, jankRow.rowType!, false); - } task(); }; scrollToFuncHandler = (funcStract: any) => { this.observerScrollHeightEnable = true; - this.moveRangeToCenter(funcStract.startTime!, funcStract.dur!); + this.moveRangeToCenter(funcStract.startTs!, funcStract.dur!); this.scrollToActFunc(funcStract, false); }; @@ -2945,7 +2927,7 @@ export class SpSystemTrace extends BaseElement { ); let task = () => { if (snapshotRow) { - let findEntry = snapshotRow!.dataList!.find((dat) => dat.startTs === d.startTs); + let findEntry = snapshotRow!.dataListCache!.find((dat) => dat.startTs === d.startTs); this.hoverStructNull(); this.selectStructNull(); this.wakeupListNull(); @@ -2977,13 +2959,7 @@ export class SpSystemTrace extends BaseElement { this.removeLinkLinesByBusinessType('thread'); ThreadStruct.selectThreadStruct = ThreadStruct.hoverThreadStruct; this.timerShaftEL?.drawTriangle(ThreadStruct.selectThreadStruct!.startTime || 0, 'inverted'); - this.traceSheetEL?.displayThreadData( - ThreadStruct.selectThreadStruct, - threadClickHandler, - cpuClickHandler, - threadClickPreviousHandler, - threadClickNextHandler - ); + this.traceSheetEL?.displayThreadData(ThreadStruct.selectThreadStruct, threadClickHandler, cpuClickHandler); this.timerShaftEL?.modifyFlagList(undefined); } else if (clickRowType === TraceRow.ROW_TYPE_FUNC && FuncStruct.hoverFuncStruct) { TabPaneTaskFrames.TaskArray = []; @@ -3028,7 +3004,7 @@ export class SpSystemTrace extends BaseElement { this.traceSheetEL?.displayGpuSelectedData( 'total', SnapshotStruct.selectSnapshotStruct.startNs, - gpuDumpTotalRow!.dataList + gpuDumpTotalRow!.dataListCache ); this.timerShaftEL?.modifyFlagList(undefined); } else if (clickRowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW && SnapshotStruct.hoverSnapshotStruct) { @@ -3039,7 +3015,7 @@ export class SpSystemTrace extends BaseElement { this.traceSheetEL?.displayGpuSelectedData( 'window', SnapshotStruct.selectSnapshotStruct.startNs, - gpuDumpWindowRow!.dataList + gpuDumpWindowRow!.dataListCache ); this.timerShaftEL?.modifyFlagList(undefined); } else if (clickRowType === TraceRow.ROW_TYPE_IRQ && IrqStruct.hoverIrqStruct) { @@ -3089,7 +3065,7 @@ export class SpSystemTrace extends BaseElement { HeapSnapshotStruct.selectSnapshotStruct = HeapSnapshotStruct.hoverSnapshotStruct; this.traceSheetEL?.displaySnapshotData( HeapSnapshotStruct.selectSnapshotStruct!, - snapshotRow!.dataList, + snapshotRow!.dataListCache, snapshotClickHandler ); } else if (clickRowType === TraceRow.ROW_TYPE_JS_CPU_PROFILER && JsCpuProfilerStruct.hoverJsCpuProfilerStruct) { @@ -3099,6 +3075,7 @@ export class SpSystemTrace extends BaseElement { let parentIdArr: Array = []; let that = this; getTopJsCpuProfilerStruct(selectStruct.parentId); + function getTopJsCpuProfilerStruct(parentId: number) { if (parentId === -1 && selectStruct.parentId === -1) { // 点击的函数是第一层,直接设置其children的isSelect为true,不用重新算totalTime @@ -3131,6 +3108,9 @@ export class SpSystemTrace extends BaseElement { function getSelectStruct(data: JsCpuProfilerChartFrame) { for (let child of data.children) { + if (child === null) { + continue; + } if (child.id === selectStruct!.id) { // 将点击的函数的children的isSelect改为true setSelectChildrenState(child); @@ -3149,10 +3129,14 @@ export class SpSystemTrace extends BaseElement { data.isSelect = true; if (data.children.length > 0) { for (let child of data.children) { + if (child === null) { + continue; + } setSelectChildrenState(child); } } } + that.traceSheetEL?.displayJsProfilerData(dataArr); } else if (clickRowType === TraceRow.ROW_TYPE_APP_STARTUP && AppStartupStruct.hoverStartupStruct) { AppStartupStruct.selectStartupStruct = AppStartupStruct.hoverStartupStruct; @@ -3181,43 +3165,46 @@ export class SpSystemTrace extends BaseElement { } else if (clickRowType === TraceRow.ROW_TYPE_VM_TRACKER_SMAPS && SnapshotStruct.hoverSnapshotStruct) { let smapsRow = this.shadowRoot?.querySelector>(`trace-row[row-id='Dirty']`); SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - this.traceSheetEL?.displaySmapsData(SnapshotStruct.selectSnapshotStruct!, smapsRow!.dataList); + this.traceSheetEL?.displaySmapsData(SnapshotStruct.selectSnapshotStruct!, smapsRow!.dataListCache); } else if (clickRowType === TraceRow.ROW_TYPE_VMTRACKER_SHM && SnapshotStruct.hoverSnapshotStruct) { let shmRow = this.shadowRoot?.querySelector>(`trace-row[row-id='SHM']`); SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - this.traceSheetEL?.displayShmData(SnapshotStruct.selectSnapshotStruct!, shmRow!.dataList); + this.traceSheetEL?.displayShmData(SnapshotStruct.selectSnapshotStruct!, shmRow!.dataListCache); } else if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY && SnapshotStruct.hoverSnapshotStruct) { let totalAbilityRow = this.shadowRoot?.querySelector>( `trace-row[row-id='System Purgeable Total']` ); SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - this.traceSheetEL?.displayPurgTotalAbilityData(SnapshotStruct.hoverSnapshotStruct, totalAbilityRow!.dataList); + this.traceSheetEL?.displayPurgTotalAbilityData( + SnapshotStruct.hoverSnapshotStruct, + totalAbilityRow!.dataListCache + ); } else if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY && SnapshotStruct.hoverSnapshotStruct) { let pinAbilityRow = this.shadowRoot?.querySelector>( `trace-row[row-id='System Purgeable Pin']` ); SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - this.traceSheetEL?.displayPurgPinAbilityData(SnapshotStruct.hoverSnapshotStruct, pinAbilityRow!.dataList); + this.traceSheetEL?.displayPurgPinAbilityData(SnapshotStruct.hoverSnapshotStruct, pinAbilityRow!.dataListCache); } else if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM && SnapshotStruct.hoverSnapshotStruct) { let totalVMRow = this.shadowRoot?.querySelector>(`trace-row[row-id='Purgeable Total']`); SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - this.traceSheetEL?.displayPurgTotalVMData(SnapshotStruct.hoverSnapshotStruct, totalVMRow!.dataList); + this.traceSheetEL?.displayPurgTotalVMData(SnapshotStruct.hoverSnapshotStruct, totalVMRow!.dataListCache); } else if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_VM && SnapshotStruct.hoverSnapshotStruct) { let pinVMRow = this.shadowRoot?.querySelector>(`trace-row[row-id='Purgeable Pin']`); SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - this.traceSheetEL?.displayPurgPinVMData(SnapshotStruct.hoverSnapshotStruct, pinVMRow!.dataList); + this.traceSheetEL?.displayPurgPinVMData(SnapshotStruct.hoverSnapshotStruct, pinVMRow!.dataListCache); } else if (clickRowType === TraceRow.ROW_TYPE_DMA_ABILITY && SnapshotStruct.hoverSnapshotStruct) { let dmaAbilityRow = this.shadowRoot?.querySelector>( `trace-row[row-id='abilityMonitorDma']` ); SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - this.traceSheetEL?.displayDmaAbility(SnapshotStruct.selectSnapshotStruct.startNs, dmaAbilityRow!.dataList); + this.traceSheetEL?.displayDmaAbility(SnapshotStruct.selectSnapshotStruct.startNs, dmaAbilityRow!.dataListCache); } else if (clickRowType === TraceRow.ROW_TYPE_DMA_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { let dmaVmTracker = this.shadowRoot?.querySelector>( `trace-row[row-type='dma-vmTracker']` ); SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - this.traceSheetEL?.displayDmaVmTracker(SnapshotStruct.selectSnapshotStruct.startNs, dmaVmTracker!.dataList); + this.traceSheetEL?.displayDmaVmTracker(SnapshotStruct.selectSnapshotStruct.startNs, dmaVmTracker!.dataListCache); } else if (clickRowType === TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY && SnapshotStruct.hoverSnapshotStruct) { let gpuMemoryAbilityMonitor = this.shadowRoot?.querySelector>( `trace-row[row-id='abilityMonitorGpuMemory']` @@ -3225,7 +3212,7 @@ export class SpSystemTrace extends BaseElement { SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; this.traceSheetEL?.displayGpuMemoryAbility( SnapshotStruct.selectSnapshotStruct.startNs, - gpuMemoryAbilityMonitor!.dataList + gpuMemoryAbilityMonitor!.dataListCache ); } else if (clickRowType === TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { let gpuMemoryVmTracker = this.shadowRoot?.querySelector>( @@ -3234,7 +3221,7 @@ export class SpSystemTrace extends BaseElement { SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; this.traceSheetEL?.displayGpuMemoryVmTracker( SnapshotStruct.selectSnapshotStruct.startNs, - gpuMemoryVmTracker!.dataList + gpuMemoryVmTracker!.dataListCache ); } else if (clickRowType === TraceRow.ROW_TYPE_GPU_RESOURCE_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; @@ -3312,61 +3299,68 @@ export class SpSystemTrace extends BaseElement { } } } - selectRow!.dataList.forEach((value) => { - // allocation to execute - if (value.id === res[0].allocation_task_row) { - TabPaneTaskFrames.TaskArray.push(value); - this.addPointPair( - this.makePoint( - value.startTs!, - 0, - selectRow?.translateY!, - selectRow, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ), - this.makePoint( - FuncStruct.selectFuncStruct!.startTs!, - 0, - row?.translateY!, - row, - (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ) - ); - } - // execute to return - if (value.id === res[0].return_task_row) { + let idList: number[] = []; + if (res[0].allocation_task_row) { + idList.push(res[0].allocation_task_row); + } + if (res[0].return_task_row) { + idList.push(res[0].return_task_row); + } + queryTaskPoolOtherRelationData(idList, allocationRowId).then((relationDataList) => { + selectRow!.fixedList = relationDataList; + selectRow!.fixedList.forEach((value) => { TabPaneTaskFrames.TaskArray.push(value); - this.addPointPair( - this.makePoint( - FuncStruct.selectFuncStruct!.startTs!, - FuncStruct.selectFuncStruct!.dur!, - row?.translateY!, - row, - (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ), - this.makePoint( - value.startTs!, - value.dur!, - selectRow?.translateY!, - selectRow, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ) - ); - } + // allocation to execute + if (value.id === res[0].allocation_task_row) { + this.addPointPair( + this.makePoint( + value.startTs!, + 0, + selectRow?.translateY!, + selectRow, + (value.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, + true + ), + this.makePoint( + FuncStruct.selectFuncStruct!.startTs!, + 0, + row?.translateY!, + row, + (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, + true + ) + ); + } else { + this.addPointPair( + this.makePoint( + FuncStruct.selectFuncStruct!.startTs!, + FuncStruct.selectFuncStruct!.dur!, + row?.translateY!, + row, + (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, + false + ), + this.makePoint( + value.startTs!, + value.dur!, + selectRow?.translateY!, + selectRow, + (value.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, + false + ) + ); + } + }); + this.refreshCanvas(true); }); - this.refreshCanvas(true); } }); } else { @@ -3376,130 +3370,142 @@ export class SpSystemTrace extends BaseElement { let executeRow = this.shadowRoot?.querySelector>( `trace-row[row-id='${res[0].tid}'][row-type='func']` ); - let endStruct: FuncStruct; - row!.dataList.forEach((value) => { - if (value.id === res[0].return_task_row) { - TabPaneTaskFrames.TaskArray.push(value); - endStruct = value; - } - }); if (!executeRow) { return; } - executeRow!.dataList.forEach((value) => { - if (value.id === res[0].execute_task_row) { + let idList: number[] = []; + let tidList: number[] = []; + if (res[0].execute_task_row) { + idList.push(res[0].execute_task_row); + tidList.push(Number(res[0].tid)); + } + if (res[0].return_task_row) { + idList.push(res[0].return_task_row); + tidList.push(Number(row.rowId)); + } + queryTaskPoolRelationData(idList, tidList).then((relationDataList) => { + let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; + relationDataList.forEach((value) => { TabPaneTaskFrames.TaskArray.push(value); - this.addPointPair( - this.makePoint( - FuncStruct.selectFuncStruct!.startTs!, - 0, - row?.translateY!, - row, - (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ), - this.makePoint( - value.startTs!, - 0, - executeRow?.translateY!, - executeRow, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ) - ); - if (endStruct) { + if (value.id === res[0].execute_task_row) { this.addPointPair( + this.makePoint( + FuncStruct.selectFuncStruct!.startTs!, + 0, + row?.translateY!, + row, + (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, + true + ), this.makePoint( value.startTs!, - value.dur!, + 0, executeRow?.translateY!, executeRow, (value.depth! + 0.5) * 20, 'task', LineType.bezierCurve, + true + ) + ); + } else { + this.addPointPair( + this.makePoint( + executeStruct.startTs!, + executeStruct.dur!, + executeRow?.translateY!, + executeRow, + (executeStruct.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, false ), this.makePoint( - endStruct.startTs!, - endStruct.dur!, + value.startTs!, + value.dur!, row?.translateY!, row, - (endStruct.depth! + 0.5) * 20, + (value.depth! + 0.5) * 20, 'task', LineType.bezierCurve, false ) ); } - } + }); }); } else if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task PerformTask End:') >= 0) { let executeRow = this.shadowRoot?.querySelector>( `trace-row[row-id='${res[0].tid}'][row-type='func']` ); TabPaneTaskFrames.TaskArray.push(FuncStruct.selectFuncStruct!); - let startStruct: FuncStruct; - row!.dataList.forEach((value) => { - if (value.id === res[0].allocation_task_row) { - TabPaneTaskFrames.TaskArray.push(value); - startStruct = value; - } - }); - executeRow!.dataList.forEach((value) => { - if (value.id === res[0].execute_task_row) { + let idList: number[] = []; + let tidList: number[] = []; + if (res[0].execute_task_row) { + idList.push(res[0].execute_task_row); + tidList.push(Number(res[0].tid)); + } + if (res[0].allocation_task_row) { + idList.push(res[0].allocation_task_row); + tidList.push(Number(row.rowId)); + } + queryTaskPoolRelationData(idList, tidList).then((relationDataList) => { + let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; + relationDataList.forEach((value) => { TabPaneTaskFrames.TaskArray.push(value); - this.addPointPair( - this.makePoint( - startStruct!.startTs!, - 0, - row?.translateY!, - row, - (startStruct!.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ), - this.makePoint( - value.startTs!, - 0, - executeRow?.translateY!, - executeRow, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ) - ); - this.addPointPair( - this.makePoint( - value.startTs!, - value.dur!, - executeRow?.translateY!, - executeRow, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ), - this.makePoint( - FuncStruct.selectFuncStruct!.startTs!, - FuncStruct.selectFuncStruct!.dur!, - row?.translateY!, - row, - (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ) - ); - } + if (value.id === res[0].execute_task_row) { + this.addPointPair( + this.makePoint( + FuncStruct.selectFuncStruct!.startTs!, + FuncStruct.selectFuncStruct!.dur!, + row?.translateY!, + row, + (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, + false + ), + this.makePoint( + value.startTs!, + value.dur!, + executeRow?.translateY!, + executeRow, + (value.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, + false + ) + ); + } else { + this.addPointPair( + this.makePoint( + executeStruct.startTs!, + 0, + executeRow?.translateY!, + executeRow, + (executeStruct.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, + true + ), + this.makePoint( + value.startTs!, + 0, + row?.translateY!, + row, + (value.depth! + 0.5) * 20, + 'task', + LineType.bezierCurve, + true + ) + ); + } + }); + this.refreshCanvas(true); }); } - this.refreshCanvas(true); }); } } @@ -3529,6 +3535,7 @@ export class SpSystemTrace extends BaseElement { } } } + function collectionHasJank(jankRow: any): boolean { for (let item of collectList!) { if (item.rowId === jankRow.rowId && item.rowType === jankRow.rowType) { @@ -3537,8 +3544,8 @@ export class SpSystemTrace extends BaseElement { } return true; } - if (endParentRow) { + endParentRow.expansion = true; //终点的父泳道过滤出选中的Struct let endRowStruct: any; //泳道展开的情况,查找endRowStruct @@ -3572,14 +3579,16 @@ export class SpSystemTrace extends BaseElement { } } else { endParentRow.childrenList.forEach((item: TraceRow) => { - if (item.rowId === `${data.type}-${data.pid}` && item.rowType === 'janks') { + if (item.name.startsWith('Actual Timeline') && item.rowType === 'janks') { endRowStruct = item; } }); } } - if (endRowStruct) { - let findJankEntry = endRowStruct!.dataList!.find((dat: any) => dat.name == data.name && dat.pid == data.pid); + let addPointLink = () => { + let findJankEntry = endRowStruct!.dataListCache!.find( + (dat: any) => dat.name == data.name && dat.pid == data.pid + ); //连线规则:frametimeline的头----app的头,app的尾----renderservice的头 let tts: number = 0; if (findJankEntry) { @@ -3694,7 +3703,17 @@ export class SpSystemTrace extends BaseElement { } this.drawJankLine(endP, findJankEntry, data.children[0]); } - this.refreshCanvas(true); + } + }; + if (endRowStruct) { + if (endRowStruct.isComplete) { + addPointLink(); + } else { + endRowStruct.supplierFrame!().then((res: any) => { + endRowStruct.dataListCache = res; + endRowStruct.loadingFrame = false; + addPointLink(); + }); } } } @@ -3742,7 +3761,9 @@ export class SpSystemTrace extends BaseElement { }); } if (endRowStruct) { - let findJankEntry = endRowStruct!.dataList!.find((dat: any) => dat.startTime == data.startTime && dat.dur! > 0); + let findJankEntry = endRowStruct!.dataListCache!.find( + (dat: any) => dat.startTime == data.startTime && dat.dur! > 0 + ); //连线规则 let ts: number = 0; if (findJankEntry) { @@ -3904,13 +3925,10 @@ export class SpSystemTrace extends BaseElement { } }); }); + window.subscribe(window.SmartEvent.UI.KeyPath, (data) => { - let condition = `trace-row[row-type='${TraceRow.ROW_TYPE_CPU}']`; - let cpuRows = this.shadowRoot!.querySelectorAll>(condition); - cpuRows.forEach((row: TraceRow) => { - //row.isComplete = false; - row.dataListCache = []; - }); + this.invisibleRows.forEach((it) => (it.needRefresh = true)); + this.visibleRows.forEach((it) => (it.needRefresh = true)); if (data.length === 0) { // clear SpSystemTrace.keyPathList = []; @@ -3918,19 +3936,6 @@ export class SpSystemTrace extends BaseElement { } else { // draw queryCpuKeyPathData(data).then((res) => { - res.forEach((it: CpuStruct) => { - let p = Utils.PROCESS_MAP.get(it.processId!); - let t = Utils.THREAD_MAP.get(it.tid!); - let slice = Utils.SCHED_SLICE_MAP.get(`${it.id}-${it.startTime}`); - if (slice) { - it.end_state = slice.endState; - it.priority = slice.priority; - } - it.processName = p; - it.processCmdLine = p; - it.name = t; - it.type = 'thread'; - }); SpSystemTrace.keyPathList = res; this.refreshCanvas(false); }); @@ -4015,7 +4020,7 @@ export class SpSystemTrace extends BaseElement { scrollToFunction(rowId: string, rowParentId: string, rowType: string, smooth: boolean = true) { let condition = `trace-row[row-id='${rowId}'][row-type='${rowType}'][row-parent-id='${rowParentId}']`; let rootRow = - this.shadowRoot!.querySelector>(condition) || + this.rowsEL!.querySelector>(condition) || this.favoriteChartListEL!.getCollectRow((row) => { return row.rowId === rowId && row.rowType === rowType && row.rowParentId === rowParentId; }); @@ -4030,7 +4035,7 @@ export class SpSystemTrace extends BaseElement { behavior: smooth ? 'smooth' : undefined, }); } else { - let row = this.shadowRoot!.querySelector>(`trace-row[row-id='${rowParentId}'][folder]`); + let row = this.rowsEL!.querySelector>(`trace-row[row-id='${rowParentId}'][folder]`); if (row && !row.expansion) { row.expansion = true; } @@ -4118,12 +4123,14 @@ export class SpSystemTrace extends BaseElement { } }); } + queryAllTraceRow(selectors?: string, filter?: (row: TraceRow) => boolean): TraceRow[] { return [ - ...this.shadowRoot!.querySelectorAll>(selectors ?? 'trace-row'), + ...this.rowsEL!.querySelectorAll>(selectors ?? 'trace-row'), ...this.favoriteChartListEL!.getCollectRows(filter), ]; } + search(query: string) { this.queryAllTraceRow().forEach((item) => { if (query == null || query == undefined || query == '') { @@ -4154,35 +4161,20 @@ export class SpSystemTrace extends BaseElement { this.visibleRows.forEach((it) => (it.rowHidden = false && it.draw(true))); } - searchCPU(query: string): Array { - let traceRow = - this.shadowRoot!.querySelector>(`trace-row[scene]`) || - this.favoriteChartListEL!.getCollectRow((row) => row.hasAttribute('scene')); - let dataAll = `trace-row[row-type='cpu-data']`; - if (traceRow) { - dataAll = `trace-row[row-type='cpu-data'][scene]`; + async searchCPU(query: string): Promise> { + let pidArr: Array = []; + let tidArr: Array = []; + for (let key of Utils.PROCESS_MAP.keys()) { + if (`${key}`.includes(query) || (Utils.PROCESS_MAP.get(key) || '').includes(query)) { + pidArr.push(key); + } } - let searchResults: Array = []; - let repairData = (item: TraceRow) => { - let res = item!.dataList!.filter( - (it) => - (it.name && it.name.indexOf(query) >= 0) || - it.tid == query || - it.processId == query || - (it.processName && it.processName.indexOf(query) >= 0) - ); - searchResults.push(...res); - }; - this.shadowRoot!.querySelectorAll>(`${dataAll}`).forEach(repairData); - if (traceRow) { - this.favoriteChartListEL!.getCollectRows( - (row) => row.rowType === 'cpu-data' && row.hasAttribute('scene') - )?.forEach(repairData); - } else { - this.favoriteChartListEL!.getCollectRows((row) => row.rowType === 'cpu-data')?.forEach(repairData); + for (let key of Utils.THREAD_MAP.keys()) { + if (`${key}`.includes(query) || (Utils.THREAD_MAP.get(key) || '').includes(query)) { + tidArr.push(key); + } } - searchResults.sort((a, b) => (a.startTime || 0) - (b.startTime || 0)); - return searchResults; + return await searchCpuDataSender(pidArr, tidArr); } async searchFunction(cpuList: Array, query: string): Promise> { @@ -4305,10 +4297,17 @@ export class SpSystemTrace extends BaseElement { this.queryAllTraceRow().forEach((item) => { item.highlight = false; }); - if (findEntry.type == 'thread') { + if (findEntry.type == 'cpu') { CpuStruct.selectCpuStruct = findEntry; CpuStruct.hoverCpuStruct = CpuStruct.selectCpuStruct; this.queryAllTraceRow(`trace-row[row-type='cpu-data']`, (row) => row.rowType === 'cpu-data').forEach((item) => { + if (item.rowId === `${findEntry.cpu}`) { + this.rechargeCpuData( + findEntry, + item.dataListCache.find((it) => it.startTime > findEntry.startTime) + ); + item.fixedList = [findEntry]; + } item.highlight = item.rowId == `${findEntry.cpu}`; item.draw(true); }); @@ -4316,7 +4315,20 @@ export class SpSystemTrace extends BaseElement { this.onClickHandler(TraceRow.ROW_TYPE_CPU); } else if (findEntry.type == 'func') { this.observerScrollHeightEnable = true; - this.scrollToActFunc(findEntry, true); + this.moveRangeToCenter(findEntry.startTime!, findEntry.dur!); + this.scrollToActFunc( + { + startTs: findEntry.startTime, + dur: findEntry.dur, + tid: findEntry.tid, + pid: findEntry.pid, + depth: findEntry.depth, + argsetid: findEntry.argsetid, + funName: findEntry.funName, + cookie: findEntry.cookie, + }, + true + ); } else if (findEntry.type == 'thread||process') { let threadProcessRow = this.rowsEL?.querySelectorAll>('trace-row')[0]; if (threadProcessRow) { @@ -4327,12 +4339,9 @@ export class SpSystemTrace extends BaseElement { this.closeAllExpandRows(findEntry.rowParentId); this.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); let completeEntry = () => { - let searchEntry = filterRow!.dataList!.find((dat) => dat.startTime === findEntry.startTime); this.hoverStructNull(); this.selectStructNull(); this.wakeupListNull(); - ThreadStruct.hoverThreadStruct = searchEntry; - ThreadStruct.selectThreadStruct = searchEntry; this.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); }; if (filterRow!.isComplete) { @@ -4361,6 +4370,13 @@ export class SpSystemTrace extends BaseElement { } scrollToActFunc(funcStract: any, highlight: boolean) { + if (Utils.isBinder(funcStract)) { + } else { + if (funcStract.dur === -1) { + funcStract.dur = (TraceRow.range?.totalNS || 0) - (funcStract.startTs || 0); + funcStract.flag = 'Did not end'; + } + } const toTargetDepth = (entry: any) => { if (entry) { this.hoverStructNull(); @@ -4369,7 +4385,7 @@ export class SpSystemTrace extends BaseElement { FuncStruct.hoverFuncStruct = entry; FuncStruct.selectFuncStruct = entry; this.onClickHandler(TraceRow.ROW_TYPE_FUNC); - this.scrollToDepth(`${funcRowID}`, `${funcStract.pid}`, funcStract.type, true, entry.depth || 0); + this.scrollToDepth(`${funcRowID}`, `${funcStract.pid}`, 'func', true, entry.depth || 0); } }; let funcRowID = funcStract.cookie == null ? funcStract.tid : `${funcStract.funName}-${funcStract.pid}`; @@ -4377,10 +4393,10 @@ export class SpSystemTrace extends BaseElement { return row.rowId === funcRowID && row.rowType === 'func'; }); if (targetRow) { + targetRow.fixedList[0] = funcStract; targetRow.highlight = highlight; //如果目标泳道图在收藏上面,则跳转至收藏 - let searchEntry = targetRow!.dataList!.find((dat) => dat.startTs === funcStract.startTime); - toTargetDepth(searchEntry); + toTargetDepth(funcStract); return; } let parentRow = this.rowsEL!.querySelector>(`trace-row[row-id='${funcStract.pid}'][folder]`); @@ -4396,22 +4412,19 @@ export class SpSystemTrace extends BaseElement { return; } } + filterRow.fixedList = [funcStract]; filterRow!.highlight = highlight; let row = this.rowsEL!.querySelector>(`trace-row[row-id='${funcStract.pid}'][folder]`); if (row && !row.expansion) { row.expansion = true; } const completeEntry = () => { - let entry = filterRow!.dataList!.find((dat) => dat.startTs === funcStract.startTime); - toTargetDepth(entry); + toTargetDepth(filterRow.fixedList[0]); }; if (filterRow!.isComplete) { completeEntry(); } else { - FuncStruct.hoverFuncStruct = funcStract; - FuncStruct.selectFuncStruct = funcStract; - this.onClickHandler(TraceRow.ROW_TYPE_FUNC); - this.scrollToProcess(`${funcStract.tid}`, `${funcStract.pid}`, 'process', false); + this.scrollToProcess(`${funcStract.tid}`, `${funcStract.pid}`, 'thread', false); this.scrollToFunction(`${funcStract.tid}`, `${funcStract.pid}`, 'func', true); filterRow!.onComplete = completeEntry; } @@ -4441,99 +4454,29 @@ export class SpSystemTrace extends BaseElement { this.refreshCanvas(true); } - showPreCpuStruct(currentIndex: number, cpuStructs: Array): number { - if (cpuStructs.length == 0) { - return 0; + private rechargeCpuData(it: CpuStruct, next: CpuStruct | undefined): void { + let p = Utils.PROCESS_MAP.get(it.processId!); + let t = Utils.THREAD_MAP.get(it.tid!); + let slice = Utils.SCHED_SLICE_MAP.get(`${it.id}-${it.startTime}`); + if (slice) { + it.end_state = slice.endState; + it.priority = slice.priority; } - let findIndex = -1; - for (let i = cpuStructs.length - 1; i >= 0; i--) { - let it = cpuStructs[i]; - if ( - i < currentIndex && - it.startTime! >= TraceRow.range!.startNS && - it.startTime! + it.dur! <= TraceRow.range!.endNS - ) { - findIndex = i; - break; + it.processName = p; + it.processCmdLine = p; + it.name = t; + it.type = 'thread'; + if (next) { + if (it.startTime! + it.dur! > next!.startTime! || it.dur == -1) { + it.dur = next!.startTime! - it.startTime!; + it.nofinish = true; } - } - if (findIndex >= 0) { - let findEntry = cpuStructs[findIndex]; - CpuStruct.selectCpuStruct = findEntry; - this.rowsEL!.querySelectorAll>(`trace-row[row-type='cpu-data']`).forEach((item) => { - item.highlight = item.rowId == `${findEntry.cpu}`; - item.draw(true); - }); - this.timerShaftEL?.drawTriangle(findEntry.startTime || 0, 'inverted'); } else { - for (let i = cpuStructs.length - 1; i >= 0; i--) { - let it = cpuStructs[i]; - if (it.startTime! + it.dur! < TraceRow.range!.startNS) { - findIndex = i; - break; - } + if (it.dur == -1) { + it.dur = TraceRow.range!.endNS - it.startTime!; + it.nofinish = true; } - let findEntry: CpuStruct; - if (findIndex == -1) { - findIndex = cpuStructs.length - 1; - } - findEntry = cpuStructs[findIndex]; - CpuStruct.selectCpuStruct = findEntry; - let startNS = this.timerShaftEL?.getRange()?.startNS || 0; - let endNS = this.timerShaftEL?.getRange()?.endNS || 0; - let harfDur = Math.trunc((endNS - startNS) / 2 - findEntry.dur! / 2); - this.timerShaftEL?.setRangeNS(findEntry.startTime! - harfDur, findEntry.startTime! + findEntry.dur! + harfDur); - this.rowsEL!.querySelectorAll>(`trace-row[row-type='cpu-data']`).forEach((item) => { - item.highlight = item.rowId == `${findEntry.cpu}`; - item.draw(true); - }); - this.timerShaftEL?.drawTriangle(findEntry.startTime || 0, 'inverted'); } - CpuStruct.hoverCpuStruct = CpuStruct.selectCpuStruct; - this.onClickHandler(TraceRow.ROW_TYPE_CPU); - return findIndex; - } - - showNextCpuStruct(currentIndex: number, cpuStructs: Array): number { - if (cpuStructs.length == 0) { - return 0; - } - let findIndex = cpuStructs.findIndex((it, idx) => { - return ( - idx > currentIndex && - it.startTime! >= TraceRow.range!.startNS && - it.startTime! + it.dur! <= TraceRow.range!.endNS - ); - }); - if (findIndex >= 0) { - let findEntry = cpuStructs[findIndex]; - CpuStruct.selectCpuStruct = findEntry; - this.rowsEL!.querySelectorAll>(`trace-row[row-type='cpu-data']`).forEach((item) => { - item.highlight = item.rowId == `${findEntry.cpu}`; - item.draw(true); - }); - this.timerShaftEL?.drawTriangle(findEntry.startTime || 0, 'inverted'); - } else { - findIndex = cpuStructs.findIndex((it) => it.startTime! > TraceRow.range!.endNS); - let findEntry: CpuStruct; - if (findIndex == -1) { - findIndex = 0; - } - findEntry = cpuStructs[findIndex]; - CpuStruct.selectCpuStruct = findEntry; - let startNS = this.timerShaftEL?.getRange()?.startNS || 0; - let endNS = this.timerShaftEL?.getRange()?.endNS || 0; - let harfDur = Math.trunc((endNS - startNS) / 2 - findEntry.dur! / 2); - this.timerShaftEL?.setRangeNS(findEntry.startTime! - harfDur, findEntry.startTime! + findEntry.dur! + harfDur); - this.rowsEL!.querySelectorAll>(`trace-row[row-type='cpu-data']`).forEach((item) => { - item.highlight = item.rowId == `${findEntry.cpu}`; - item.draw(true); - }); - this.timerShaftEL?.drawTriangle(findEntry.startTime || 0, 'inverted'); - } - CpuStruct.hoverCpuStruct = CpuStruct.selectCpuStruct; - this.onClickHandler(TraceRow.ROW_TYPE_CPU); - return findIndex; } reset(progress: Function | undefined | null) { @@ -4574,7 +4517,9 @@ export class SpSystemTrace extends BaseElement { Utils.clearData(); InitAnalysis.getInstance().isInitAnalysis = true; procedurePool.submitWithName('logic0', 'clear', {}, undefined, (res: any) => {}); - procedurePool.submitWithName('logic1', 'clear', {}, undefined, (res: any) => {}); + if (threadPool) { + threadPool.submitProto(QueryEnum.ClearMemoryCache, {}, (res: any, len: number): void => {}); + } this.times.clear(); resetVSync(); SpSystemTrace.keyPathList = []; @@ -4740,15 +4685,12 @@ export class SpSystemTrace extends BaseElement { } if (this.tipEL) { this.tipEL.innerHTML = html; - if (row.rowType === TraceRow.ROW_TYPE_JS_CPU_PROFILER || row.rowType === TraceRow.ROW_TYPE_PERF_CALLCHART || row.rowType === TraceRow.ROW_TYPE_BINDER_COUNT) { + if (row.rowType === TraceRow.ROW_TYPE_JS_CPU_PROFILER || row.rowType === TraceRow.ROW_TYPE_PERF_CALLCHART) { this.tipEL.style.maxWidth = row.clientWidth / 3 + 'px'; this.tipEL.style.wordBreak = ' break-all'; this.tipEL.style.height = 'unset'; this.tipEL.style.display = 'block'; y = y + struct.depth * 20; - if (row.rowType === TraceRow.ROW_TYPE_BINDER_COUNT) { - y = row.hoverY + row.getBoundingClientRect().top - this.getBoundingClientRect().top; - } } else { this.tipEL.style.display = 'flex'; this.tipEL.style.height = row.style.height; @@ -4761,7 +4703,7 @@ export class SpSystemTrace extends BaseElement { } } - queryCPUWakeUpList(data: WakeupBean) { + queryCPUWakeUpList(data: WakeupBean): void { TabPaneCurrentSelection.queryCPUWakeUpListFromBean(data).then((a: any) => { if (a === null) { window.publish(window.SmartEvent.UI.WakeupList, SpSystemTrace.wakeupList); @@ -4772,11 +4714,11 @@ export class SpSystemTrace extends BaseElement { }); } - wakeupListNull() { + wakeupListNull(): void { SpSystemTrace.wakeupList = []; } - initPointToEvent() { + initPointToEvent(): void { this.eventMap = { 'cpu-data': 'Cpu', 'cpu-state': 'Cpu State', @@ -4816,107 +4758,101 @@ export class SpSystemTrace extends BaseElement { } initHtml(): string { - return ` - -