001 package net.minecraft.profiler;
002
003 import java.util.ArrayList;
004 import java.util.Collections;
005 import java.util.HashMap;
006 import java.util.Iterator;
007 import java.util.List;
008 import java.util.Map;
009
010 public class Profiler
011 {
012 /** List of parent sections */
013 private final List sectionList = new ArrayList();
014
015 /** List of timestamps (System.nanoTime) */
016 private final List timestampList = new ArrayList();
017
018 /** Flag profiling enabled */
019 public boolean profilingEnabled = false;
020
021 /** Current profiling section */
022 private String profilingSection = "";
023
024 /** Profiling map */
025 private final Map profilingMap = new HashMap();
026
027 /**
028 * Clear profiling.
029 */
030 public void clearProfiling()
031 {
032 this.profilingMap.clear();
033 this.profilingSection = "";
034 this.sectionList.clear();
035 }
036
037 /**
038 * Start section
039 */
040 public void startSection(String par1Str)
041 {
042 if (this.profilingEnabled)
043 {
044 if (this.profilingSection.length() > 0)
045 {
046 this.profilingSection = this.profilingSection + ".";
047 }
048
049 this.profilingSection = this.profilingSection + par1Str;
050 this.sectionList.add(this.profilingSection);
051 this.timestampList.add(Long.valueOf(System.nanoTime()));
052 }
053 }
054
055 /**
056 * End section
057 */
058 public void endSection()
059 {
060 if (this.profilingEnabled)
061 {
062 long var1 = System.nanoTime();
063 long var3 = ((Long)this.timestampList.remove(this.timestampList.size() - 1)).longValue();
064 this.sectionList.remove(this.sectionList.size() - 1);
065 long var5 = var1 - var3;
066
067 if (this.profilingMap.containsKey(this.profilingSection))
068 {
069 this.profilingMap.put(this.profilingSection, Long.valueOf(((Long)this.profilingMap.get(this.profilingSection)).longValue() + var5));
070 }
071 else
072 {
073 this.profilingMap.put(this.profilingSection, Long.valueOf(var5));
074 }
075
076 if (var5 > 100000000L)
077 {
078 System.out.println("Something\'s taking too long! \'" + this.profilingSection + "\' took aprox " + (double)var5 / 1000000.0D + " ms");
079 }
080
081 this.profilingSection = !this.sectionList.isEmpty() ? (String)this.sectionList.get(this.sectionList.size() - 1) : "";
082 }
083 }
084
085 /**
086 * Get profiling data
087 */
088 public List getProfilingData(String par1Str)
089 {
090 if (!this.profilingEnabled)
091 {
092 return null;
093 }
094 else
095 {
096 long var3 = this.profilingMap.containsKey("root") ? ((Long)this.profilingMap.get("root")).longValue() : 0L;
097 long var5 = this.profilingMap.containsKey(par1Str) ? ((Long)this.profilingMap.get(par1Str)).longValue() : -1L;
098 ArrayList var7 = new ArrayList();
099
100 if (par1Str.length() > 0)
101 {
102 par1Str = par1Str + ".";
103 }
104
105 long var8 = 0L;
106 Iterator var10 = this.profilingMap.keySet().iterator();
107
108 while (var10.hasNext())
109 {
110 String var11 = (String)var10.next();
111
112 if (var11.length() > par1Str.length() && var11.startsWith(par1Str) && var11.indexOf(".", par1Str.length() + 1) < 0)
113 {
114 var8 += ((Long)this.profilingMap.get(var11)).longValue();
115 }
116 }
117
118 float var21 = (float)var8;
119
120 if (var8 < var5)
121 {
122 var8 = var5;
123 }
124
125 if (var3 < var8)
126 {
127 var3 = var8;
128 }
129
130 Iterator var20 = this.profilingMap.keySet().iterator();
131 String var12;
132
133 while (var20.hasNext())
134 {
135 var12 = (String)var20.next();
136
137 if (var12.length() > par1Str.length() && var12.startsWith(par1Str) && var12.indexOf(".", par1Str.length() + 1) < 0)
138 {
139 long var13 = ((Long)this.profilingMap.get(var12)).longValue();
140 double var15 = (double)var13 * 100.0D / (double)var8;
141 double var17 = (double)var13 * 100.0D / (double)var3;
142 String var19 = var12.substring(par1Str.length());
143 var7.add(new ProfilerResult(var19, var15, var17));
144 }
145 }
146
147 var20 = this.profilingMap.keySet().iterator();
148
149 while (var20.hasNext())
150 {
151 var12 = (String)var20.next();
152 this.profilingMap.put(var12, Long.valueOf(((Long)this.profilingMap.get(var12)).longValue() * 999L / 1000L));
153 }
154
155 if ((float)var8 > var21)
156 {
157 var7.add(new ProfilerResult("unspecified", (double)((float)var8 - var21) * 100.0D / (double)var8, (double)((float)var8 - var21) * 100.0D / (double)var3));
158 }
159
160 Collections.sort(var7);
161 var7.add(0, new ProfilerResult(par1Str, 100.0D, (double)var8 * 100.0D / (double)var3));
162 return var7;
163 }
164 }
165
166 /**
167 * End current section and start a new section
168 */
169 public void endStartSection(String par1Str)
170 {
171 this.endSection();
172 this.startSection(par1Str);
173 }
174
175 public String getNameOfLastSection()
176 {
177 return this.sectionList.size() == 0 ? "[UNKNOWN]" : (String)this.sectionList.get(this.sectionList.size() - 1);
178 }
179 }