Toen ik aan het uitzoeken was waarom Tomboy vrij veel tijd nodig heeft om te starten (BGO #567989, hint: het is niet het gebrek aan SQLite), dacht ik aan Lord Kelvin's uitspraak: "Meten is weten".
Nadenkend hoe ik dit kon doen, dacht ik eraan dat de GNOME community de perfecte tool heeft om uit te zoeken waarom iets traag is: Federico's geweldige timeline tool. Het enige wat ik moest doen is uitzoeken hoe dit gebruikt kan worden met Mono. En dat is vrij simpel, zoals je hieronder zal zien.
Tomboy startup (klik voor een volledige grafiek)
Federico gebruikt een
slimme hack met syscalls, die gelogd worden met strace. Gelukkig is dit heel simpel te reproduceren met C#.
- Allereerst moeten we de juiste syscalls genereren. Voeg onderstaande toe aan je programma:
public class TraceLogger {
public static void trace (string group, string format, params object[] args)
{
string message = String.Format (format, args);
string str = String.Format ("MARK: {0}: {1}", group, message);
Mono.Unix.Native.Syscall.access(str, Mono.Unix.Native.AccessModes.F_OK);
}
}
- Voeg royaal veel trace statements toe aan je code:
TraceLogger.trace("Main", "Starting main loop");
- Wijzig je startup script zodat de regel met "
exec mono ..." nu "exec strace -ttt -f -o /tmp/timeline.strace mono ...." bevat.
- Gebruik Federicos script om het te plotten:
python plot-timeline.py -o graph.png /tmp/timeline.strace.
Zo simpel is het. De aandachtige lezer zal merken dat ik het tracing formaat iets anders gebruik: in plaats van de programma naam gebruik ik een groep parameter. Dit maakt de grafiek interpreteren iets gemakkelijker: als je teveel tracing statements gebruikt kan het moeilijk zijn om te zien waar de grote gaten zijn. Door de kleurcodes te kapen wordt deze interpretatie moeilijkheid vermeden.
Ga nu maar allemaal snel jullie Mono programma's nog sneller maken!