    001    package net.minecraft.src;
    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    }