    001package net.minecraft.profiler;
    002
    003import java.util.ArrayList;
    004import java.util.Collections;
    005import java.util.HashMap;
    006import java.util.Iterator;
    007import java.util.List;
    008import java.util.Map;
    009
    010public 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}