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 }