1 package org.bukkit.command.defaults;
4 import java.io.IOException;
5 import java.io.PrintStream;
6 import java.util.ArrayList;
9 import org.apache.commons.lang.Validate;
10 import org.bukkit.Bukkit;
11 import org.bukkit.ChatColor;
12 import org.bukkit.command.CommandSender;
13 import org.bukkit.event.Event;
14 import org.bukkit.event.HandlerList;
15 import org.bukkit.plugin.Plugin;
16 import org.bukkit.plugin.RegisteredListener;
17 import org.bukkit.plugin.TimedRegisteredListener;
18 import org.bukkit.util.StringUtil;
20 import com.google.common.collect.ImmutableList;
23 private static final List<String> TIMINGS_SUBCOMMANDS = ImmutableList.of(
"merged",
"reset",
"separate");
27 this.
description =
"Records timings for all plugin events";
35 if (args.length != 1) {
40 sender.
sendMessage(
"Please enable timings by setting \"settings.plugin-profiling\" to true in bukkit.yml");
44 boolean separate =
"separate".equals(args[0]);
45 if (
"reset".equals(args[0])) {
49 ((TimedRegisteredListener)listener).reset();
54 }
else if (
"merged".equals(args[0]) || separate) {
58 File timingFolder =
new File(
"timings");
59 timingFolder.mkdirs();
60 File timings =
new File(timingFolder,
"timings.txt");
62 while (timings.exists()) timings =
new File(timingFolder,
"timings" + (++index) +
".txt");
63 PrintStream fileTimings = null;
64 PrintStream fileNames = null;
66 fileTimings =
new PrintStream(timings);
68 names =
new File(timingFolder,
"names" + index +
".txt");
69 fileNames =
new PrintStream(names);
75 fileNames.println(pluginIdx +
" " + plugin.getDescription().getFullName());
76 fileTimings.println(
"Plugin " + pluginIdx);
78 else fileTimings.println(plugin.getDescription().getFullName());
81 TimedRegisteredListener trl = (TimedRegisteredListener) listener;
84 if (count == 0)
continue;
85 long avg = time / count;
88 if (count > 0 && event != null) {
89 fileTimings.println(
" " + event.getClass().getSimpleName() + (trl.
hasMultiple() ?
" (and others)" :
"") +
" Time: " + time +
" Count: " + count +
" Avg: " + avg);
93 fileTimings.println(
" Total time " + totalTime +
" (" + totalTime / 1000000000 +
"s)");
95 sender.
sendMessage(
"Timings written to " + timings.getPath());
96 if (separate) sender.
sendMessage(
"Names written to " + names.getPath());
97 }
catch (IOException e) {
99 if (fileTimings != null) {
102 if (fileNames != null) {
112 Validate.notNull(sender,
"Sender cannot be null");
113 Validate.notNull(args,
"Arguments cannot be null");
114 Validate.notNull(alias,
"Alias cannot be null");
116 if (args.length == 1) {
119 return ImmutableList.of();