Skip to content

Commit 3e16e49

Browse files
committed
Вывод информации о длительности работы парсера
1 parent 2783417 commit 3e16e49

File tree

2 files changed

+100
-6
lines changed

2 files changed

+100
-6
lines changed

src/com/annimon/ownlang/Main.java

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
package com.annimon.ownlang;
22

33
import com.annimon.ownlang.lib.CallStack;
4-
import com.annimon.ownlang.lib.Function;
5-
import com.annimon.ownlang.lib.Functions;
64
import com.annimon.ownlang.parser.Lexer;
75
import com.annimon.ownlang.parser.Parser;
86
import com.annimon.ownlang.parser.Token;
@@ -14,6 +12,7 @@
1412
import java.nio.file.Files;
1513
import java.nio.file.Paths;
1614
import java.util.List;
15+
import java.util.concurrent.TimeUnit;
1716

1817
/**
1918
* @author aNNiMON
@@ -22,11 +21,11 @@ public final class Main {
2221

2322
public static void main(String[] args) throws IOException {
2423
if (args.length == 0) {
25-
run(readFile("program.own"), true, true);
24+
run(readFile("program.own"), true, true, true);
2625
return;
2726
}
2827

29-
boolean showTokens = false, showAst = false;
28+
boolean showTokens = false, showAst = false, showMeasurements = false;
3029
String input = null;
3130
for (int i = 0; i < args.length; i++) {
3231
switch (args[i]) {
@@ -40,6 +39,11 @@ public static void main(String[] args) throws IOException {
4039
showTokens = true;
4140
break;
4241

42+
case "-m":
43+
case "--showtime":
44+
showMeasurements = true;
45+
break;
46+
4347
case "-f":
4448
case "--file":
4549
if (i + 1 < args.length) {
@@ -55,23 +59,28 @@ public static void main(String[] args) throws IOException {
5559
if (input == null) {
5660
throw new IllegalArgumentException("Empty input");
5761
}
58-
run(input, showTokens, showAst);
62+
run(input, showTokens, showAst, showMeasurements);
5963
}
6064

6165
private static String readFile(String file) throws IOException {
6266
return new String( Files.readAllBytes(Paths.get(file)), "UTF-8");
6367
}
6468

65-
private static void run(String input, boolean showTokens, boolean showAst) {
69+
private static void run(String input, boolean showTokens, boolean showAst, boolean showMeasurements) {
70+
final TimeMeasurement measurement = new TimeMeasurement();
71+
measurement.start("Tokenize time");
6672
final List<Token> tokens = new Lexer(input).tokenize();
73+
measurement.stop("Tokenize time");
6774
if (showTokens) {
6875
for (int i = 0; i < tokens.size(); i++) {
6976
System.out.println(i + " " + tokens.get(i));
7077
}
7178
}
7279

80+
measurement.start("Parse time");
7381
final Parser parser = new Parser(tokens);
7482
final Statement program = parser.parse();
83+
measurement.stop("Parse time");
7584
if (showAst) {
7685
System.out.println(program.toString());
7786
}
@@ -83,9 +92,15 @@ private static void run(String input, boolean showTokens, boolean showAst) {
8392
// program.accept(new VariablePrinter());
8493
program.accept(new AssignValidator());
8594
try {
95+
measurement.start("Execution time");
8696
program.execute();
8797
} catch (Exception ex) {
8898
handleException(Thread.currentThread(), ex);
99+
} finally {
100+
if (showMeasurements) {
101+
measurement.stop("Execution time");
102+
System.out.println(measurement.summary(TimeUnit.MILLISECONDS, true));
103+
}
89104
}
90105
}
91106

Lines changed: 79 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,79 @@
1+
package com.annimon.ownlang;
2+
3+
import java.util.HashMap;
4+
import java.util.Map;
5+
import java.util.concurrent.TimeUnit;
6+
7+
public final class TimeMeasurement {
8+
9+
private final Map<String, Long> finished, running;
10+
11+
public TimeMeasurement() {
12+
finished = new HashMap<>();
13+
running = new HashMap<>();
14+
}
15+
16+
public void clear() {
17+
finished.clear();
18+
running.clear();
19+
}
20+
21+
public void start(String... names) {
22+
final long time = System.nanoTime();
23+
for (String name : names) {
24+
running.put(name, time);
25+
}
26+
}
27+
28+
public void pause(String... names) {
29+
final long time = System.nanoTime();
30+
for (String name : names) {
31+
if (running.containsKey(name)) {
32+
addTime(name, time - running.get(name));
33+
running.remove(name);
34+
}
35+
}
36+
}
37+
38+
public void stop(String... names) {
39+
final long time = System.nanoTime();
40+
for (String name : names) {
41+
if (running.containsKey(name)) {
42+
addTime(name, time - running.get(name));
43+
}
44+
}
45+
}
46+
47+
public Map<String, Long> getFinished() {
48+
return finished;
49+
}
50+
51+
public String summary() {
52+
return summary(TimeUnit.SECONDS, true);
53+
}
54+
55+
public String summary(TimeUnit unit, boolean showSummary) {
56+
final String unitName = unit.name().toLowerCase();
57+
final StringBuilder result = new StringBuilder();
58+
long summaryTime = 0;
59+
for (Map.Entry<String, Long> entry : finished.entrySet()) {
60+
final long convertedTime = unit.convert(entry.getValue(), TimeUnit.NANOSECONDS);
61+
summaryTime += convertedTime;
62+
63+
result.append(entry.getKey()).append(": ")
64+
.append(convertedTime).append(' ').append(unitName)
65+
.append(System.lineSeparator());
66+
}
67+
if (showSummary) {
68+
result.append("Summary: ")
69+
.append(summaryTime).append(' ').append(unitName)
70+
.append(System.lineSeparator());
71+
}
72+
return result.toString();
73+
}
74+
75+
private void addTime(String name, long time) {
76+
final long alreadyElapsed = finished.getOrDefault(name, 0L);
77+
finished.put(name, alreadyElapsed + time);
78+
}
79+
}

0 commit comments

Comments
 (0)