• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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};