Skip to content

Commit 63f56e0

Browse files
authored
Add performance monitoring (CPU and memory usage) functionality to Monitor (#203)
1 parent 7243cea commit 63f56e0

File tree

12 files changed

+378
-43
lines changed

12 files changed

+378
-43
lines changed

src/main/java/pascal/taie/Main.java

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,8 @@
3535
import pascal.taie.config.PlanConfig;
3636
import pascal.taie.config.Scope;
3737
import pascal.taie.frontend.cache.CachedWorldBuilder;
38+
import pascal.taie.util.Monitor;
3839
import pascal.taie.util.RuntimeInfoLogger;
39-
import pascal.taie.util.Timer;
4040
import pascal.taie.util.collection.Lists;
4141

4242
import java.io.InputStream;
@@ -49,7 +49,7 @@ public class Main {
4949
private static final Logger logger = LogManager.getLogger(Main.class);
5050

5151
public static void main(String... args) {
52-
Timer.runAndCount(() -> {
52+
Monitor.runAndCount(() -> {
5353
Options options = processArgs(args);
5454
LoggerConfigs.setOutput(options.getOutputDir());
5555
RuntimeInfoLogger.logRuntimeInfo();
@@ -123,7 +123,7 @@ public static void buildWorld(String... args) {
123123
}
124124

125125
private static void buildWorld(Options options, List<AnalysisConfig> analyses) {
126-
Timer.runAndCount(() -> {
126+
Monitor.runAndCount(() -> {
127127
try {
128128
Class<? extends WorldBuilder> builderClass = options.getWorldBuilderClass();
129129
Constructor<? extends WorldBuilder> builderCtor = builderClass.getConstructor();

src/main/java/pascal/taie/analysis/AnalysisManager.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@
3636
import pascal.taie.language.classes.JClass;
3737
import pascal.taie.language.classes.JMethod;
3838
import pascal.taie.util.AnalysisException;
39-
import pascal.taie.util.Timer;
39+
import pascal.taie.util.Monitor;
4040
import pascal.taie.util.graph.SimpleGraph;
4141

4242
import java.lang.reflect.Constructor;
@@ -100,7 +100,7 @@ public void execute() {
100100
methodScope = null;
101101
// execute analyses
102102
plan.analyses().forEach(config -> {
103-
Analysis analysis = Timer.runAndCount(
103+
Analysis analysis = Monitor.runAndCount(
104104
() -> runAnalysis(config), config.getId(), Level.INFO);
105105
if (!keepAllResults) {
106106
executedAnalyses.add(analysis);

src/main/java/pascal/taie/analysis/pta/PointerAnalysis.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@
5555
import pascal.taie.config.AnalysisOptions;
5656
import pascal.taie.config.ConfigException;
5757
import pascal.taie.util.AnalysisException;
58-
import pascal.taie.util.Timer;
58+
import pascal.taie.util.Monitor;
5959

6060
import java.lang.reflect.Constructor;
6161
import java.lang.reflect.InvocationTargetException;
@@ -85,15 +85,15 @@ public PointerAnalysisResult analyze() {
8585
PointerAnalysisResult preResult = runAnalysis(heapModel,
8686
ContextSelectorFactory.makeCISelector());
8787
if (advanced.startsWith("scaler")) {
88-
selector = Timer.runAndCount(() -> ContextSelectorFactory
88+
selector = Monitor.runAndCount(() -> ContextSelectorFactory
8989
.makeGuidedSelector(Scaler.run(preResult, advanced)),
9090
"Scaler", Level.INFO);
9191
} else if (advanced.startsWith("zipper")) {
92-
selector = Timer.runAndCount(() -> ContextSelectorFactory
92+
selector = Monitor.runAndCount(() -> ContextSelectorFactory
9393
.makeSelectiveSelector(cs, Zipper.run(preResult, advanced)),
9494
"Zipper", Level.INFO);
9595
} else if (advanced.equals("mahjong")) {
96-
heapModel = Timer.runAndCount(() -> Mahjong.run(preResult, options),
96+
heapModel = Monitor.runAndCount(() -> Mahjong.run(preResult, options),
9797
"Mahjong", Level.INFO);
9898
} else {
9999
throw new IllegalArgumentException(

src/main/java/pascal/taie/analysis/pta/plugin/AnalysisTimer.java

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@
2525
import org.apache.logging.log4j.LogManager;
2626
import org.apache.logging.log4j.Logger;
2727
import pascal.taie.analysis.Analysis;
28-
import pascal.taie.util.Timer;
28+
import pascal.taie.util.Monitor;
2929

3030
/**
3131
* Records the elapsed time of pointer analysis.
@@ -34,17 +34,17 @@ public class AnalysisTimer implements Plugin {
3434

3535
private static final Logger logger = LogManager.getLogger(Analysis.class);
3636

37-
private Timer ptaTimer;
37+
private Monitor ptaMonitor;
3838

3939
@Override
4040
public void onStart() {
41-
ptaTimer = new Timer("Pointer analysis");
42-
ptaTimer.start();
41+
ptaMonitor = new Monitor("Pointer analysis");
42+
ptaMonitor.start();
4343
}
4444

4545
@Override
4646
public void onFinish() {
47-
ptaTimer.stop();
48-
logger.info(ptaTimer);
47+
ptaMonitor.stop();
48+
logger.info(ptaMonitor);
4949
}
5050
}

src/main/java/pascal/taie/analysis/pta/plugin/taint/TaintAnalysis.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@
4141
import pascal.taie.language.classes.JMethod;
4242
import pascal.taie.language.type.TypeSystem;
4343
import pascal.taie.util.AnalysisException;
44-
import pascal.taie.util.Timer;
44+
import pascal.taie.util.Monitor;
4545

4646
import javax.annotation.Nullable;
4747
import java.io.File;
@@ -251,7 +251,7 @@ private void reportTaintFlows() {
251251
taintFlows.forEach(logger::info);
252252
solver.getResult().storeResult(getClass().getName(), taintFlows);
253253
TaintManager manager = context.manager();
254-
Timer.runAndCount(() -> new TFGDumper().dump(
254+
Monitor.runAndCount(() -> new TFGDumper().dump(
255255
new TFGBuilder(solver.getResult(), taintFlows, manager).build(),
256256
new File(World.get().getOptions().getOutputDir(), TAINT_FLOW_GRAPH_FILE)),
257257
"TFGDumper");

src/main/java/pascal/taie/analysis/pta/toolkit/mahjong/Mahjong.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import pascal.taie.analysis.pta.core.heap.Obj;
2929
import pascal.taie.config.AnalysisOptions;
3030
import pascal.taie.language.type.Type;
31-
import pascal.taie.util.Timer;
31+
import pascal.taie.util.Monitor;
3232
import pascal.taie.util.collection.Maps;
3333
import pascal.taie.util.collection.UnionFindSet;
3434

@@ -55,12 +55,12 @@ public static HeapModel run(PointerAnalysisResult pta,
5555

5656
HeapModel buildHeapModel(PointerAnalysisResult pta,
5757
AnalysisOptions options) {
58-
FieldPointsToGraph fpg = Timer.runAndCount(
58+
FieldPointsToGraph fpg = Monitor.runAndCount(
5959
() -> new FieldPointsToGraph(pta),
6060
"Building field points-to graph", Level.INFO);
61-
dfaFactory = Timer.runAndCount(() -> new DFAFactory(fpg),
61+
dfaFactory = Monitor.runAndCount(() -> new DFAFactory(fpg),
6262
"Building DFA", Level.INFO);
63-
UnionFindSet<Obj> uf = Timer.runAndCount(
63+
UnionFindSet<Obj> uf = Monitor.runAndCount(
6464
() -> mergeTypeConsistentObjects(fpg),
6565
"Merging type-consistent objects", Level.INFO);
6666
// build resulting heap model based on merge map

src/main/java/pascal/taie/analysis/pta/toolkit/zipper/Zipper.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,8 +37,8 @@
3737
import pascal.taie.ir.stmt.New;
3838
import pascal.taie.language.classes.JMethod;
3939
import pascal.taie.language.type.Type;
40+
import pascal.taie.util.Monitor;
4041
import pascal.taie.util.MutableInt;
41-
import pascal.taie.util.Timer;
4242
import pascal.taie.util.collection.Maps;
4343
import pascal.taie.util.collection.Sets;
4444

@@ -110,9 +110,9 @@ public Zipper(PointerAnalysisResult ptaBase, boolean isExpress, float pv) {
110110
this.pta = new PointerAnalysisResultExImpl(ptaBase, true);
111111
this.isExpress = isExpress;
112112
this.pv = pv;
113-
this.oag = Timer.runAndCount(() -> new ObjectAllocationGraph(pta),
113+
this.oag = Monitor.runAndCount(() -> new ObjectAllocationGraph(pta),
114114
"Building OAG", Level.INFO);
115-
this.pce = Timer.runAndCount(() -> new PotentialContextElement(pta, oag),
115+
this.pce = Monitor.runAndCount(() -> new PotentialContextElement(pta, oag),
116116
"Building PCE", Level.INFO);
117117
this.ofg = ptaBase.getObjectFlowGraph();
118118
logger.info("{} nodes in OFG", ofg.getNodes().size());
@@ -148,7 +148,7 @@ public Set<JMethod> selectPrecisionCriticalMethods() {
148148

149149
// build and analyze precision-flow graphs
150150
Set<Type> types = pta.getObjectTypes();
151-
Timer.runAndCount(() -> types.parallelStream().forEach(this::analyze),
151+
Monitor.runAndCount(() -> types.parallelStream().forEach(this::analyze),
152152
"Building and analyzing PFG", Level.INFO);
153153
logger.info("#types: {}", types.size());
154154
logger.info("#avg. nodes in PFG: {}", totalPFGNodes.get() / types.size());

src/main/java/pascal/taie/frontend/cache/CachedWorldBuilder.java

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@
2828
import pascal.taie.WorldBuilder;
2929
import pascal.taie.config.AnalysisConfig;
3030
import pascal.taie.config.Options;
31-
import pascal.taie.util.Timer;
31+
import pascal.taie.util.Monitor;
3232

3333
import java.io.BufferedInputStream;
3434
import java.io.BufferedOutputStream;
@@ -84,8 +84,8 @@ private boolean loadCache(Options options, File worldCacheFile) {
8484
return false;
8585
}
8686
logger.info("Loading the world cache from {}", worldCacheFile);
87-
Timer timer = new Timer("Load the world cache");
88-
timer.start();
87+
Monitor monitor = new Monitor("Load the world cache");
88+
monitor.start();
8989
ObjectInputStream ois = null;
9090
try {
9191
ois = new ObjectInputStream(
@@ -105,34 +105,34 @@ private boolean loadCache(Options options, File worldCacheFile) {
105105
logger.error("Failed to close input stream", e);
106106
}
107107
}
108-
timer.stop();
109-
logger.info(timer);
108+
monitor.stop();
109+
logger.info(monitor);
110110
}
111111
return false;
112112
}
113113

114114
private void runWorldBuilder(Options options, List<AnalysisConfig> analyses) {
115115
logger.info("Running the WorldBuilder ...");
116-
Timer timer = new Timer("Run the WorldBuilder");
117-
timer.start();
116+
Monitor monitor = new Monitor("Run the WorldBuilder");
117+
monitor.start();
118118
delegate.build(options, analyses);
119-
timer.stop();
120-
logger.info(timer);
119+
monitor.stop();
120+
logger.info(monitor);
121121
}
122122

123123
private void saveCache(File worldCacheFile) {
124124
logger.info("Saving the world cache to {}", worldCacheFile);
125-
Timer timer = new Timer("Save the world cache");
126-
timer.start();
125+
Monitor monitor = new Monitor("Save the world cache");
126+
monitor.start();
127127
try (ObjectOutputStream oos = new ObjectOutputStream(
128128
new BufferedOutputStream(new FileOutputStream(worldCacheFile)))) {
129129
oos.writeObject(World.get());
130130
} catch (Exception e) {
131131
logger.error("Failed to save world cache from {} due to {}",
132132
worldCacheFile, e);
133133
} finally {
134-
timer.stop();
135-
logger.info(timer);
134+
monitor.stop();
135+
logger.info(monitor);
136136
}
137137
}
138138

src/main/java/pascal/taie/frontend/soot/IRBuilder.java

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@
2929
import pascal.taie.language.classes.ClassHierarchy;
3030
import pascal.taie.language.classes.JClass;
3131
import pascal.taie.language.classes.JMethod;
32-
import pascal.taie.util.Timer;
32+
import pascal.taie.util.Monitor;
3333

3434
import java.util.ArrayList;
3535
import java.util.List;
@@ -67,8 +67,8 @@ public IR buildIR(JMethod method) {
6767
*/
6868
@Override
6969
public void buildAll(ClassHierarchy hierarchy) {
70-
Timer timer = new Timer("Build IR for all methods");
71-
timer.start();
70+
Monitor monitor = new Monitor("Build IR for all methods");
71+
monitor.start();
7272
int nThreads = Runtime.getRuntime().availableProcessors();
7373
// Group all methods by number of threads
7474
List<List<JMethod>> groups = new ArrayList<>();
@@ -95,7 +95,7 @@ public void buildAll(ClassHierarchy hierarchy) {
9595
} catch (InterruptedException e) {
9696
throw new RuntimeException(e);
9797
}
98-
timer.stop();
99-
logger.info(timer);
98+
monitor.stop();
99+
logger.info(monitor);
100100
}
101101
}

0 commit comments

Comments
 (0)