|
6 | 6 | import java.awt.Paint; |
7 | 7 | import java.io.File; |
8 | 8 | import java.io.IOException; |
| 9 | +import java.util.Arrays; |
9 | 10 | import java.util.Iterator; |
10 | 11 | import java.util.SortedSet; |
| 12 | +import java.util.TreeSet; |
11 | 13 |
|
12 | 14 | import javax.swing.SwingWorker; |
13 | 15 |
|
@@ -411,39 +413,78 @@ public float[][] GetUsageData(int pnum, long begintime, |
411 | 413 | return u.usage(pnum, begintime, endtime, getVersion() ); |
412 | 414 | } |
413 | 415 | int numUserEntries=getSts().getEntryCount(); |
414 | | - long[][] data; |
415 | | - long[][] phasedata; |
416 | | - |
| 416 | + long[] data; |
| 417 | + float ret[][] = new float[2][numUserEntries + 4]; |
| 418 | + |
417 | 419 | /*BAD: silently ignores begintime and endtime*/ |
418 | 420 | if( sumAnalyzer.getPhaseCount()>1 ) { |
419 | 421 | Iterator<Integer> iter = phases.iterator(); |
420 | | - data = sumAnalyzer.getPhaseChareTime(iter.next()); |
| 422 | + data = sumAnalyzer.getPhaseChareTime(iter.next())[pnum].clone(); |
421 | 423 |
|
422 | 424 | while (iter.hasNext() && pnum > -1) |
423 | 425 | { |
424 | | - phasedata = sumAnalyzer.getPhaseChareTime(iter.next()); |
| 426 | + long[] phasedata = sumAnalyzer.getPhaseChareTime(iter.next())[pnum]; |
425 | 427 | { |
426 | 428 | for(int q=0; q<numUserEntries; q++) { |
427 | | - data[pnum][q] += phasedata[pnum][q]; |
428 | | - } |
| 429 | + data[q] += phasedata[q]; |
| 430 | + } |
429 | 431 | } |
430 | 432 | } |
431 | | - } else { |
432 | | - data = sumAnalyzer.getChareTime(); |
433 | | - } |
434 | | - float ret[][]=new float[2][numUserEntries+4]; |
435 | | - //Convert to percent-- .sum entries are always over the |
436 | | - // entire program run. |
437 | | - double scale=100.0/getTotalTime(); |
438 | | - for (int q=0;q<numUserEntries;q++){ |
439 | | - ret[0][q]=(float)(scale*data[pnum][q]); |
440 | | - // dummy value for message send time at the moment .. |
441 | | - // summary file reader needs to be fixed first |
442 | | - ret[1][q] = (float )0.0; |
443 | | - } |
444 | | - return ret; |
445 | | - } |
446 | | - |
| 433 | + } |
| 434 | + else if (hasSumDetailFiles()) { |
| 435 | + SortedSet<Integer> peSet = new TreeSet<>(); |
| 436 | + peSet.add(pnum); |
| 437 | + |
| 438 | + double intervalSize = intervalData.getIntervalSize(); |
| 439 | + int intervalStart = (int) (begintime / intervalSize); |
| 440 | + int intervalEnd = (int) Math.ceil(endtime / intervalSize) - 1; |
| 441 | + int numIntervals = intervalEnd - intervalStart + 1; |
| 442 | + |
| 443 | + MainWindow.runObject[0].LoadGraphData((long) intervalData.getIntervalSize(), |
| 444 | + intervalStart, |
| 445 | + intervalEnd, false, peSet); |
| 446 | + |
| 447 | + int sumDetailData[][] = intervalData.sumDetailData(); |
| 448 | + data = new long[numUserEntries]; |
| 449 | + for (int interval = 0; interval < numIntervals; interval++) { |
| 450 | + for (int entry = 0; entry < numUserEntries; entry++) { |
| 451 | + data[entry] += sumDetailData[interval][entry]; |
| 452 | + } |
| 453 | + } |
| 454 | + } |
| 455 | + else if (hasSumFiles()) { |
| 456 | + // The log has per-EP times across the entire execution, so use that when the whole interval is selected |
| 457 | + if (endtime - begintime == totalTime) { |
| 458 | + data = sumAnalyzer.getChareTime()[pnum]; |
| 459 | + } |
| 460 | + // Otherwise, the best we can do is to use the utilization data without EP info |
| 461 | + else { |
| 462 | + long total = 0; |
| 463 | + byte utilData[][] = sumAnalyzer.getProcessorUtilization(); |
| 464 | + int intervalStart = (int) (begintime / getSummaryIntervalSize()); |
| 465 | + int intervalEnd = (int) Math.ceil(endtime / getSummaryIntervalSize()) - 1; |
| 466 | + for (int i = intervalStart; i <= intervalEnd; i++) { |
| 467 | + total += utilData[pnum][i]; |
| 468 | + } |
| 469 | + // Processor utilization data is already in terms of percent, so return it directly after averaging over the |
| 470 | + // intervals rather than proceeding to the time -> percent conversion at the end of this function |
| 471 | + ret[0][0] = ((float) total) / (intervalEnd - intervalStart + 1); |
| 472 | + return ret; |
| 473 | + } |
| 474 | + } |
| 475 | + else { |
| 476 | + return null; |
| 477 | + } |
| 478 | + // Convert to percent |
| 479 | + double scale = 100.0 / (endtime - begintime); |
| 480 | + for (int q = 0; q < numUserEntries; q++) { |
| 481 | + ret[0][q] = (float) (scale * data[q]); |
| 482 | + // dummy value for message send time at the moment |
| 483 | + // summary file reader needs to be fixed first |
| 484 | + ret[1][q] = (float) 0.0; |
| 485 | + } |
| 486 | + return ret; |
| 487 | + } |
447 | 488 | // // a == entry point index, t == type of data |
448 | 489 | // public int[][] getUserEntryData( int a, int t ) { |
449 | 490 | // return userEntryData[ a ][ t ]; |
|
0 commit comments