Skip to content

Commit 0bce311

Browse files
committed
Rewrite timings, again. Better results this time...
1 parent 8acfca8 commit 0bce311

File tree

5 files changed

+71
-173
lines changed

5 files changed

+71
-173
lines changed

src/main/java/ch/njol/skript/SkriptEventHandler.java

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,8 @@
4747
import ch.njol.skript.lang.SelfRegisteringSkriptEvent;
4848
import ch.njol.skript.lang.Trigger;
4949
import ch.njol.skript.lang.function.Functions;
50+
import ch.njol.skript.timings.Timing;
51+
import ch.njol.skript.timings.Timings;
5052

5153
/**
5254
* @author Peter Güttinger
@@ -155,16 +157,24 @@ static void check(final Event e) {
155157
}
156158

157159
private static long startEvent;
160+
@Nullable
161+
private static Timing timing;
158162

159163
public static void logEventStart(final Event e) {
164+
if (Timings.enabled())
165+
timing = Timings.of(e.getEventName());
166+
167+
startEvent = System.nanoTime();
160168
if (!Skript.logVeryHigh())
161169
return;
162-
startEvent = System.nanoTime();
163170
Skript.info("");
164171
Skript.info("== " + e.getClass().getName() + " ==");
165172
}
166173

167174
public static void logEventEnd() {
175+
if (timing != null)
176+
timing.setEventTime(System.nanoTime() - startEvent);
177+
168178
if (!Skript.logVeryHigh())
169179
return;
170180
Skript.info("== took " + 1. * (System.nanoTime() - startEvent) / 1000000. + " milliseconds ==");
@@ -173,13 +183,16 @@ public static void logEventEnd() {
173183
static long startTrigger;
174184

175185
public static void logTriggerStart(final Trigger t) {
186+
startTrigger = System.nanoTime();
176187
if (!Skript.logVeryHigh())
177188
return;
178189
Skript.info("# " + t.getName());
179-
startTrigger = System.nanoTime();
180190
}
181191

182192
public static void logTriggerEnd(final Trigger t) {
193+
if (timing != null)
194+
timing.addTrigger(t, System.nanoTime() - startTrigger);
195+
183196
if (!Skript.logVeryHigh())
184197
return;
185198
Skript.info("# " + t.getName() + " took " + 1. * (System.nanoTime() - startTrigger) / 1000000. + " milliseconds");

src/main/java/ch/njol/skript/lang/TriggerItem.java

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -88,11 +88,7 @@ protected TriggerItem walk(final Event e) {
8888
public final static boolean walk(final TriggerItem start, final Event e) {
8989
assert start != null && e != null;
9090
TriggerItem i = start;
91-
Timing timing = null;
9291
try {
93-
if (Timings.enabled())
94-
timing = Timings.start(e);
95-
9692
while (i != null)
9793
i = i.walk(e);
9894

@@ -106,11 +102,6 @@ public final static boolean walk(final TriggerItem start, final Event e) {
106102
} catch (final Exception ex) {
107103
if (ex.getStackTrace().length != 0) // empty exceptions have already been printed
108104
Skript.exception(ex, i);
109-
} finally {
110-
if (Timings.enabled()) {
111-
assert timing != null;
112-
timing.stop(); // Whatever happened, end the timing
113-
}
114105
}
115106
return false;
116107
}

src/main/java/ch/njol/skript/timings/Timing.java

Lines changed: 19 additions & 117 deletions
Original file line numberDiff line numberDiff line change
@@ -24,145 +24,47 @@
2424
import java.lang.ref.WeakReference;
2525
import java.util.ArrayList;
2626
import java.util.HashMap;
27+
import java.util.LinkedHashMap;
2728
import java.util.List;
2829
import java.util.Map;
2930

30-
import ch.njol.skript.Skript;
31+
import org.bukkit.event.Event;
32+
33+
import com.google.common.collect.ImmutableMap;
3134

32-
import com.google.common.collect.Lists;
35+
import ch.njol.skript.Skript;
36+
import ch.njol.skript.lang.Trigger;
3337

3438
/**
3539
* Timing for certain action.
3640
*/
3741
public class Timing {
3842

39-
public class Capture {
40-
41-
final String thread;
42-
43-
long start;
44-
long end;
45-
46-
long paused; // Time while paused
47-
long pauseBegin;
48-
49-
protected Capture(final Thread thread) {
50-
String name = thread.getName();
51-
assert name != null;
52-
this.thread = name;
53-
}
54-
55-
public void start() {
56-
start = System.nanoTime();
57-
}
58-
59-
public void stop() {
60-
end = System.nanoTime();
61-
}
62-
63-
public void pause() {
64-
pauseBegin = System.nanoTime();
65-
}
66-
67-
public void unpause() {
68-
long pauseTime = System.nanoTime() - pauseBegin;
69-
paused += pauseTime;
70-
}
71-
72-
public long result() {
73-
if (end == 0L)
74-
end = System.nanoTime();
75-
76-
return end - start - paused;
77-
}
78-
79-
public boolean isOf(Thread t) {
80-
return (thread.equals(t.getName()));
81-
}
82-
}
83-
84-
private List<Capture> captures = new ArrayList<Capture>();
85-
private Map<Thread,Capture> inProgress;
43+
private Map<Trigger,Long> triggerTimes;
44+
private long eventTime;
8645

8746
/**
8847
* Creates a new timing. Only used by {@link Timings}
8948
*/
9049
protected Timing() {
91-
captures = new ArrayList<Capture>();
92-
inProgress = new HashMap<Thread,Capture>();
50+
triggerTimes = new LinkedHashMap<Trigger,Long>();
51+
eventTime = 0L;
9352
}
9453

95-
/**
96-
* Starts timing measurement for caller thread.
97-
* @return Timing for chaining
98-
*/
99-
public Timing start() {
100-
Thread current = Thread.currentThread();
101-
assert current != null;
102-
if (inProgress.containsKey(current)) {
103-
inProgress.get(current).stop();
104-
inProgress.remove(current);
105-
}
106-
107-
Capture c = new Capture(current);
108-
c.start();
109-
captures.add(c);
110-
inProgress.put(current, c);
111-
112-
return this;
54+
public void addTrigger(Trigger t, long time) {
55+
triggerTimes.put(t, time);
11356
}
11457

115-
/**
116-
* Stops timing measurements for caller thread if it was in progress.
117-
*/
118-
public void stop() {
119-
Thread current = Thread.currentThread();
120-
assert current != null;
121-
if (inProgress.containsKey(current)) {
122-
inProgress.get(current).stop();
123-
inProgress.remove(current);
124-
}
58+
public void setEventTime(long time) {
59+
eventTime = time;
12560
}
12661

127-
/**
128-
* Pauses timing measurement for caller thread until {@link #unpause()} is called.
129-
* @return Timing for chaining.
130-
*/
131-
public Timing pause() {
132-
Thread current = Thread.currentThread();
133-
assert current != null;
134-
if (inProgress.containsKey(current)) {
135-
inProgress.get(current).pause();
136-
}
137-
138-
return this;
139-
}
140-
141-
/**
142-
* Unpauses timing measurement for caller thread if it was paused.
143-
* @return Timing for chaining.
144-
*/
145-
public Timing unpause() {
146-
Thread current = Thread.currentThread();
147-
assert current != null;
148-
if (inProgress.containsKey(current)) {
149-
inProgress.get(current).unpause();
150-
}
151-
152-
return this;
62+
@SuppressWarnings("null")
63+
public Map<Trigger,Long> getTriggerTimes() {
64+
return ImmutableMap.copyOf(triggerTimes);
15365
}
15466

155-
/**
156-
* Gets list of captures for given thread. Very expensive to call.
157-
* @param thread
158-
* @return Captures for given thread
159-
*/
160-
public List<Capture> getCaptures(Thread thread) {
161-
List<Capture> ret = new ArrayList<Capture>();
162-
for (Capture c : captures)
163-
if (c.isOf(thread))
164-
ret.add(c);
165-
166-
return ret;
67+
public long getEventTime() {
68+
return eventTime;
16769
}
16870
}

src/main/java/ch/njol/skript/timings/TimingReporter.java

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -27,44 +27,54 @@
2727
import java.util.Map;
2828
import java.util.Map.Entry;
2929

30+
import ch.njol.skript.lang.Trigger;
3031
import ch.njol.skript.localization.Language;
31-
import ch.njol.skript.timings.Timing.Capture;
3232

3333
/**
3434
* Creates timing reports.
3535
*/
3636
public class TimingReporter {
3737

38-
public static String generateReport() {
38+
public static String getReport() {
3939
Map<Object,Timing> timings = Timings.timings;
40-
StringBuilder sb = new StringBuilder();
40+
Map<String,Long> triggers = new HashMap<String,Long>();
41+
Map<Object,Long> events = new HashMap<Object,Long>();
4142

42-
sb.append(String.format(Language.get("timings.start"), ((Timings.disableTime - Timings.enableTime)) / 1000000000));
43-
Map<String,Long> results = parseTimings();
44-
Iterator<Entry<String, Long>> it = results.entrySet().iterator();
45-
while (it.hasNext()) {
46-
Entry<String, Long> entry = it.next();
47-
long time = entry.getValue();
48-
sb.append(entry.getKey() + ": " + time + " (" + (time / 1000000000) + "ms)");
43+
for (Entry<Object,Timing> entry : timings.entrySet()) {
44+
Object key = entry.getKey();
45+
Timing val = entry.getValue();
46+
47+
for (Entry<Trigger,Long> trigger : val.getTriggerTimes().entrySet()) {
48+
String name = trigger.getKey().getName();
49+
long tt = 0L;
50+
if (triggers.containsKey(name))
51+
tt = triggers.get(name);
52+
tt += trigger.getValue();
53+
triggers.put(name, tt);
54+
}
55+
56+
long evtTime = 0L;
57+
if (events.containsKey(key))
58+
evtTime = events.get(key);
59+
evtTime += val.getEventTime();
4960
}
5061

51-
return sb.toString();
52-
}
53-
54-
@SuppressWarnings("null")
55-
public static Map<String,Long> parseTimings() {
56-
Map<String,Long> ret = new HashMap<String,Long>();
62+
long length = Timings.disableTime - Timings.enableTime;
63+
StringBuilder sb = new StringBuilder();
64+
sb.append(String.format(Language.get("timings.start"), length / 1000000000));
65+
66+
sb.append(Language.get("timings.triggers"));
67+
for (Entry<String,Long> trigger : triggers.entrySet()) {
68+
float percent = trigger.getValue() / length * 100;
69+
sb.append(trigger.getKey() + ": " + (trigger.getValue() / 1000000) + "ms (" + percent + "%)");
70+
}
5771

58-
Iterator<Entry<Object, Timing>> it = Timings.timings.entrySet().iterator();
59-
while (it.hasNext()) {
60-
Entry<Object, Timing> entry = it.next();
61-
List<Capture> captures = entry.getValue().getCaptures(Thread.currentThread());
62-
long time = 0;
63-
for (Capture c : captures)
64-
time += c.result();
65-
ret.put(entry.toString(), time);
72+
sb.append(Language.get("timings.events"));
73+
for (Entry<Object,Long> event : events.entrySet()) {
74+
float percent = event.getValue() / length * 100;
75+
sb.append(event.getKey() + ": " + (event.getValue() / 1000000) + "ms (" + percent + "%)");
6676
}
6777

68-
return ret;
78+
return sb.toString();
6979
}
7080
}

src/main/java/ch/njol/skript/timings/Timings.java

Lines changed: 2 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -65,26 +65,8 @@ public static void disable() {
6565
disableTime = System.nanoTime();
6666
}
6767

68-
public static Timing start(Object ref) {
69-
Timing timing = of(ref);
70-
timing.start();
71-
return timing;
72-
}
73-
74-
public static void stop(Object ref) {
75-
Timing timing = of(ref);
76-
timing.stop();
77-
}
78-
79-
public static Timing pause(Object ref) {
80-
Timing timing = of(ref);
81-
timing.pause();
82-
return timing;
68+
public static void clear() {
69+
timings.clear();
8370
}
8471

85-
public static Timing unpause(Object ref) {
86-
Timing timing = of(ref);
87-
timing.unpause();
88-
return timing;
89-
}
9072
}

0 commit comments

Comments
 (0)