blob: 07de9a975991780a91ac7a0520e64f8e52fe6891 [file] [log] [blame]
package org.eclipse.dltk.core;
import static org.eclipse.core.runtime.Platform.getDebugOption;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;
import org.eclipse.dltk.core.environment.IEnvironment;
public class RuntimePerformanceMonitor {
public static final String IOREAD = "IO Read";
public static final String IOWRITE = "IO Write";
/**
* TODO (alex) This field was never used, remove in 6.0
*/
@Deprecated
public static boolean RUNTIME_PERFORMANCE = true;
private static volatile boolean active = Boolean
.valueOf(getDebugOption("org.eclipse.dltk.core/performanceMonitor")) //$NON-NLS-1$
.booleanValue();
/**
* @since 5.1
*/
public static boolean isActive() {
return active;
}
/**
* @since 5.1
*/
public static void setActive(boolean value) {
active = value;
}
public static class DataEntry {
long count = 0;
long total = 0;
long time = 0;
public long getCount() {
return count;
}
public long getTotal() {
return total;
}
public long getTime() {
return time;
}
}
private static final Map<String, Map<String, DataEntry>> entries = new HashMap<>();
/**
* @noreference This method is not intended to be referenced by clients.
*/
public static synchronized void updateData(String language, String kind,
long time, long value) {
Map<String, DataEntry> attrs = internalGetEntries(language);
DataEntry entry = attrs.get(kind);
if (entry == null) {
entry = new DataEntry();
attrs.put(kind, entry);
}
entry.count++;
entry.total += value;
entry.time += time;
}
/**
* @noreference This method is not intended to be referenced by clients.
*/
public static synchronized void updateData(String language, String kind,
long time, long value, IEnvironment env) {
if (env != null) {
updateData(language, kind + " " + env.getName(), time, value);
}
updateData(language, kind, time, value);
}
private static synchronized Map<String, DataEntry> internalGetEntries(
String language) {
Map<String, DataEntry> attrs = entries.get(language);
if (attrs == null) {
attrs = new HashMap<>();
entries.put(language, attrs);
}
return attrs;
}
public static Map<String, DataEntry> getEntries(String language) {
Map<String, DataEntry> copy = new HashMap<>();
Map<String, DataEntry> map = internalGetEntries(language);
for (Map.Entry<String, DataEntry> i : map.entrySet()) {
DataEntry value = i.getValue();
DataEntry decopy = new DataEntry();
decopy.count = value.count;
decopy.total = value.total;
decopy.time = value.time;
copy.put(i.getKey(), decopy);
}
return copy;
}
public static Map<String, Map<String, DataEntry>> getAllEntries() {
final Set<String> keySet;
synchronized (RuntimePerformanceMonitor.class) {
keySet = new HashSet<>(entries.keySet());
}
Map<String, Map<String, DataEntry>> result = new HashMap<>();
for (String key : keySet) {
result.put(key, getEntries(key));
}
return result;
}
public static class PerformanceNode {
private long start;
private long end;
public long done() {
end = System.currentTimeMillis();
return get();
}
public long get() {
return end - start;
}
public void renew() {
start = System.currentTimeMillis();
}
public void done(String natureId, String string, long value) {
RuntimePerformanceMonitor.updateData(natureId, string, done(),
value);
}
public void done(String natureId, String kind, long value,
IEnvironment environment) {
RuntimePerformanceMonitor.updateData(natureId, kind, done(), value,
environment);
}
}
private static final class DummyPerformanceNode extends PerformanceNode {
@Override
public long done() {
// empty
return 0;
}
@Override
public void renew() {
// empty
}
@Override
public void done(String natureId, String kind, long value,
IEnvironment environment) {
// empty
}
@Override
public void done(String natureId, String string, long value) {
// empty
}
}
private static final DummyPerformanceNode dummyNode = new DummyPerformanceNode();
public static PerformanceNode begin() {
if (!active) {
return dummyNode;
}
PerformanceNode node = new PerformanceNode();
node.renew();
return node;
}
public static synchronized void clear() {
entries.clear();
}
}