/*******************************************************************************
* Copyright (c) 2009,2015 QNX Software Systems
* All rights reserved. This program and the accompanying materials
* are made available under the terms of the Eclipse Public License v1.0
* which accompanies this distribution, and is available at
* http://www.eclipse.org/legal/epl-v10.html
*
* Contributors:
* QNX Software Systems (Alena Laskavaia) - initial API and implementation
*******************************************************************************/
package org.eclipse.cdt.codan.internal.core;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
/**
* Class to collect time states for checkers runs
*/
public class CheckersTimeStats {
public static final String ALL = "ALL"; //$NON-NLS-1$
public static final String ELAPSED = "ELAPSED"; //$NON-NLS-1$
private static CheckersTimeStats instance = new CheckersTimeStats();
private boolean enableStats = false;
/**
* @return global instance of stats
*/
public static CheckersTimeStats getInstance() {
return instance;
}
private static class TimeRecord {
private long duration;
private long current;
private int count;
public void start() {
current = System.currentTimeMillis();
}
public void stop() {
count++;
duration += System.currentTimeMillis() - current;
current = 0;
}
@Override
public String toString() {
return String.format("%4d %4d %4.2f", duration, count, count == 0 ? count : (duration / (float) count)); //$NON-NLS-1$
}
public String toString(long total) {
float ave = count == 0 ? count : (duration / (float) count);
float per = total == 0 ? 100f : (duration * 100 / (float) total);
return String.format("%4d %4d %4.2f %4.2f%%", duration, count, ave, per); //$NON-NLS-1$
}
}
private Map<String, TimeRecord> records = new HashMap<String, TimeRecord>();
/**
* @param id - checker id
* @return
*/
private TimeRecord getTimeRecord(String id) {
TimeRecord record = records.get(id);
if (record == null) {
record = new TimeRecord();
records.put(id, record);
}
return record;
}
/**
* Start measuring elapsed time for checker with given id
*
* @param id
*/
public void checkerStart(String id) {
checkerStart(id, ELAPSED);
}
/**
* Start measuring elapsed time for checker with given id and counter
*
* @param id
* @param counter
*/
public void checkerStart(String id, String counter) {
if (enableStats) {
TimeRecord record = getTimeRecord(getKey(id, counter));
record.start();
}
}
private String getKey(String id, String counter) {
return id + ":" + counter; //$NON-NLS-1$
}
/**
* @param id
* @param counter
*/
public void checkerStop(String id, String counter) {
if (enableStats) {
getTimeRecord(getKey(id, counter)).stop();
}
}
/**
* @param id
*/
public void checkerStop(String id) {
checkerStop(id, ELAPSED);
}
/**
* Print checker stats to stdout if tracing enabled
*/
public void traceStats() {
if (enableStats) {
printStats();
}
}
/**
*
*/
public void printStats() {
System.out.println("---"); //$NON-NLS-1$
String totalId = getKey(ALL, ELAPSED);
TimeRecord all = records.get(totalId);
for (Iterator<String> iterator = records.keySet().iterator(); iterator.hasNext();) {
String id = iterator.next();
if (id.equals(totalId))
continue;
TimeRecord timeRecord = getTimeRecord(id);
System.out.println(timeRecord.toString(all.duration) + " " + id); //$NON-NLS-1$
}
System.out.println(all.toString() + " " + totalId); //$NON-NLS-1$
}
/**
*
*/
public void reset() {
records.clear();
}
/**
* @return true is stats collection is enabled
*/
public boolean isEnabled() {
return enableStats;
}
/**
* @param set to true to enable stats collection and false to disable
*/
public void setEnabled(boolean enableStats) {
this.enableStats = enableStats;
}
}