NanoScheduler tracks time outside of its execute call

This commit is contained in:
Mark DePristo 2012-09-02 10:54:18 -04:00
parent 800a27c3a7
commit 59109d5eeb
1 changed files with 19 additions and 6 deletions

View File

@ -54,6 +54,7 @@ public class NanoScheduler<InputType, MapType, ReduceType> {
boolean shutdown = false; boolean shutdown = false;
boolean debug = false; boolean debug = false;
final SimpleTimer outsideSchedulerTimer = new SimpleTimer();
final SimpleTimer inputTimer = new SimpleTimer(); final SimpleTimer inputTimer = new SimpleTimer();
final SimpleTimer mapTimer = new SimpleTimer(); final SimpleTimer mapTimer = new SimpleTimer();
final SimpleTimer reduceTimer = new SimpleTimer(); final SimpleTimer reduceTimer = new SimpleTimer();
@ -72,6 +73,9 @@ public class NanoScheduler<InputType, MapType, ReduceType> {
this.bufferSize = bufferSize; this.bufferSize = bufferSize;
this.nThreads = nThreads; this.nThreads = nThreads;
this.executor = nThreads == 1 ? null : Executors.newFixedThreadPool(nThreads); this.executor = nThreads == 1 ? null : Executors.newFixedThreadPool(nThreads);
// start timing the time spent outside of the nanoScheduler
outsideSchedulerTimer.start();
} }
/** /**
@ -98,6 +102,8 @@ public class NanoScheduler<InputType, MapType, ReduceType> {
* After this call, execute cannot be invoked without throwing an error * After this call, execute cannot be invoked without throwing an error
*/ */
public void shutdown() { public void shutdown() {
outsideSchedulerTimer.stop();
if ( executor != null ) { if ( executor != null ) {
final List<Runnable> remaining = executor.shutdownNow(); final List<Runnable> remaining = executor.shutdownNow();
if ( ! remaining.isEmpty() ) if ( ! remaining.isEmpty() )
@ -106,14 +112,16 @@ public class NanoScheduler<InputType, MapType, ReduceType> {
shutdown = true; shutdown = true;
if (TIME_CALLS) { if (TIME_CALLS) {
printTimerInfo("Input time", inputTimer); printTimerInfo("Input time", inputTimer);
printTimerInfo("Map time", mapTimer); printTimerInfo("Map time", mapTimer);
printTimerInfo("Reduce time", reduceTimer); printTimerInfo("Reduce time", reduceTimer);
printTimerInfo("Outside time", outsideSchedulerTimer);
} }
} }
private void printTimerInfo(final String label, final SimpleTimer timer) { private void printTimerInfo(final String label, final SimpleTimer timer) {
final double total = inputTimer.getElapsedTime() + mapTimer.getElapsedTime() + reduceTimer.getElapsedTime(); final double total = inputTimer.getElapsedTime() + mapTimer.getElapsedTime()
+ reduceTimer.getElapsedTime() + outsideSchedulerTimer.getElapsedTime();
final double myTimeInSec = timer.getElapsedTime(); final double myTimeInSec = timer.getElapsedTime();
final double myTimePercent = myTimeInSec / total * 100; final double myTimePercent = myTimeInSec / total * 100;
logger.info(String.format("%s: %s (%5.2f%%)", label, new AutoFormattingTime(myTimeInSec), myTimePercent)); logger.info(String.format("%s: %s (%5.2f%%)", label, new AutoFormattingTime(myTimeInSec), myTimePercent));
@ -168,11 +176,16 @@ public class NanoScheduler<InputType, MapType, ReduceType> {
if ( map == null ) throw new IllegalArgumentException("map function cannot be null"); if ( map == null ) throw new IllegalArgumentException("map function cannot be null");
if ( reduce == null ) throw new IllegalArgumentException("reduce function cannot be null"); if ( reduce == null ) throw new IllegalArgumentException("reduce function cannot be null");
outsideSchedulerTimer.stop();
ReduceType result;
if ( ALLOW_SINGLE_THREAD_FASTPATH && getnThreads() == 1 ) { if ( ALLOW_SINGLE_THREAD_FASTPATH && getnThreads() == 1 ) {
return executeSingleThreaded(inputReader, map, initialValue, reduce); result = executeSingleThreaded(inputReader, map, initialValue, reduce);
} else { } else {
return executeMultiThreaded(inputReader, map, initialValue, reduce); result = executeMultiThreaded(inputReader, map, initialValue, reduce);
} }
outsideSchedulerTimer.restart();
return result;
} }
/** /**