1/* 2 * Copyright (C) 2024 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { type CpuFreqData, type RunningFreqData, type RunningData } from '../component/trace/sheet/frequsage/TabPaneFreqUsageConfig'; 17 18let comPower = new Map<number, Map<number, unknown>>(); 19let resultArray: Array<RunningFreqData> = []; 20let timeZones: number = 0; 21let maxCommpuPower: number = 0; 22 23/** 24 * 25 * @param args.runData 数据库查询上来的running数据,此函数会将数据整理成map结构,分组规则:'pid_tid'为键,running数据数字为值 26 * @returns 返回map对象及所有running数据的dur和,后续会依此计算百分比 27 */ 28function orgnazitionMap( 29 args: { 30 runData: Array<RunningData>; 31 cpuFreqData: Array<CpuFreqData>; 32 leftNs: number; 33 rightNs: number; 34 cpuArray: number[]; 35 broCpuData: unknown[]; 36 recordStartNS: number; 37 } 38): Array<RunningFreqData> { 39 let result: Map<string, Array<RunningData>> = new Map(); 40 let sum: number = 0; 41 // 循环分组 42 for (let i = 0; i < args.runData.length; i++) { 43 let mapKey: string = args.runData[i].pid + '_' + args.runData[i].tid; 44 // 该running数据若在map对象中不包含其'pid_tid'构成的键,则新加key-value值 45 if (!result.has(mapKey)) { 46 result.set(mapKey, new Array()); 47 } 48 // 整理左右边界数据问题, 因为涉及多线程,所以必须放在循环里 49 if ( 50 args.runData[i].ts < args.leftNs && 51 args.runData[i].ts + args.runData[i].dur > args.leftNs 52 ) { 53 args.runData[i].dur = args.runData[i].ts + args.runData[i].dur - args.leftNs; 54 args.runData[i].ts = args.leftNs; 55 } 56 if (args.runData[i].ts + args.runData[i].dur > args.rightNs) { 57 args.runData[i].dur = args.rightNs - args.runData[i].ts; 58 } 59 // 特殊处理数据表中dur为负值的情况 60 if (args.runData[i].dur < 0) { 61 args.runData[i].dur = 0; 62 } 63 // 分组整理数据 64 result.get(mapKey)?.push({ 65 pid: args.runData[i].pid, 66 tid: args.runData[i].tid, 67 cpu: args.runData[i].cpu, 68 dur: args.runData[i].dur, 69 ts: args.runData[i].ts, 70 }); 71 sum += args.runData[i].dur; 72 } 73 return dealCpuFreqData(args.cpuFreqData, result, sum, args.cpuArray, args.broCpuData, args.recordStartNS); 74} 75 76/** 77 * 78 * @param cpuFreqData cpu频点数据的数组 79 * @param result running数据的map对象 80 * @param sum running数据的时间和 81 * @returns 返回cpu频点数据map,'pid_tid'为键,频点算力值数据的数组为值 82 */ 83function dealCpuFreqData( 84 cpuFreqData: Array<CpuFreqData>, 85 result: Map<string, Array<RunningData>>, 86 sum: number, 87 cpuList: number[], 88 broCpuData: unknown[], 89 recordStartNS: number 90): Array<RunningFreqData> { 91 let runningFreqData: Map<string, Array<RunningFreqData>> = new Map(); 92 result.forEach((item, key) => { 93 let resultList: Array<RunningFreqData> = new Array(); 94 for (let i = 0; i < item.length; i++) { 95 for (let j = 0; j < cpuFreqData.length; j++) { 96 let flag: number; 97 if (item[i].cpu === cpuFreqData[j].cpu) { 98 // 当running状态数据的开始时间大于频点数据开始时间,小于频点结束时间。且running数据的持续时间小于频点结束时间减去running数据开始时间的差值的情况 99 if ( 100 item[i].ts > cpuFreqData[j].ts && 101 item[i].ts < cpuFreqData[j].ts + cpuFreqData[j].dur && 102 item[i].dur < cpuFreqData[j].ts + cpuFreqData[j].dur - item[i].ts 103 ) { 104 if (Array.isArray(returnObj(item[i], cpuFreqData[j], sum, (flag = 1), broCpuData, recordStartNS)!)) { 105 resultList = resultList.concat(returnObj(item[i], cpuFreqData[j], sum, (flag = 1), broCpuData, recordStartNS)!); 106 } else { 107 // @ts-ignore 108 resultList.push(returnObj(item[i], cpuFreqData[j], sum, (flag = 1), broCpuData, recordStartNS)!); 109 } 110 item.splice(i, 1); 111 i--; 112 break; 113 } 114 if ( 115 item[i].ts > cpuFreqData[j].ts && 116 item[i].ts < cpuFreqData[j].ts + cpuFreqData[j].dur && 117 item[i].dur >= cpuFreqData[j].ts + cpuFreqData[j].dur - item[i].ts 118 ) { 119 // 当running状态数据的开始时间大于频点数据开始时间,小于频点结束时间。且running数据的持续时间大于等于频点结束时间减去running数据开始时间的差值的情况 120 if (Array.isArray(returnObj(item[i], cpuFreqData[j], sum, (flag = 2), broCpuData, recordStartNS)!)) { 121 resultList = resultList.concat(returnObj(item[i], cpuFreqData[j], sum, (flag = 2), broCpuData, recordStartNS)!); 122 } else { 123 // @ts-ignore 124 resultList.push(returnObj(item[i], cpuFreqData[j], sum, (flag = 2), broCpuData, recordStartNS)!); 125 } 126 } 127 // 当running状态数据的开始时间小于等于频点数据开始时间,结束时间大于频点开始时间。且running数据的持续时间减去频点数据开始时间的差值小于频点数据持续时间的情况 128 if ( 129 item[i].ts <= cpuFreqData[j].ts && 130 item[i].ts + item[i].dur > cpuFreqData[j].ts && 131 item[i].dur + item[i].ts - cpuFreqData[j].ts < cpuFreqData[j].dur 132 ) { 133 if (Array.isArray(returnObj(item[i], cpuFreqData[j], sum, (flag = 3), broCpuData, recordStartNS)!)) { 134 resultList = resultList.concat(returnObj(item[i], cpuFreqData[j], sum, (flag = 3), broCpuData, recordStartNS)!); 135 } else { 136 // @ts-ignore 137 resultList.push(returnObj(item[i], cpuFreqData[j], sum, (flag = 3), broCpuData, recordStartNS)!); 138 } 139 item.splice(i, 1); 140 i--; 141 break; 142 } 143 if ( 144 item[i].ts <= cpuFreqData[j].ts && 145 item[i].ts + item[i].dur > cpuFreqData[j].ts && 146 item[i].dur + item[i].ts - cpuFreqData[j].ts >= cpuFreqData[j].dur 147 ) { 148 // 当running状态数据的开始时间小于等于频点数据开始时间,结束时间大于频点开始时间。且running数据的持续时间减去频点数据开始时间的差值大于等于频点数据持续时间的情况 149 if (Array.isArray(returnObj(item[i], cpuFreqData[j], sum, (flag = 4), broCpuData, recordStartNS)!)) { 150 resultList = resultList.concat(returnObj(item[i], cpuFreqData[j], sum, (flag = 4), broCpuData, recordStartNS)!); 151 } else { 152 // @ts-ignore 153 resultList.push(returnObj(item[i], cpuFreqData[j], sum, (flag = 4), broCpuData, recordStartNS)!); 154 } 155 } 156 if ( 157 item[i].ts <= cpuFreqData[j].ts && 158 item[i].ts + item[i].dur <= cpuFreqData[j].ts 159 ) { 160 // 当running状态数据的开始时间小于等于频点数据开始时间,结束时间小于等于频点开始时间的情况 161 if (Array.isArray(returnObj(item[i], cpuFreqData[j], sum, (flag = 5), broCpuData, recordStartNS)!)) { 162 resultList = resultList.concat(returnObj(item[i], cpuFreqData[j], sum, (flag = 5), broCpuData, recordStartNS)!); 163 } else { 164 // @ts-ignore 165 resultList.push(returnObj(item[i], cpuFreqData[j], sum, (flag = 5), broCpuData, recordStartNS)!); 166 } 167 item.splice(i, 1); 168 i--; 169 break; 170 } 171 } else { 172 if (!cpuList.includes(item[i].cpu)) { 173 if (Array.isArray(returnObj(item[i], cpuFreqData[j], sum, (flag = 5), broCpuData, recordStartNS)!)) { 174 resultList = resultList.concat(returnObj(item[i], cpuFreqData[j], sum, (flag = 5), broCpuData, recordStartNS)!); 175 } else { 176 // @ts-ignore 177 resultList.push(returnObj(item[i], cpuFreqData[j], sum, (flag = 5), broCpuData, recordStartNS)!); 178 } 179 item.splice(i, 1); 180 i--; 181 break; 182 } 183 } 184 } 185 } 186 runningFreqData.set(key, mergeSameData(resultList)); 187 }); 188 return dealTree(runningFreqData); 189} 190 191/** 192 * 193 * @param item running数据 194 * @param cpuFreqData 频点数据 195 * @param sum running总和 196 * @param flag 标志位,根据不同值返回不同结果 197 * @param broCpuData 所有CPU数据 198 * @returns 返回新的对象 199 */ 200function returnObj( 201 item: RunningData, 202 cpuFreqData: CpuFreqData, 203 sum: number, 204 flag: number, 205 broCpuData: Array<unknown>, 206 recordStartNS: number 207): RunningFreqData | undefined { 208 const PERCENT: number = 100; 209 const FREQ_MUTIPLE: number = 1000; 210 //@ts-ignore 211 const computorPower: number = comPower ? comPower.get(item.cpu)?.mapData.get(cpuFreqData.value)! : 0; 212 let result; 213 switch (flag) { 214 case 1: 215 result = { 216 thread: item.pid + '_' + item.tid, 217 consumption: cpuFreqData.value * item.dur, 218 cpu: item.cpu, 219 frequency: computorPower ? cpuFreqData.value / FREQ_MUTIPLE + ': ' + computorPower : cpuFreqData.value / FREQ_MUTIPLE, 220 dur: item.dur, 221 percent: (item.dur / sum) * PERCENT, 222 consumpower: computorPower * item.dur, 223 cpuload: (computorPower * item.dur) / (timeZones * maxCommpuPower) * PERCENT, 224 // @ts-ignore 225 ts: item.ts - recordStartNS 226 }; 227 break; 228 case 2: 229 result = { 230 thread: item.pid + '_' + item.tid, 231 consumption: cpuFreqData.value * (cpuFreqData.ts + cpuFreqData.dur - item.ts), 232 cpu: item.cpu, 233 frequency: computorPower ? cpuFreqData.value / FREQ_MUTIPLE + ': ' + computorPower : cpuFreqData.value / FREQ_MUTIPLE, 234 dur: cpuFreqData.ts + cpuFreqData.dur - item.ts, 235 percent: ((cpuFreqData.ts + cpuFreqData.dur - item.ts) / sum) * PERCENT, 236 consumpower: computorPower * (cpuFreqData.ts + cpuFreqData.dur - item.ts), 237 cpuload: (computorPower * (cpuFreqData.ts + cpuFreqData.dur - item.ts)) / (timeZones * maxCommpuPower) * PERCENT, 238 // @ts-ignore 239 ts: item.ts - recordStartNS 240 }; 241 break; 242 case 3: 243 result = { 244 thread: item.pid + '_' + item.tid, 245 consumption: cpuFreqData.value * (item.dur + item.ts - cpuFreqData.ts), 246 cpu: item.cpu, 247 frequency: computorPower ? cpuFreqData.value / FREQ_MUTIPLE + ': ' + computorPower : cpuFreqData.value / FREQ_MUTIPLE, 248 dur: item.dur + item.ts - cpuFreqData.ts, 249 percent: ((item.dur + item.ts - cpuFreqData.ts) / sum) * PERCENT, 250 consumpower: computorPower * (item.dur + item.ts - cpuFreqData.ts), 251 cpuload: (computorPower * (item.dur + item.ts - cpuFreqData.ts)) / (timeZones * maxCommpuPower) * PERCENT, 252 // @ts-ignore 253 ts: (cpuFreqData.ts - recordStartNS) 254 }; 255 break; 256 case 4: 257 result = { 258 thread: item.pid + '_' + item.tid, 259 consumption: cpuFreqData.value * cpuFreqData.dur, 260 cpu: item.cpu, 261 frequency: computorPower ? cpuFreqData.value / FREQ_MUTIPLE + ': ' + computorPower : cpuFreqData.value / FREQ_MUTIPLE, 262 dur: cpuFreqData.dur, 263 percent: (cpuFreqData.dur / sum) * PERCENT, 264 consumpower: computorPower * cpuFreqData.dur, 265 cpuload: (computorPower * cpuFreqData.dur) / (timeZones * maxCommpuPower) * PERCENT, 266 // @ts-ignore 267 ts: (cpuFreqData.ts - recordStartNS) 268 }; 269 break; 270 case 5: 271 result = { 272 thread: item.pid + '_' + item.tid, 273 consumption: 0, 274 cpu: item.cpu, 275 frequency: 'unknown', 276 dur: item.dur, 277 percent: (item.dur / sum) * PERCENT, 278 consumpower: 0, 279 cpuload: 0, 280 // @ts-ignore 281 ts: (item.ts - recordStartNS) 282 }; 283 break; 284 } 285 // @ts-ignore 286 if (comPower && (comPower!.get(item.cpu).broId || comPower!.get(item.cpu).broId === 0) && comPower!.get(item.cpu).smtRate) { 287 // @ts-ignore 288 let broCpuDataList = broCpuData.filter((e) => (e.cpu === comPower!.get(item.cpu).broId) && // @ts-ignore 289 !(e.startTime >= result!.ts + result!.dur || e.endTime <= result!.ts)); 290 let parallelDur = 0; 291 broCpuDataList.forEach((e) => { 292 // @ts-ignore 293 if (e.startTime <= result!.ts && e.endTime >= result!.ts + result!.dur) { 294 parallelDur += result!.dur; 295 // @ts-ignore 296 } else if (e.startTime <= result!.ts && e.endTime < result!.ts + result!.dur && e.endTime >= result!.ts) { 297 // @ts-ignore 298 parallelDur += e.endTime - result!.ts; 299 // @ts-ignore 300 } else if (e.startTime > result!.ts && e.endTime >= result!.ts + result!.dur && e.startTime <= result!.ts + result!.dur) { 301 // @ts-ignore 302 parallelDur += result!.ts + result!.dur - e.startTime; 303 } else { 304 // @ts-ignore 305 parallelDur += e.dur; 306 } 307 }); 308 if (parallelDur === 0) { 309 return result; 310 } else if (parallelDur === result!.dur) { 311 // @ts-ignore 312 result.consumpower = result.consumpower * comPower!.get(item.cpu).smtRate; 313 // @ts-ignore 314 result.frequency = cpuFreqData.value / FREQ_MUTIPLE + ': ' + computorPower * comPower!.get(item.cpu).smtRate + '*'; 315 return result; 316 } else { 317 let resultArr = [ 318 { 319 thread: item.pid + '_' + item.tid, 320 consumption: cpuFreqData.value * (result!.dur - parallelDur), 321 cpu: item.cpu, 322 frequency: computorPower ? cpuFreqData.value / FREQ_MUTIPLE + ': ' + computorPower : cpuFreqData.value / FREQ_MUTIPLE, 323 dur: result!.dur - parallelDur, 324 percent: ((result!.dur - parallelDur) / sum) * PERCENT, 325 consumpower: computorPower * (result!.dur - parallelDur), 326 cpuload: (computorPower * (result!.dur - parallelDur)) / (timeZones * maxCommpuPower) * PERCENT, 327 // @ts-ignore 328 ts: item.ts - recordStartNS 329 }, 330 { 331 thread: item.pid + '_' + item.tid, 332 consumption: cpuFreqData.value * parallelDur, 333 cpu: item.cpu, 334 // @ts-ignore 335 frequency: computorPower ? cpuFreqData.value / FREQ_MUTIPLE + ': ' + computorPower * comPower!.get(item.cpu).smtRate + '*' : cpuFreqData.value / FREQ_MUTIPLE, 336 dur: parallelDur, 337 percent: (parallelDur / sum) * PERCENT, 338 consumpower: computorPower * parallelDur, 339 cpuload: (computorPower * parallelDur) / (timeZones * maxCommpuPower) * PERCENT, 340 // @ts-ignore 341 ts: item.ts - recordStartNS 342 } 343 ]; 344 // @ts-ignore 345 return resultArr; 346 } 347 } else { 348 return result; 349 } 350} 351 352/** 353 * 354 * @param resultList 单线程内running数据与cpu频点数据整合成的数组 355 */ 356function mergeSameData( 357 resultList: Array<RunningFreqData> 358): Array<RunningFreqData> { 359 let cpuFreqArr: Array<RunningFreqData> = []; 360 let cpuArr: Array<number> = []; 361 //合并同一线程内,当运行所在cpu和频点相同时,dur及percent进行累加求和 362 for (let i = 0; i < resultList.length; i++) { 363 if (!cpuArr.includes(resultList[i].cpu)) { 364 cpuArr.push(resultList[i].cpu); 365 cpuFreqArr.push(creatNewObj(resultList[i].cpu)); 366 } 367 for (let j = i + 1; j < resultList.length; j++) { 368 if ( 369 resultList[i].cpu === resultList[j].cpu && 370 resultList[i].frequency === resultList[j].frequency 371 ) { 372 resultList[i].dur += resultList[j].dur; 373 resultList[i].percent += resultList[j].percent; 374 resultList[i].consumption += resultList[j].consumption; 375 resultList[i].consumpower += resultList[j].consumpower; 376 resultList[i].cpuload += resultList[j].cpuload; 377 resultList.splice(j, 1); 378 j--; 379 } 380 } 381 cpuFreqArr.find(function (item) { 382 if (item.cpu === resultList[i].cpu) { 383 item.children?.push(resultList[i]); 384 item.children?.sort((a, b) => b.consumption - a.consumption); 385 item.dur += resultList[i].dur; 386 item.percent += resultList[i].percent; 387 item.consumption += resultList[i].consumption; 388 item.consumpower += resultList[i].consumpower; 389 item.cpuload += resultList[i].cpuload; 390 item.thread = resultList[i].thread; 391 } 392 }); 393 } 394 cpuFreqArr.sort((a, b) => a.cpu - b.cpu); 395 return cpuFreqArr; 396} 397 398/** 399 * 400 * @param params cpu层级的数据 401 * @returns 整理好的进程级数据 402 */ 403function dealTree( 404 params: Map<string, Array<RunningFreqData>> 405): Array<RunningFreqData> { 406 let result: Array<RunningFreqData> = []; 407 params.forEach((item, key) => { 408 let process: RunningFreqData = creatNewObj(-1, false); 409 let thread: RunningFreqData = creatNewObj(-2); 410 for (let i = 0; i < item.length; i++) { 411 thread.children?.push(item[i]); 412 thread.dur += item[i].dur; 413 thread.percent += item[i].percent; 414 thread.consumption += item[i].consumption; 415 thread.consumpower += item[i].consumpower; 416 thread.cpuload += item[i].cpuload; 417 thread.thread = item[i].thread; 418 } 419 process.children?.push(thread); 420 process.dur += thread.dur; 421 process.percent += thread.percent; 422 process.consumption += thread.consumption; 423 process.consumpower += thread.consumpower; 424 process.cpuload += thread.cpuload; 425 process.thread = process.thread! + key.split('_')[0]; 426 result.push(process); 427 }); 428 for (let i = 0; i < result.length; i++) { 429 for (let j = i + 1; j < result.length; j++) { 430 if (result[i].thread === result[j].thread) { 431 result[i].children?.push(result[j].children![0]); 432 result[i].dur += result[j].dur; 433 result[i].percent += result[j].percent; 434 result[i].consumption += result[j].consumption; 435 result[i].consumpower += result[j].consumpower; 436 result[i].cpuload += result[j].cpuload; 437 result.splice(j, 1); 438 j--; 439 } 440 } 441 } 442 return result; 443} 444 445/** 446 * 447 * @param cpu 根据cpu值创建层级结构,cpu < 0为线程、进程层级,其余为cpu层级 448 * @returns 449 */ 450function creatNewObj(cpu: number, flag: boolean = true): RunningFreqData { 451 return { 452 thread: flag ? '' : 'P', 453 consumption: 0, 454 cpu: cpu, 455 frequency: -1, 456 dur: 0, 457 percent: 0, 458 children: [], 459 consumpower: 0, 460 cpuload: 0 461 }; 462} 463 464/** 465 * 466 * @param arr 需要整理汇总的频点级数据 467 * @returns 返回一个total->cpu->频点的三级树结构数组 468 */ 469function fixTotal(arr: Array<RunningFreqData>): Array<RunningFreqData> { 470 let result: Array<RunningFreqData> = []; 471 let flag: number = -1; 472 // 数据入参的情况是,第一条为进程数据,其后是该进程下所有线程的数据。以进程数据做分割 473 for (let i = 0; i < arr.length; i++) { 474 // 判断如果是进程数据,则将其children的数组清空,并以其作为最顶层数据 475 if (arr[i].thread?.indexOf('P') !== -1) { 476 arr[i].children = []; 477 arr[i].thread = arr[i].thread + '-summary data'; 478 result.push(arr[i]); 479 // 标志判定当前数组的长度,也可用.length判断 480 flag++; 481 } else { 482 // 非进程数据会进入到else中,去判断当前线程数据的cpu分组是否存在,不存在则进行创建 483 if (result[flag].children![arr[i].cpu] === undefined) { 484 result[flag].children![arr[i].cpu] = { 485 thread: 'summary data', 486 consumption: 0, 487 cpu: arr[i].cpu, 488 frequency: -1, 489 dur: 0, 490 percent: 0, 491 children: [], 492 consumpower: 0, 493 cpuload: 0 494 }; 495 } 496 // 每有一条数据要放到cpu分组下时,则将该cpu分组的各项数据累和 497 result[flag].children![arr[i].cpu].consumption += arr[i].consumption; 498 result[flag].children![arr[i].cpu].consumpower += arr[i].consumpower; 499 result[flag].children![arr[i].cpu].cpuload += arr[i].cpuload; 500 result[flag].children![arr[i].cpu].dur += arr[i].dur; 501 result[flag].children![arr[i].cpu].percent += arr[i].percent; 502 // 查找当前cpu分组下是否存在与当前数据的频点相同的数据,返回相同数据的索引值 503 let index: number = result[flag].children![ 504 arr[i].cpu 505 ].children?.findIndex((item) => item.frequency === arr[i].frequency)!; 506 // 若存在相同频点的数据,则进行合并,不同直接push 507 if (index === -1) { 508 arr[i].thread = 'summary data'; 509 result[flag].children![arr[i].cpu].children?.push(arr[i]); 510 } else { 511 result[flag].children![arr[i].cpu].children![index].consumption += arr[i].consumption; 512 result[flag].children![arr[i].cpu].children![index].consumpower += arr[i].consumpower; 513 result[flag].children![arr[i].cpu].children![index].dur += arr[i].dur; 514 result[flag].children![arr[i].cpu].children![index].percent += arr[i].percent; 515 result[flag].children![arr[i].cpu].children![index].cpuload += arr[i].cpuload; 516 } 517 } 518 } 519 return result; 520} 521 522/** 523 * 524 * @param arr1 前次整理好的区分线程的数据 525 * @param arr2 不区分线程的Total数据 526 */ 527function mergeTotal( 528 arr1: Array<RunningFreqData>, 529 arr2: Array<RunningFreqData> 530): void { 531 for (let i = 0; i < arr1.length; i++) { 532 const num: number = arr2.findIndex((item) => 533 item.thread?.includes(arr1[i].thread!) 534 ); 535 arr2[num].thread = 'summary data'; 536 arr1[i].children?.unshift(arr2[num]); 537 arr2.splice(num, 1); 538 } 539} 540 541 542/** 543 * 544 * @param arr 待整理的数组,会经过递归取到最底层的数据 545 */ 546function recursion(arr: Array<RunningFreqData>): void { 547 for (let idx = 0; idx < arr.length; idx++) { 548 if (arr[idx].cpu === -1) { 549 resultArray.push(arr[idx]); 550 } 551 if (arr[idx].children) { 552 recursion(arr[idx].children!); 553 } else { 554 resultArray.push(arr[idx]); 555 } 556 } 557} 558 559self.onmessage = (e: MessageEvent): void => { 560 comPower = e.data.comPower; 561 resultArray = []; 562 timeZones = e.data.rightNs - e.data.leftNs; 563 maxCommpuPower = 0; 564 if (comPower) { 565 comPower.forEach(item => { 566 let maxFreq = 0; 567 let commpuPower = 0; 568 //@ts-ignore 569 for (const i of item.mapData.entries()) { 570 if (i[0] > maxFreq) { 571 maxFreq = i[0]; 572 commpuPower = i[1]; 573 } 574 } 575 //@ts-ignore 576 maxCommpuPower += commpuPower * item.smtRate; 577 }); 578 } 579 let result = orgnazitionMap(e.data); 580 recursion(result); 581 resultArray = JSON.parse(JSON.stringify(resultArray)); 582 mergeTotal(result, fixTotal(resultArray)); 583 self.postMessage(result); 584};