Skip to content

Commit 11472c0

Browse files
authored
Quick and dirty mixin to time and log event timings to a "csv" (uses semicolon) (#411)
* Quick and dirty mixin to time and log event timings to a "csv" (uses semicolon) * Add a PreInitMixinPlugin Gate log mod times behind a property Used a Buffered Writer * redundant remaps
1 parent 7fb68e8 commit 11472c0

File tree

5 files changed

+151
-2
lines changed

5 files changed

+151
-2
lines changed

build.gradle.kts

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,9 @@ tasks.jar {
1010
attributes("CCTransformer" to "com.mitchej123.hodgepodge.asm.transformers.early.EarlyClassTransformer")
1111
}
1212
}
13+
minecraft {
14+
extraRunJvmArguments.add("-Dhodgepodge.logModTimes=true")
15+
}
1316

1417
tasks.processResources {
1518
inputs.property("version", project.version.toString())
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
package com.mitchej123.hodgepodge.mixins.hooks;
2+
3+
import cpw.mods.fml.common.ModContainer;
4+
5+
public class ModProfileResult implements Comparable<ModProfileResult> {
6+
7+
public final long time;
8+
public final ModContainer mod;
9+
10+
public ModProfileResult(long time, ModContainer mod) {
11+
this.time = time;
12+
this.mod = mod;
13+
}
14+
15+
@Override
16+
public int compareTo(ModProfileResult o) {
17+
return Long.compare(o.time, time);
18+
}
19+
20+
}
Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
package com.mitchej123.hodgepodge.mixins.plugin;
2+
3+
import java.util.ArrayList;
4+
import java.util.List;
5+
import java.util.Set;
6+
7+
import org.spongepowered.asm.lib.tree.ClassNode;
8+
import org.spongepowered.asm.mixin.extensibility.IMixinConfigPlugin;
9+
import org.spongepowered.asm.mixin.extensibility.IMixinInfo;
10+
11+
public class HodgepodgePreInitMixinPlugin implements IMixinConfigPlugin {
12+
13+
@Override
14+
public void onLoad(String mixinPackage) {
15+
16+
}
17+
18+
@Override
19+
public String getRefMapperConfig() {
20+
return null;
21+
}
22+
23+
@Override
24+
public boolean shouldApplyMixin(String targetClassName, String mixinClassName) {
25+
return true;
26+
}
27+
28+
@Override
29+
public void acceptTargets(Set<String> myTargets, Set<String> otherTargets) {
30+
31+
}
32+
33+
@Override
34+
public List<String> getMixins() {
35+
List<String> mixins = new ArrayList<>();
36+
if (Boolean.getBoolean("hodgepodge.logModTimes")) {
37+
mixins.add("MixinLoadController_logModTimes");
38+
}
39+
return mixins;
40+
}
41+
42+
@Override
43+
public void preApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) {
44+
45+
}
46+
47+
@Override
48+
public void postApply(String s, ClassNode classNode, String s1, IMixinInfo iMixinInfo) {
49+
50+
}
51+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
package com.mitchej123.hodgepodge.mixins.preinit;
2+
3+
import java.io.BufferedWriter;
4+
import java.io.FileWriter;
5+
import java.io.IOException;
6+
import java.io.PrintWriter;
7+
import java.util.ArrayList;
8+
import java.util.Map;
9+
10+
import org.spongepowered.asm.mixin.Mixin;
11+
import org.spongepowered.asm.mixin.injection.At;
12+
import org.spongepowered.asm.mixin.injection.Inject;
13+
import org.spongepowered.asm.mixin.injection.callback.CallbackInfo;
14+
15+
import com.llamalad7.mixinextras.injector.wrapoperation.Operation;
16+
import com.llamalad7.mixinextras.injector.wrapoperation.WrapOperation;
17+
import com.mitchej123.hodgepodge.Common;
18+
import com.mitchej123.hodgepodge.mixins.hooks.ModProfileResult;
19+
20+
import cpw.mods.fml.common.LoadController;
21+
import cpw.mods.fml.common.LoaderState;
22+
import cpw.mods.fml.common.ModContainer;
23+
import cpw.mods.fml.common.event.FMLEvent;
24+
import it.unimi.dsi.fastutil.objects.Object2ObjectOpenHashMap;
25+
26+
@Mixin(value = LoadController.class, remap = false)
27+
public class MixinLoadController_logModTimes {
28+
29+
private static Map<String, ArrayList<ModProfileResult>> results = new Object2ObjectOpenHashMap<>();
30+
31+
@WrapOperation(
32+
method = "propogateStateMessage",
33+
at = @At(
34+
value = "INVOKE",
35+
target = "Lcpw/mods/fml/common/LoadController;sendEventToModContainer(Lcpw/mods/fml/common/event/FMLEvent;Lcpw/mods/fml/common/ModContainer;)V"))
36+
private void timeModEvent(LoadController instance, FMLEvent event, ModContainer modContainer,
37+
Operation<Void> original) {
38+
39+
final long start = System.nanoTime();
40+
41+
original.call(instance, event, modContainer);
42+
if (results == null) return;
43+
44+
final long timeTaken = System.nanoTime() - start;
45+
results.computeIfAbsent(event.getEventType(), k -> new ArrayList<>())
46+
.add(new ModProfileResult(timeTaken, modContainer));
47+
}
48+
49+
@Inject(
50+
method = "Lcpw/mods/fml/common/LoadController;distributeStateMessage(Lcpw/mods/fml/common/LoaderState;[Ljava/lang/Object;)V",
51+
at = @At(value = "TAIL"))
52+
public void printResults(LoaderState state, Object[] eventData, CallbackInfo ci) {
53+
if (results == null || state != LoaderState.AVAILABLE) return;
54+
try {
55+
PrintWriter writer = new PrintWriter(new BufferedWriter(new FileWriter("modtimes.csv", false)));
56+
57+
writer.println("event;modid;modname;time");
58+
results.forEach((type, results) -> {
59+
results.sort(null);
60+
results.forEach(result -> {
61+
final String modid = result.mod.getModId();
62+
writer.println(type + ";" + modid + ";" + result.mod.getName() + ";" + result.time / 1000000);
63+
});
64+
65+
});
66+
writer.close();
67+
} catch (IOException e) {
68+
Common.log.error("Failed to write modtimes.csv", e);
69+
}
70+
results = null;
71+
}
72+
73+
}

src/main/resources/mixins.hodgepodge.json

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,9 @@
22
"required": true,
33
"minVersion": "0.8.3-GTNH",
44
"refmap": "mixins.hodgepodge.refmap.json",
5-
"target": "@env(DEFAULT)",
6-
"compatibilityLevel": "JAVA_8"
5+
"target": "@env(PREINIT)",
6+
"compatibilityLevel": "JAVA_8",
7+
"plugin": "com.mitchej123.hodgepodge.mixins.plugin.HodgepodgePreInitMixinPlugin",
8+
"package": "com.mitchej123.hodgepodge.mixins.preinit"
79
}
810

0 commit comments

Comments
 (0)