1fb726d48Sopenharmony_ci/* 2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd. 3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License. 5fb726d48Sopenharmony_ci * You may obtain a copy of the License at 6fb726d48Sopenharmony_ci * 7fb726d48Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 8fb726d48Sopenharmony_ci * 9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and 13fb726d48Sopenharmony_ci * limitations under the License. 14fb726d48Sopenharmony_ci */ 15fb726d48Sopenharmony_ci 16fb726d48Sopenharmony_ciimport { SpSystemTrace } from '../SpSystemTrace'; 17fb726d48Sopenharmony_ciimport { TraceRow } from '../trace/base/TraceRow'; 18fb726d48Sopenharmony_ciimport { renders } from '../../database/ui-worker/ProcedureWorker'; 19fb726d48Sopenharmony_ciimport { info } from '../../../log/Log'; 20fb726d48Sopenharmony_ciimport { PerfToolRender, PerfToolStruct } from '../../database/ui-worker/ProcedureWorkerPerfTool'; 21fb726d48Sopenharmony_ciimport { EmptyRender } from '../../database/ui-worker/cpu/ProcedureWorkerCPU'; 22fb726d48Sopenharmony_ciimport { queryPerfOutputData, queryPerfToolsDur } from '../../database/sql/SqlLite.sql'; 23fb726d48Sopenharmony_ci 24fb726d48Sopenharmony_ciexport class SpPerfOutputDataChart { 25fb726d48Sopenharmony_ci private trace: SpSystemTrace; 26fb726d48Sopenharmony_ci private startTime: number | undefined; 27fb726d48Sopenharmony_ci private perfOutputArr: Array<string> | undefined; 28fb726d48Sopenharmony_ci private dur: number | undefined; 29fb726d48Sopenharmony_ci 30fb726d48Sopenharmony_ci constructor(trace: SpSystemTrace) { 31fb726d48Sopenharmony_ci this.trace = trace; 32fb726d48Sopenharmony_ci } 33fb726d48Sopenharmony_ci 34fb726d48Sopenharmony_ci async init(): Promise<void> { 35fb726d48Sopenharmony_ci let perfOutputData = await queryPerfOutputData(); 36fb726d48Sopenharmony_ci if (perfOutputData.length === 0) { 37fb726d48Sopenharmony_ci return; 38fb726d48Sopenharmony_ci } 39fb726d48Sopenharmony_ci let perfToolsDur = await queryPerfToolsDur(); 40fb726d48Sopenharmony_ci if (perfToolsDur.length > 0) { 41fb726d48Sopenharmony_ci // @ts-ignore 42fb726d48Sopenharmony_ci this.dur = perfToolsDur[0].dur; 43fb726d48Sopenharmony_ci } else { 44fb726d48Sopenharmony_ci this.dur = 3000000000; 45fb726d48Sopenharmony_ci } 46fb726d48Sopenharmony_ci // @ts-ignore 47fb726d48Sopenharmony_ci this.perfOutputArr = perfOutputData[0].name.split(':')[2].split(','); 48fb726d48Sopenharmony_ci // @ts-ignore 49fb726d48Sopenharmony_ci let endTime: number = perfOutputData[0].ts; 50fb726d48Sopenharmony_ci this.startTime = endTime - window.recordStartNS - this.dur!; 51fb726d48Sopenharmony_ci if (this.startTime < 0) { 52fb726d48Sopenharmony_ci this.startTime = 0; 53fb726d48Sopenharmony_ci } 54fb726d48Sopenharmony_ci let folder = await this.initFolder(); 55fb726d48Sopenharmony_ci this.trace.rowsEL?.appendChild(folder); 56fb726d48Sopenharmony_ci this.initData(folder); 57fb726d48Sopenharmony_ci } 58fb726d48Sopenharmony_ci 59fb726d48Sopenharmony_ci private clockThreadHandler( 60fb726d48Sopenharmony_ci traceRow: TraceRow<PerfToolStruct>, 61fb726d48Sopenharmony_ci it: { 62fb726d48Sopenharmony_ci name: string; 63fb726d48Sopenharmony_ci }, 64fb726d48Sopenharmony_ci perfId: number 65fb726d48Sopenharmony_ci ): void { 66fb726d48Sopenharmony_ci traceRow.onThreadHandler = (useCache): void => { 67fb726d48Sopenharmony_ci let context: CanvasRenderingContext2D; 68fb726d48Sopenharmony_ci if (traceRow.currentContext) { 69fb726d48Sopenharmony_ci context = traceRow.currentContext; 70fb726d48Sopenharmony_ci } else { 71fb726d48Sopenharmony_ci context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; 72fb726d48Sopenharmony_ci } 73fb726d48Sopenharmony_ci traceRow.canvasSave(context); 74fb726d48Sopenharmony_ci (renders.perfTool as PerfToolRender).renderMainThread( 75fb726d48Sopenharmony_ci { 76fb726d48Sopenharmony_ci context: context, 77fb726d48Sopenharmony_ci useCache: useCache, 78fb726d48Sopenharmony_ci type: it.name, 79fb726d48Sopenharmony_ci index: perfId, 80fb726d48Sopenharmony_ci }, 81fb726d48Sopenharmony_ci traceRow 82fb726d48Sopenharmony_ci ); 83fb726d48Sopenharmony_ci traceRow.canvasRestore(context, this.trace); 84fb726d48Sopenharmony_ci }; 85fb726d48Sopenharmony_ci } 86fb726d48Sopenharmony_ci //@ts-ignore 87fb726d48Sopenharmony_ci async initData(folder: TraceRow<unknown>): Promise<void> { 88fb726d48Sopenharmony_ci let perfToolStartTime = new Date().getTime(); 89fb726d48Sopenharmony_ci let perfToolList = [ 90fb726d48Sopenharmony_ci { name: 'Application Process CPU Power Consumption(MAS)', idx: 27 }, 91fb726d48Sopenharmony_ci { name: 'RS Process CPU Power Consumption(MAS)', idx: 28 }, 92fb726d48Sopenharmony_ci { name: 'Media Process CPU Power Consumption(MAS)', idx: 29 }, 93fb726d48Sopenharmony_ci { name: 'Foundation Process CPU Power Consumption(MAS)', idx: 30 }, 94fb726d48Sopenharmony_ci { name: 'Gpu Power Consumption(MAS)', idx: 31 }, 95fb726d48Sopenharmony_ci { name: 'DDR Power Consumption(MAS)', idx: 32 }, 96fb726d48Sopenharmony_ci { name: 'IO Count', idx: 35 }, 97fb726d48Sopenharmony_ci { name: 'Block Count', idx: 36 }, 98fb726d48Sopenharmony_ci { name: 'IPI Count(Application Main Thread)', idx: 51 }, 99fb726d48Sopenharmony_ci { name: 'IPI Count(RS)', idx: 52 }, 100fb726d48Sopenharmony_ci ]; 101fb726d48Sopenharmony_ci info('perfTools data size is: ', perfToolList!.length); 102fb726d48Sopenharmony_ci for (let i = 0; i < perfToolList.length; i++) { 103fb726d48Sopenharmony_ci const it = perfToolList[i]; 104fb726d48Sopenharmony_ci let traceRow = TraceRow.skeleton<PerfToolStruct>(); 105fb726d48Sopenharmony_ci traceRow.rowId = i + ''; 106fb726d48Sopenharmony_ci traceRow.rowType = TraceRow.ROW_TYPE_PERF_TOOL; 107fb726d48Sopenharmony_ci traceRow.rowParentId = folder.rowId; 108fb726d48Sopenharmony_ci traceRow.style.height = '24px'; 109fb726d48Sopenharmony_ci traceRow.name = it.name; 110fb726d48Sopenharmony_ci traceRow.rowHidden = !folder.expansion; 111fb726d48Sopenharmony_ci traceRow.setAttribute('children', ''); 112fb726d48Sopenharmony_ci traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; 113fb726d48Sopenharmony_ci traceRow.selectChangeHandler = this.trace.selectChangeHandler; 114fb726d48Sopenharmony_ci traceRow.supplierFrame = (): Promise<PerfToolStruct[]> => { 115fb726d48Sopenharmony_ci let data = new PerfToolStruct(); 116fb726d48Sopenharmony_ci data.startTs = this.startTime; 117fb726d48Sopenharmony_ci data.dur = this.dur; 118fb726d48Sopenharmony_ci data.count = this.perfOutputArr![it.idx]; 119fb726d48Sopenharmony_ci data.id = i + 1; 120fb726d48Sopenharmony_ci data.name = it.name; 121fb726d48Sopenharmony_ci //@ts-ignore 122fb726d48Sopenharmony_ci return new Promise<Array<unknown>>((resolve) => resolve([data])); 123fb726d48Sopenharmony_ci }; 124fb726d48Sopenharmony_ci traceRow.findHoverStruct = (): void => { 125fb726d48Sopenharmony_ci PerfToolStruct.hoverPerfToolStruct = traceRow.getHoverStruct(); 126fb726d48Sopenharmony_ci }; 127fb726d48Sopenharmony_ci this.clockThreadHandler(traceRow, it, i); 128fb726d48Sopenharmony_ci folder.addChildTraceRow(traceRow); 129fb726d48Sopenharmony_ci } 130fb726d48Sopenharmony_ci let durTime = new Date().getTime() - perfToolStartTime; 131fb726d48Sopenharmony_ci info('The time to load the ClockData is: ', durTime); 132fb726d48Sopenharmony_ci } 133fb726d48Sopenharmony_ci //@ts-ignore 134fb726d48Sopenharmony_ci async initFolder(): Promise<TraceRow<unknown>> { 135fb726d48Sopenharmony_ci let perfFolder = TraceRow.skeleton(); 136fb726d48Sopenharmony_ci perfFolder.rowId = 'perfTool'; 137fb726d48Sopenharmony_ci perfFolder.index = 0; 138fb726d48Sopenharmony_ci perfFolder.rowType = TraceRow.ROW_TYPE_PERF_TOOL_GROUP; 139fb726d48Sopenharmony_ci perfFolder.rowParentId = ''; 140fb726d48Sopenharmony_ci perfFolder.style.height = '40px'; 141fb726d48Sopenharmony_ci perfFolder.folder = true; 142fb726d48Sopenharmony_ci perfFolder.name = 'Perf Tools'; 143fb726d48Sopenharmony_ci perfFolder.favoriteChangeHandler = this.trace.favoriteChangeHandler; 144fb726d48Sopenharmony_ci perfFolder.selectChangeHandler = this.trace.selectChangeHandler; 145fb726d48Sopenharmony_ci //@ts-ignore 146fb726d48Sopenharmony_ci perfFolder.supplier = (): Promise<unknown[]> => new Promise<Array<unknown>>((resolve) => resolve([])); 147fb726d48Sopenharmony_ci perfFolder.onThreadHandler = (useCache): void => { 148fb726d48Sopenharmony_ci perfFolder.canvasSave(this.trace.canvasPanelCtx!); 149fb726d48Sopenharmony_ci if (perfFolder.expansion) { 150fb726d48Sopenharmony_ci this.trace.canvasPanelCtx?.clearRect(0, 0, perfFolder.frame.width, perfFolder.frame.height); 151fb726d48Sopenharmony_ci } else { 152fb726d48Sopenharmony_ci (renders.empty as EmptyRender).renderMainThread( 153fb726d48Sopenharmony_ci { 154fb726d48Sopenharmony_ci context: this.trace.canvasPanelCtx, 155fb726d48Sopenharmony_ci useCache: useCache, 156fb726d48Sopenharmony_ci type: '', 157fb726d48Sopenharmony_ci }, 158fb726d48Sopenharmony_ci perfFolder 159fb726d48Sopenharmony_ci ); 160fb726d48Sopenharmony_ci } 161fb726d48Sopenharmony_ci perfFolder.canvasRestore(this.trace.canvasPanelCtx!, this.trace); 162fb726d48Sopenharmony_ci }; 163fb726d48Sopenharmony_ci return perfFolder; 164fb726d48Sopenharmony_ci } 165fb726d48Sopenharmony_ci} 166