@@ -260,15 +266,15 @@ export class TabPaneFreqDataCut extends BaseElement {
}
// single方式切割数据功能
dataSingleCut(threadId: any, threadFunc: any, resultList: any) {
+ 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 (/^[0-9]*$/.test(threadIdValue) && threadIdValue != '' && threadFuncName != '') {
- threadId.style.border = '1px solid rgb(151,151,151)';
- threadFunc.style.border = '1px solid rgb(151,151,151)';
+ if (threadIdValue != '' && threadFuncName != '') {
// 根据用户输入的线程ID,方法名去查询数据库,得到对应的方法起始时间,持续时间等数据,以便作为依据进行后续数据切割
querySearchFuncData(threadFuncName, Number(threadIdValue), leftNS, rightNS).then(result => {
if (result != null && result.length > 0) {
@@ -286,8 +292,10 @@ export class TabPaneFreqDataCut extends BaseElement {
}
}
let cycleMap = new Map();
+ let totalList = new Map();
targetMap.forEach((item, key) => {
cycleMap.set(key, new Array());
+ totalList.set(key, new Array());
for (let i = 0; i < dealArr.length; i++) {
let cpuArr = new Array();
let cpuMap = new Map();
@@ -297,31 +305,35 @@ export class TabPaneFreqDataCut extends BaseElement {
// 算力倍数值
const countMutiple = 1000;
cpuMap.set(key, new Array());
- cycleMap.get(key).push({ 'thread': item[0].thread, 'ts': (dealArr[i].ts - timeDur) / multiple, 'count': 0, 'cpu': '', 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
+ cycleMap.get(key).push({ 'thread': '周期' + (i + 1) + '—' + item[0].thread, 'ts': (dealArr[i].ts - timeDur) / multiple, 'count': 0, 'cpu': '', 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
let value = JSON.parse(JSON.stringify(item));
for (let j = 0; j < value.length; j++) {
value[j].ts = value[j].ts * multiple;
- value[j].freq = value[j].freq == 'unknown'? 0 : value[j].freq;
+ 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({ 'thread': value[j].thread, 'count': 0, 'cpu': value[j].cpu, 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
+ cpuMap.get(key).push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': 0, 'cpu': value[j].cpu, 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
}
if (dealArr[i].ts < value[j].ts) {
if (dealArr[i].ts + dealArr[i].dur > value[j].ts) {
if (dealArr[i].ts + dealArr[i].dur > value[j].ts + value[j].dur) {
- resList.push({ 'thread': value[j].thread, 'ts': (value[j].ts - timeDur) / multiple, 'count': (value[j].freq * value[j].dur) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].dur, 'percent': value[j].percent, 'state': 'Running', 'id': i });
+ resList.push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * value[j].dur) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].dur, 'percent': value[j].percent, 'state': 'Running', 'id': i });
+ totalList.get(key).push({ 'thread': value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * value[j].dur) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].dur, 'percent': value[j].percent, 'state': 'Running', 'id': i });
} else {
- resList.push({ 'thread': value[j].thread, 'ts': (value[j].ts - timeDur) / multiple, 'count': (dealArr[i].ts + dealArr[i].dur - value[j].ts) * value[j].freq / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': dealArr[i].ts + dealArr[i].dur - value[j].ts, 'percent': (dealArr[i].ts + dealArr[i].dur - value[j].ts) / value[j].dur * value[j].percent, 'state': 'Running', 'id': i });
+ resList.push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (dealArr[i].ts + dealArr[i].dur - value[j].ts) * value[j].freq / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': dealArr[i].ts + dealArr[i].dur - value[j].ts, 'percent': (dealArr[i].ts + dealArr[i].dur - value[j].ts) / value[j].dur * value[j].percent, 'state': 'Running', 'id': i });
+ totalList.get(key).push({ 'thread': value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (dealArr[i].ts + dealArr[i].dur - value[j].ts) * value[j].freq / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': dealArr[i].ts + dealArr[i].dur - value[j].ts, 'percent': (dealArr[i].ts + dealArr[i].dur - value[j].ts) / value[j].dur * value[j].percent, 'state': 'Running', 'id': i });
break;
}
}
} else {
if (value[j].ts + value[j].dur > dealArr[i].ts) {
if (value[j].ts + value[j].dur > dealArr[i].ts + dealArr[i].dur) {
- resList.push({ 'thread': value[j].thread, 'ts': (dealArr[i].ts - timeDur) / multiple, 'count': dealArr[i].dur * value[j].freq / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': dealArr[i].dur, 'percent': dealArr[i].dur / value[j].dur * value[j].percent, 'state': 'Running', 'id': i });
+ resList.push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': dealArr[i].dur * value[j].freq / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': dealArr[i].dur, 'percent': dealArr[i].dur / value[j].dur * value[j].percent, 'state': 'Running', 'id': i });
+ totalList.get(key).push({ 'thread': value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': dealArr[i].dur * value[j].freq / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': dealArr[i].dur, 'percent': dealArr[i].dur / value[j].dur * value[j].percent, 'state': 'Running', 'id': i });
break;
} else {
- resList.push({ 'thread': value[j].thread, 'ts': (dealArr[i].ts - timeDur) / multiple, 'count': (value[j].ts + value[j].dur - dealArr[i].ts) * value[j].freq / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].ts + value[j].dur - dealArr[i].ts, 'percent': (value[j].ts + value[j].dur - dealArr[i].ts) / value[j].dur * value[j].percent, 'state': 'Running', 'id': i });
+ resList.push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].ts + value[j].dur - dealArr[i].ts) * value[j].freq / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].ts + value[j].dur - dealArr[i].ts, 'percent': (value[j].ts + value[j].dur - dealArr[i].ts) / value[j].dur * value[j].percent, 'state': 'Running', 'id': i });
+ totalList.get(key).push({ 'thread': value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].ts + value[j].dur - dealArr[i].ts) * value[j].freq / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].ts + value[j].dur - dealArr[i].ts, 'percent': (value[j].ts + value[j].dur - dealArr[i].ts) / value[j].dur * value[j].percent, 'state': 'Running', 'id': i });
}
}
}
@@ -338,7 +350,6 @@ export class TabPaneFreqDataCut extends BaseElement {
item.percent += resList[s].percent;
}
}
- item.percent = Number(item.percent.toFixed(2));
});
// 将cpu数据放置到对应周期层级下
this.mergeCycleData(cycleMap.get(key)[i], cpuMap.get(key));
@@ -350,8 +361,8 @@ export class TabPaneFreqDataCut extends BaseElement {
let processArr = JSON.parse(JSON.stringify(this.processArr));
// 将周期层级防止到线程层级下
this.mergeThreadData(threadArr, cycleMap);
- let totalData = JSON.parse(JSON.stringify(this.originData));
// 将原始数据放置到对应的线程层级下,周期数据前
+ let totalData = this.merge(totalList);
this.mergeTotalData(threadArr, totalData);
// 合并数据到进程层级下
this.mergePidData(processArr, threadArr);
@@ -368,31 +379,27 @@ export class TabPaneFreqDataCut extends BaseElement {
})
} else {
this.threadStatesTbl!.loading = false;
- if(threadIdValue == ''){
+ if (threadIdValue == '') {
threadId.style.border = '1px solid rgb(255,0,0)';
- threadId.setAttribute('placeholder', 'Please input threadId!');
+ threadId.setAttribute('placeholder', 'Please input thread id');
}
- if(threadFuncName == ''){
+ if (threadFuncName == '') {
threadFunc.style.border = '1px solid rgb(255,0,0)';
- threadFunc.setAttribute('placeholder', 'Please input funcName!');
- }
- if(/^[0-9]*$/.test(threadIdValue) == false){
- threadId.style.border = '1px solid rgb(255,0,0)';
- threadId.setAttribute('placeholder', 'Please check the input!');
+ threadFunc.setAttribute('placeholder', 'Please input function name');
}
}
}
// Loop方式切割数据功能
dataLoopCut(threadId: any, threadFunc: any, resultList: any) {
+ 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 (/^[0-9]*$/.test(threadIdValue) && threadIdValue != '' && threadFuncName != '') {
- threadId.style.border = '1px solid rgb(151,151,151)';
- threadFunc.style.border = '1px solid rgb(151,151,151)';
+ if (threadIdValue != '' && threadFuncName != '') {
querySearchFuncData(threadFuncName, Number(threadIdValue), leftNS, rightNS).then(res => {
if (res != null && res.length > 0) {
let targetMap = new Map();
@@ -407,8 +414,10 @@ export class TabPaneFreqDataCut extends BaseElement {
cutArr.push({ 'ts': i.startTime + timeDur });
}
let cycleMap = new Map();
+ let totalList = new Map();
targetMap.forEach((item, key) => {
cycleMap.set(key, new Array());
+ totalList.set(key, new Array());
for (let i = 0; i < cutArr.length - 1; i++) {
let cpuArr = new Array();
let cpuMap = new Map();
@@ -418,30 +427,34 @@ export class TabPaneFreqDataCut extends BaseElement {
// 算力倍数值
const countMutiple = 1000;
cpuMap.set(key, new Array());
- cycleMap.get(key).push({ 'thread': item[0].thread, 'ts': (cutArr[i].ts - timeDur) / multiple, 'count': 0, 'cpu': '', 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
+ cycleMap.get(key).push({ 'thread': '周期' + (i + 1) + '—' + item[0].thread, 'ts': (cutArr[i].ts - timeDur) / multiple, 'count': 0, 'cpu': '', 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
let value = JSON.parse(JSON.stringify(item));
for (let j = 0; j < value.length; j++) {
value[j].ts = value[j].ts * multiple;
- value[j].freq = value[j].freq == 'unknown'? 0 : value[j].freq;
+ 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({ 'thread': value[j].thread, 'count': 0, 'cpu': value[j].cpu, 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
+ cpuMap.get(key).push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': 0, 'cpu': value[j].cpu, 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
}
if (value[j].ts >= cutArr[i].ts) {
if ((value[j].ts + value[j].dur) <= cutArr[i + 1].ts) {
- resList.push({ 'thread': value[j].thread, 'count': (value[j].freq * value[j].dur) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].dur, 'percent': value[j].percent, 'state': 'Running', 'ts': (value[j].ts - timeDur) / multiple, 'id': i });
+ resList.push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * value[j].dur) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].dur, 'percent': value[j].percent, 'state': 'Running', 'id': i });
+ totalList.get(key).push({ 'thread': value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * value[j].dur) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].dur, 'percent': value[j].percent, 'state': 'Running', 'id': i });
} else {
if (cutArr[i + 1].ts - value[j].ts > 0) {
- resList.push({ 'thread': value[j].thread, 'count': (value[j].freq * (cutArr[i + 1].ts - value[j].ts)) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': cutArr[i + 1].ts - value[j].ts, 'percent': value[j].percent * ((cutArr[i + 1].ts - value[j].ts) / value[j].dur), 'state': 'Running', 'ts': (value[j].ts - timeDur) / multiple, 'id': i });
+ resList.push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * (cutArr[i + 1].ts - value[j].ts)) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': cutArr[i + 1].ts - value[j].ts, 'percent': value[j].percent * ((cutArr[i + 1].ts - value[j].ts) / value[j].dur), 'state': 'Running', 'id': i });
+ totalList.get(key).push({ 'thread': value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * (cutArr[i + 1].ts - value[j].ts)) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': cutArr[i + 1].ts - value[j].ts, 'percent': value[j].percent * ((cutArr[i + 1].ts - value[j].ts) / value[j].dur), 'state': 'Running', 'id': i });
break;
}
}
} else {
if ((value[j].ts + value[j].dur) > cutArr[i + 1].ts) {
- resList.push({ 'thread': value[j].thread, 'count': (value[j].freq * (cutArr[i + 1].ts - cutArr[i].ts)) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': cutArr[i + 1].ts - cutArr[i].ts, 'percent': value[j].percent * ((cutArr[i + 1].ts - cutArr[i].ts) / value[j].dur), 'state': 'Running', 'ts': (cutArr[i].ts - timeDur) / multiple, 'id': i });
+ resList.push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * (cutArr[i + 1].ts - cutArr[i].ts)) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': cutArr[i + 1].ts - cutArr[i].ts, 'percent': value[j].percent * ((cutArr[i + 1].ts - cutArr[i].ts) / value[j].dur), 'state': 'Running', 'id': i });
+ totalList.get(key).push({ 'thread': value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * (cutArr[i + 1].ts - cutArr[i].ts)) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': cutArr[i + 1].ts - cutArr[i].ts, 'percent': value[j].percent * ((cutArr[i + 1].ts - cutArr[i].ts) / value[j].dur), 'state': 'Running', 'id': i });
}
if ((value[j].ts + value[j].dur) > cutArr[i].ts && (value[j].ts + value[j].dur) < cutArr[i + 1].ts) {
- resList.push({ 'thread': value[j].thread, 'count': (value[j].freq * (value[j].dur + value[j].ts - cutArr[i].ts)) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].dur + value[j].ts - cutArr[i].ts, 'percent': value[j].percent * ((value[j].dur + value[j].ts - cutArr[i].ts) / value[j].dur), 'state': 'Running', 'ts': (cutArr[i].ts - timeDur) / multiple, 'id': i });
+ resList.push({ 'thread': '周期' + (i + 1) + '—' + value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * (value[j].dur + value[j].ts - cutArr[i].ts)) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].dur + value[j].ts - cutArr[i].ts, 'percent': value[j].percent * ((value[j].dur + value[j].ts - cutArr[i].ts) / value[j].dur), 'state': 'Running', 'id': i });
+ totalList.get(key).push({ 'thread': value[j].thread, 'pid': value[j].pid, 'tid': value[j].tid, 'count': (value[j].freq * (value[j].dur + value[j].ts - cutArr[i].ts)) / countMutiple, 'cpu': value[j].cpu, 'freq': value[j].freq, 'dur': value[j].dur + value[j].ts - cutArr[i].ts, 'percent': value[j].percent * ((value[j].dur + value[j].ts - cutArr[i].ts) / value[j].dur), 'state': 'Running', 'id': i });
}
}
}
@@ -460,7 +473,6 @@ export class TabPaneFreqDataCut extends BaseElement {
item.percent += resList[s].percent;
}
}
- item.percent = Number(item.percent.toFixed(2));
});
// 将cpu数据放置到对应周期层级下
this.mergeCycleData(cycleMap.get(key)[i], cpuMap.get(key));
@@ -469,12 +481,13 @@ export class TabPaneFreqDataCut extends BaseElement {
let threadArr = JSON.parse(JSON.stringify(this.threadArr));
let processArr = JSON.parse(JSON.stringify(this.processArr));
this.mergeThreadData(threadArr, cycleMap);
- let totalData = JSON.parse(JSON.stringify(this.originData));
+ 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!.setStatus(processArr, true);
this.threadStatesTbl!.loading = false;
this.threadClick(processArr);
} else {
@@ -485,55 +498,45 @@ export class TabPaneFreqDataCut extends BaseElement {
})
} else {
this.threadStatesTbl!.loading = false;
- if(threadIdValue == ''){
+ if (threadIdValue == '') {
threadId.style.border = '1px solid rgb(255,0,0)';
- threadId.setAttribute('placeholder', 'Please input threadId!');
+ threadId.setAttribute('placeholder', 'Please input thread id');
}
- if(threadFuncName == ''){
+ if (threadFuncName == '') {
threadFunc.style.border = '1px solid rgb(255,0,0)';
- threadFunc.setAttribute('placeholder', 'Please input funcName!');
- }
- if(/^[0-9]*$/.test(threadIdValue) == false){
- threadId.style.border = '1px solid rgb(255,0,0)';
- threadId.setAttribute('placeholder', 'Please check the input!');
+ threadFunc.setAttribute('placeholder', 'Please input function name');
}
}
}
- mergeFreqData(needDeal: any, cpuMap: any, dealArr: any, sum: number, threadStatesParam: SelectionParam | any) {
+ mergeFreqData(needDeal: any, dealArr: any, sum: number) {
needDeal.forEach((value: any, key: any) => {
let resultList = new Array();
- cpuMap.set(key, new Array());
- let cpuArr = new Array();
// 时间由纳秒转换为秒的倍数
const multiple = 1000000000;
// 算力倍数值
const countMutiple = 1000;
for (let i = 0; i < value.length; i++) {
- if (!cpuArr.includes(value[i].cpu)) {
- cpuArr.push(value[i].cpu);
- cpuMap.get(key).push({ 'process': Utils.PROCESS_MAP.get(value[i].pid) == null ? 'Process ' + value[i].pid : Utils.PROCESS_MAP.get(value[i].pid) + ' ' + value[i].pid, 'thread': value[i].tid + '_' + Utils.THREAD_MAP.get(value[i].tid), 'pid': value[i].pid, 'tid': value[i].tid, 'count': 0, 'cpu': value[i].cpu, 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
- }
for (let j = 0; j < dealArr.length; j++) {
if (value[i].cpu == dealArr[j].cpu) {
if (value[i].ts > dealArr[j].startNS) {
if (value[i].ts < (dealArr[j].startNS + dealArr[j].dur)) {
if (value[i].dur < (dealArr[j].startNS + dealArr[j].dur - value[i].ts)) {
- resultList.push({ 'thread': value[i].tid + '_' + value[i].thread, 'count': (dealArr[j].value * value[i].dur) / countMutiple, 'cpu': value[i].cpu, 'freq': dealArr[j].value, 'dur': value[i].dur, 'percent': value[i].dur / sum * 100, 'state': 'Running', 'ts': value[i].ts / multiple });
+ resultList.push({ 'thread': value[i].thread, 'pid': value[i].pid, 'tid': value[i].tid, 'count': (dealArr[j].value * value[i].dur) / countMutiple, 'cpu': value[i].cpu, 'freq': dealArr[j].value, 'dur': value[i].dur, 'percent': value[i].dur / sum * 100, 'state': 'Running', 'ts': value[i].ts / multiple });
break;
} else {
- resultList.push({ 'thread': value[i].tid + '_' + value[i].thread, 'count': (dealArr[j].value * (dealArr[j].startNS + dealArr[j].dur - value[i].ts)) / countMutiple, 'cpu': value[i].cpu, 'freq': dealArr[j].value, 'dur': (dealArr[j].startNS + dealArr[j].dur - value[i].ts), 'percent': (dealArr[j].startNS + dealArr[j].dur - value[i].ts) / sum * 100, 'state': 'Running', 'ts': value[i].ts / multiple });
+ resultList.push({ 'thread': value[i].thread, 'pid': value[i].pid, 'tid': value[i].tid, 'count': (dealArr[j].value * (dealArr[j].startNS + dealArr[j].dur - value[i].ts)) / countMutiple, 'cpu': value[i].cpu, 'freq': dealArr[j].value, 'dur': (dealArr[j].startNS + dealArr[j].dur - value[i].ts), 'percent': (dealArr[j].startNS + dealArr[j].dur - value[i].ts) / sum * 100, 'state': 'Running', 'ts': value[i].ts / multiple });
}
}
} else {
if ((value[i].ts + value[i].dur) > dealArr[j].startNS) {
if ((value[i].dur + value[i].ts - dealArr[j].startNS) < dealArr[j].dur) {
- resultList.push({ 'thread': value[i].tid + '_' + value[i].thread, 'count': (dealArr[j].value * (value[i].dur + value[i].ts - dealArr[j].startNS)) / countMutiple, 'cpu': value[i].cpu, 'freq': dealArr[j].value, 'dur': (value[i].dur + value[i].ts - dealArr[j].startNS), 'percent': (value[i].dur + value[i].ts - dealArr[j].startNS) / sum * 100, 'state': 'Running', 'ts': dealArr[j].startNS / multiple });
+ resultList.push({ 'thread': value[i].thread, 'pid': value[i].pid, 'tid': value[i].tid, 'count': (dealArr[j].value * (value[i].dur + value[i].ts - dealArr[j].startNS)) / countMutiple, 'cpu': value[i].cpu, 'freq': dealArr[j].value, 'dur': (value[i].dur + value[i].ts - dealArr[j].startNS), 'percent': (value[i].dur + value[i].ts - dealArr[j].startNS) / sum * 100, 'state': 'Running', 'ts': dealArr[j].startNS / multiple });
break;
} else {
- resultList.push({ 'thread': value[i].tid + '_' + value[i].thread, 'count': (dealArr[j].value * dealArr[j].dur) / countMutiple, 'cpu': value[i].cpu, 'freq': dealArr[j].value, 'dur': dealArr[j].dur, 'percent': dealArr[j].dur / sum * 100, 'state': 'Running', 'ts': dealArr[j].startNS / multiple });
+ resultList.push({ 'thread': value[i].thread, 'pid': value[i].pid, 'tid': value[i].tid, 'count': (dealArr[j].value * dealArr[j].dur) / countMutiple, 'cpu': value[i].cpu, 'freq': dealArr[j].value, 'dur': dealArr[j].dur, 'percent': dealArr[j].dur / sum * 100, 'state': 'Running', 'ts': dealArr[j].startNS / multiple });
}
} else {
- resultList.push({ 'thread': value[i].tid + '_' + value[i].thread, 'count': 0, 'cpu': value[i].cpu, 'freq': 'unknown', 'dur': value[i].dur, 'percent': value[i].dur / sum * 100, 'state': 'Running', 'ts': value[i].ts / multiple });
+ resultList.push({ 'thread': value[i].thread, 'pid': value[i].pid, 'tid': value[i].tid, 'count': 0, 'cpu': value[i].cpu, 'freq': 'unknown', 'dur': value[i].dur, 'percent': value[i].dur / sum * 100, 'state': 'Running', 'ts': value[i].ts / multiple });
break;
}
}
@@ -541,41 +544,8 @@ export class TabPaneFreqDataCut extends BaseElement {
}
}
this.initData.set(key, JSON.parse(JSON.stringify(resultList)));
- //合并同一线程内,当运行所在cpu和频点相同时,dur及percent进行累加求和,或许可以进行算法优化
- for (let i = 0; i < resultList.length; i++) {
- for (let j = i + 1; j < resultList.length; j++) {
- if (resultList[i].cpu == resultList[j].cpu && resultList[i].freq == resultList[j].freq) {
- resultList[i].dur += resultList[j].dur;
- resultList[i].percent += resultList[j].percent;
- resultList[i].count += resultList[j].count;
- resultList.splice(j, 1);
- j--;
- }
- }
- resultList[i].percent = Number((resultList[i].percent).toFixed(2));
- resultList[i].ts = (resultList[i].ts * 1000000000 - threadStatesParam.recordStartNs) / 1000000000;
- }
- resultList.sort((a, b) => b.count - a.count);
- cpuMap.get(key).sort((a: any, b: any) => a.cpu - b.cpu);
- needDeal.set(key, resultList);
})
}
- mergeCpuData(cpuMap: any, needDeal: any) {
- cpuMap.forEach((value: any, key: any) => {
- let arr = needDeal.get(key);
- for (let i = 0; i < value.length; i++) {
- for (let j = 0; j < arr.length; j++) {
- if (arr[j].cpu == value[i].cpu) {
- value[i].children.push(arr[j]);
- value[i].count += arr[j].count;
- value[i].dur += arr[j].dur;
- value[i].percent += arr[j].percent;
- }
- }
- value[i].percent = Number(value[i].percent.toFixed(2));
- }
- });
- }
mergeThreadData(threadArr: any, cpuMap: any) {
for (let i = 0; i < threadArr.length; i++) {
let cpuMapData = cpuMap.get(threadArr[i].pid + '_' + threadArr[i].tid);
@@ -585,7 +555,6 @@ export class TabPaneFreqDataCut extends BaseElement {
threadArr[i].dur += cpuMapData[j].dur;
threadArr[i].percent += cpuMapData[j].percent;
}
- threadArr[i].percent = Number(threadArr[i].percent.toFixed(2));
}
}
mergePidData(pidArr: any, threadArr: any) {
@@ -598,7 +567,6 @@ export class TabPaneFreqDataCut extends BaseElement {
pidArr[i].percent += threadArr[j].percent;
}
}
- pidArr[i].percent = Number(pidArr[i].percent.toFixed(2));
}
}
mergeData(resList: any) {
@@ -613,7 +581,6 @@ export class TabPaneFreqDataCut extends BaseElement {
j--;
}
}
- resList[i].percent = Number((resList[i].percent).toFixed(2));
}
}
mergeCycleData(obj: any, arr: any) {
@@ -626,7 +593,6 @@ export class TabPaneFreqDataCut extends BaseElement {
obj.dur += arr[i].dur;
obj.percent += arr[i].percent;
}
- obj.percent = Number(obj.percent.toFixed(2));
}
mergeTotalData(threadArr: any, totalData: any) {
for (let i = 0; i < threadArr.length; i++) {
@@ -638,14 +604,53 @@ export class TabPaneFreqDataCut extends BaseElement {
}
}
}
- fixedDeal(arr: any){
- if(arr == undefined){
- return ;
+ fixedDeal(arr: any) {
+ if (arr == undefined) {
+ return;
}
- for(let i = 0; i < arr.length; i++){
+ for (let i = 0; i < arr.length; i++) {
arr[i].percent = arr[i].percent.toFixed(2);
arr[i].percent = arr[i].percent > 100 ? 100 : arr[i].percent;
this.fixedDeal(arr[i].children);
}
}
+ merge(totalList: any) {
+ let result = new Array();
+ totalList.forEach((value: any, key: any) => {
+ let countNum = result.push({ 'thread': '', 'pid': key.split('_')[0], 'tid': key.split('_')[1], 'count': 0, 'cpu': '', 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
+ let cpuArr = new Array();
+ let flagArr = new Array();
+ for (let i = 0; i < value.length; i++) {
+ if (!flagArr.includes(value[i].cpu)) {
+ flagArr.push(value[i].cpu);
+ let flag = cpuArr.push({ 'thread': value[i].thread, 'pid': value[i].pid, 'tid': value[i].tid, 'count': 0, 'cpu': value[i].cpu, 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
+ 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;
+ }
+ }
+ result[countNum - 1].dur += cpuArr[i].dur;
+ result[countNum - 1].count += cpuArr[i].count;
+ result[countNum - 1].percent += cpuArr[i].percent;
+ }
+ });
+ return result;
+ }
}
\ No newline at end of file
diff --git a/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqUsage.ts b/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqUsage.ts
index 288916582cf51c05b39e6c574ed092c5308c3da3..7a4f321b44c5eed59cd79e3f2dad15ab1a7af0b2 100644
--- a/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqUsage.ts
+++ b/ide/src/trace/component/trace/sheet/frequsage/TabPaneFreqUsage.ts
@@ -74,6 +74,14 @@ export class TabPaneFreqUsage extends BaseElement {
threadArr.push({ 'process': Utils.PROCESS_MAP.get(e.pid) == null ? 'Process ' + e.pid : Utils.PROCESS_MAP.get(e.pid) + ' ' + e.pid, 'thread': Utils.THREAD_MAP.get(e.tid) + ' ' + e.tid, 'pid': e.pid, 'tid': e.tid, 'count': 0, 'cpu': '', 'freq': '', 'dur': 0, 'percent': 0, 'state': 'Running', children: new Array() });
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 arr = needDeal.get(e.pid + '_' + e.tid);
let process = Utils.PROCESS_MAP.get(e.pid);
let thread = Utils.THREAD_MAP.get(e.tid);
@@ -184,7 +192,6 @@ export class TabPaneFreqUsage extends BaseElement {
j--;
}
}
- resultList[i].percent = Number((resultList[i].percent).toFixed(2));
resultList[i].ts = resultList[i].ts - threadStatesParam.recordStartNs;
}
resultList.sort((a, b) => b.count - a.count);
@@ -204,7 +211,6 @@ export class TabPaneFreqUsage extends BaseElement {
value[i].percent += arr[j].percent;
}
}
- value[i].percent = Number(value[i].percent.toFixed(2));
}
});
}
@@ -217,7 +223,6 @@ export class TabPaneFreqUsage extends BaseElement {
threadArr[i].dur += cpuMapData[j].dur;
threadArr[i].percent += cpuMapData[j].percent;
}
- threadArr[i].percent = Number(threadArr[i].percent.toFixed(2));
}
}
mergePidData(pidArr: any, threadArr: any) {
@@ -230,7 +235,6 @@ export class TabPaneFreqUsage extends BaseElement {
pidArr[i].percent += threadArr[j].percent;
}
}
- pidArr[i].percent = Number(pidArr[i].percent.toFixed(2));
}
}
fixedDeal(arr: any) {
diff --git a/ide/src/trace/database/SqlLite.ts b/ide/src/trace/database/SqlLite.ts
index a1090c5549b7a750b59bf9f8a76f5fc048e59119..767d4ac698bbee8038ca2a521a0cef984b94b6be 100644
--- a/ide/src/trace/database/SqlLite.ts
+++ b/ide/src/trace/database/SqlLite.ts
@@ -5517,8 +5517,7 @@ export const getTabRunningPercent = (tIds: Array
, leftNS: number, rightN
and
not ((B.ts - TR.start_ts + ifnull(B.dur,0) < ${leftNS}) or (B.ts - TR.start_ts > ${rightNS}))
order by ts
- `,
- { $leftNS: leftNS, $rightNS: rightNS }
+ `
);
export const querySearchFuncData = (funcName: string, tIds: number, leftNS: number, rightNS: number): Promise> =>