final double percent = scanPercentage / 100d;
StopWatch watchdog = new StopWatch("nthreads: " + threads + ", capacity: " + capacity
+ ", scanPercentage: " + percent + ", scanLength: " + scanLength + ", pageSize: "
+ pageSize);
final FixedSegments pager = makeTempSegments(pageSize);
final Status[] stats = new Status[threads];
final ReadWriteLock rwlock = new FairReadWriteLock();//new ReentrantReadWriteLock();
_start = _stop = false;
final Thread[] thrs = new Thread[threads];
for(int i = 0; i < threads; i++) {
final int threadId = i;
final Status stat = new Status();
stats[i] = stat;
thrs[i] = new Thread() {
public void run() {
while(!_start) {
// Spin till Time To Go
try {
Thread.sleep(1);
} catch (Exception e) {
}
}
try {
if(lock == null) {
if(useRWlock) {
runBenchmarkWithZipfDistributionReadWriteLock(rwlock, stat, pager, cache, capacity, round, percent, scanLength, dist[threadId]);
} else {
runBenchmarkWithZipfDistributionSync(stat, pager, cache, capacity, round, percent, scanLength, dist[threadId]);
}
} else {
runBenchmarkWithZipfDistributionLock(stat, lock, pager, cache, capacity, round, percent, scanLength, dist[threadId]);
}
} catch (Throwable e) {
e.printStackTrace();
}
}
};
}
// Run threads
for(int i = 0; i < threads; i++) {
thrs[i].start();
}
_start = true;
try {
Thread.sleep(TIME_TO_EST);
} catch (InterruptedException e) {
}
_stop = true;
for(int i = 0; i < threads; i++) {
thrs[i].join();
}
long numOps = 0L, cacheMisses = 0L, elapsed = 0L, execInterval = 0L, durationHold = 0L;
for(int i = 0; i < threads; i++) {
numOps += stats[i].ops;
cacheMisses += stats[i].miss;
elapsed += stats[i].mills;
execInterval += stats[i].execInterval;
durationHold += stats[i].durationHold;
}
long avgElapsedInSec = (elapsed / threads) / 1000L;
long opsPerSec = numOps / avgElapsedInSec;
long hit = numOps - cacheMisses;
double hitRatio = ((double) hit) / numOps;
double missRatio = ((double) cacheMisses) / numOps;
System.err.println("["
+ algo
+ " - "
+ filename
+ "] synchronization: "
+ (lock == null ? (useRWlock ? "readWrite" : "sync")
: ((lock instanceof NoopLock) ? "non-blocking" : "spinlock")) + ", read: "
+ numOps + ", miss: " + cacheMisses + ", hit ratio: " + hitRatio + ", miss ratio: "
+ missRatio);
System.err.println(watchdog.toString());
System.err.println("number of ops: " + numOps + ", average number of ops per second: "
+ opsPerSec + ", total execution interval(msec): " + execInterval
+ ", total duration hold(msec): " + durationHold);
System.err.flush();
pager.close();
}