예제 #1
0
        private void graphPanel_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (!initialized)
            {
                return;
            }

            int x = leftMargin;

            foreach (Bucket b in buckets)
            {
                int y = graphPanel.Height - bottomMargin;
                foreach (DictionaryEntry d in b.typeDescToSizeCount)
                {
                    TypeDesc  t         = (TypeDesc)d.Key;
                    SizeCount sizeCount = (SizeCount)d.Value;
                    int       size      = sizeCount.size;
                    int       height    = size / verticalScale;

                    y -= height;

                    Rectangle bucketRect = new Rectangle(x, y, bucketWidth, height);
                    if (bucketRect.Contains(e.X, e.Y))
                    {
                        string caption = string.Format("{0} {1} ({2:f2}%) - {3:n0} instances, {4} average size", t.typeName, FormatSize(size), 100.0 * size / totalSize, sizeCount.count, FormatSize(sizeCount.size / sizeCount.count));
                        toolTip.Active = true;
                        toolTip.SetToolTip(graphPanel, caption);
                        return;
                    }
                }
                x += bucketWidth + gap;
            }
            toolTip.Active = false;
            toolTip.SetToolTip(graphPanel, "");
        }
예제 #2
0
        private void exportMenuItem_Click(object sender, System.EventArgs e)
        {
            exportSaveFileDialog.FileName = "HistogramByAge.csv";
            exportSaveFileDialog.Filter   = "Comma separated files | *.csv";
            if (exportSaveFileDialog.ShowDialog() == DialogResult.OK)
            {
                var w = new StreamWriter(exportSaveFileDialog.FileName);

                TypeDesc selectedType = FindSelectedType();

                string title = "Histogram by Age";
                if (selectedType != null)
                {
                    title += " of " + selectedType.typeName + " objects";
                }

                w.WriteLine(title);
                w.WriteLine();

                w.WriteLine("{0},{1},{2},{3},{4}", "Min Age", "Max Age", "# Instances", "Total Size", "Type");

                bool noBucketSelected = true;
                Debug.Assert(bucketTable != null, "bucketTable != null");
                foreach (Bucket b in bucketTable)
                {
                    if (b.selected)
                    {
                        noBucketSelected = false;
                        break;
                    }
                }

                foreach (Bucket b in bucketTable)
                {
                    if (noBucketSelected || b.selected)
                    {
                        foreach (KeyValuePair <TypeDesc, SizeCount> d in b.typeDescToSizeCount)
                        {
                            TypeDesc  t         = d.Key;
                            SizeCount sizeCount = d.Value;

                            if (selectedType == null || t == selectedType)
                            {
                                w.WriteLine("{0},{1},{2},{3},{4}", FormatAge(b.minAge, b.minComment), FormatAge(b.maxAge, b.maxComment), sizeCount.count, sizeCount.size, t.typeName);
                            }
                        }
                    }
                }

                w.Close();
            }
        }
예제 #3
0
        public void addItem(string itemName, long size)
        {
            SizeCount item;
            itemName = RemoveInvalidChars(itemName);
            if (!Items.TryGetValue(itemName, out item))
            {
                item = new SizeCount();
                Items[itemName] = item;
            }

            item.Size += size;
            item.Count++;
        }
예제 #4
0
        private void exportMenuItem_Click(object sender, System.EventArgs e)
        {
            exportSaveFileDialog.FileName = "HistogramByAge.csv";
            exportSaveFileDialog.Filter   = "Comma separated files | *.csv";
            if (exportSaveFileDialog.ShowDialog() == DialogResult.OK)
            {
                StreamWriter w = new StreamWriter(exportSaveFileDialog.FileName);

                TypeDesc selectedType = FindSelectedType();

                string title = "Histogram by Age";
                if (selectedType != null)
                {
                    title += " of " + selectedType.typeName + " objects";
                }

                w.WriteLine(title);
                w.WriteLine();

                w.WriteLine("{0},{1},{2},{3},{4}", "Min Age", "Max Age", "# Instances", "Total Size", "Type");

                bool noBucketSelected = true;
                foreach (Bucket b in bucketTable)
                {
                    if (b.selected)
                    {
                        noBucketSelected = false;
                    }
                }
                double age = 0.0;
                foreach (Bucket b in bucketTable)
                {
                    if (noBucketSelected || b.selected)
                    {
                        foreach (DictionaryEntry d in b.typeDescToSizeCount)
                        {
                            TypeDesc  t         = (TypeDesc)d.Key;
                            SizeCount sizeCount = (SizeCount)d.Value;

                            if (selectedType == null || t == selectedType)
                            {
                                w.WriteLine("{0},{1},{2},{3},{4}", FormatTime(age), FormatTime(age + timeScale), sizeCount.count, sizeCount.size, t.typeName);
                            }
                        }
                    }
                    age += timeScale;
                }

                w.Close();
            }
        }
예제 #5
0
        private void graphPanel_MouseDown(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (!initialized || verticalScale == 0)
            {
                return;
            }

            if ((e.Button & MouseButtons.Left) != MouseButtons.None)
            {
                if (sortedTypeTable != null)
                {
                    foreach (TypeDesc t in sortedTypeTable)
                    {
                        t.selected = false;
                    }
                }

                int x = leftMargin;
                Debug.Assert(bucketTable != null, "bucketTable != null");
                for (int i = 0; i < bucketTable.Length; i++)
                {
                    bucketTable[i].selected = false;
                    int y = graphPanel.Height - bottomMargin;
                    foreach (TypeDesc t in bucketTable[i].typeDescToSizeCount.Keys)
                    {
                        SizeCount sizeCount = bucketTable[i].typeDescToSizeCount[t];
                        ulong     size      = sizeCount.size;
                        int       height    = (int)(size / verticalScale);

                        y -= height;

                        var r = new Rectangle(x, y, bucketWidth, height);
                        if (r.Contains(e.X, e.Y))
                        {
                            t.selected = true;
                            bucketTable[i].selected = true;
                        }
                    }

                    x += bucketWidth + gap;
                }
                graphPanel.Invalidate();
                typeLegendPanel.Invalidate();
            }
            else if ((e.Button & MouseButtons.Right) != MouseButtons.None)
            {
                var p = new Point(e.X, e.Y);
                contextMenu.Show(graphPanel, p);
            }
        }
예제 #6
0
        private void DrawBuckets(Graphics g)
        {
            bool noBucketSelected = true;

            foreach (Bucket b in buckets)
            {
                if (b.selected)
                {
                    noBucketSelected = false;
                    break;
                }
            }

            using (Brush blackBrush = new SolidBrush(Color.Black))
            {
                int x = leftMargin;
                foreach (Bucket b in buckets)
                {
                    string s = "< " + FormatSize(b.maxSize + 1);
                    int    y = graphPanel.Height - bottomMargin;
                    g.DrawString(s, font, blackBrush, x, y + 3);
                    s = FormatSize(b.totalSize);
                    g.DrawString(s, font, blackBrush, x, y + 3 + font.Height);
                    s = string.Format("({0:f2}%)", 100.0 * b.totalSize / totalSize);
                    g.DrawString(s, font, blackBrush, x, y + 3 + font.Height * 2);
                    foreach (DictionaryEntry d in b.typeDescToSizeCount)
                    {
                        TypeDesc  t         = (TypeDesc)d.Key;
                        SizeCount sizeCount = (SizeCount)d.Value;
                        int       size      = sizeCount.size;
                        int       height    = size / verticalScale;

                        y -= height;

                        Brush brush = t.brush;
                        if (t.selected && (b.selected || noBucketSelected))
                        {
                            brush = blackBrush;
                        }
                        g.FillRectangle(brush, x, y, bucketWidth, height);
                    }

                    x += bucketWidth + gap;
                }
            }
        }
예제 #7
0
        private void DrawBuckets([NotNull] Graphics g)
        {
            Debug.Assert(verticalScale != 0);
            bool noBucketSelected = true;

            foreach (Bucket b in buckets)
            {
                if (b.selected)
                {
                    noBucketSelected = false;
                    break;
                }
            }

            Brush blackBrush = Brushes.Black;
            int   x          = leftMargin;

            foreach (Bucket b in buckets)
            {
                string s = "< " + FormatSize((ulong)b.maxSize + 1);
                int    y = graphPanel.Height - bottomMargin;
                g.DrawString(s, font, blackBrush, x, y + 3);
                s = FormatSize(b.totalSize);
                g.DrawString(s, font, blackBrush, x, y + 3 + font.Height);
                s = string.Format("({0:f2}%)", 100.0 * b.totalSize / totalSize);
                g.DrawString(s, font, blackBrush, x, y + 3 + font.Height * 2);
                foreach (KeyValuePair <TypeDesc, SizeCount> d in b.typeDescToSizeCount)
                {
                    TypeDesc  t         = d.Key;
                    SizeCount sizeCount = d.Value;
                    ulong     size      = sizeCount.size;
                    int       height    = (int)(size / (ulong)verticalScale);

                    y -= height;

                    bool cond = t.selected && (b.selected || noBucketSelected);
                    g.FillRectangle(cond ? blackBrush : t.brush, x, y, bucketWidth, height);
                }

                x += bucketWidth + gap;
            }
        }
예제 #8
0
        private void DrawBuckets(Graphics g)
        {
            bool noBucketSelected = true;

            foreach (Bucket b in bucketTable)
            {
                if (b.selected)
                {
                    noBucketSelected = false;
                    break;
                }
            }
            int    x          = leftMargin;
            double time       = 0;
            Brush  blackBrush = new SolidBrush(Color.Black);

            foreach (Bucket b in bucketTable)
            {
                int y = graphPanel.Height - bottomMargin;
                time += timeScale;
                string s = string.Format("< {0} sec", FormatTime(time));
                g.DrawString(s, font, blackBrush, x, y);
                s = FormatSize(b.totalSize);
                g.DrawString(s, font, blackBrush, x, y + font.Height);

                foreach (DictionaryEntry d in b.typeDescToSizeCount)
                {
                    TypeDesc  t         = (TypeDesc)d.Key;
                    SizeCount sizeCount = (SizeCount)d.Value;
                    int       height    = sizeCount.size / verticalScale;
                    y -= height;
                    Brush brush = t.brush;
                    if (t.selected && (b.selected || noBucketSelected))
                    {
                        brush = blackBrush;
                    }
                    g.FillRectangle(brush, x, y, bucketWidth, height);
                }

                x += bucketWidth + gap;
            }
        }
예제 #9
0
 void AddToBuckets(TypeDesc t, int size, int count)
 {
     for (int i = 0; i < buckets.Length; i++)
     {
         if (buckets[i].minSize <= size && size <= buckets[i].maxSize)
         {
             int totalSize = size * count;
             buckets[i].totalSize += totalSize;
             SizeCount sizeCount = (SizeCount)buckets[i].typeDescToSizeCount[t];
             if (sizeCount == null)
             {
                 sizeCount = new SizeCount();
                 buckets[i].typeDescToSizeCount[t] = sizeCount;
             }
             sizeCount.size  += totalSize;
             sizeCount.count += count;
             break;
         }
     }
 }
예제 #10
0
 private void AddToBuckets([NotNull] TypeDesc t, int size, int count)
 {
     for (int i = 0; i < buckets.Length; i++)
     {
         if (buckets[i].minSize <= size && size <= buckets[i].maxSize)
         {
             ulong totalSize = (ulong)size * (ulong)count;
             buckets[i].totalSize += totalSize;
             SizeCount sizeCount;
             if (!buckets[i].typeDescToSizeCount.TryGetValue(t, out sizeCount))
             {
                 sizeCount = new SizeCount();
                 buckets[i].typeDescToSizeCount[t] = sizeCount;
             }
             sizeCount.size  += totalSize;
             sizeCount.count += count;
             break;
         }
     }
 }
예제 #11
0
        private void graphPanel_MouseMove(object sender, System.Windows.Forms.MouseEventArgs e)
        {
            if (!initialized || verticalScale == 0)
            {
                return;
            }

            if (Form.ActiveForm == this)
            {
                int x = leftMargin;
                Debug.Assert(bucketTable != null, "bucketTable != null");
                foreach (Bucket b in bucketTable)
                {
                    int y = graphPanel.Height - bottomMargin;
                    foreach (KeyValuePair <TypeDesc, SizeCount> d in b.typeDescToSizeCount)
                    {
                        TypeDesc  t         = d.Key;
                        SizeCount sizeCount = d.Value;
                        ulong     size      = sizeCount.size;
                        int       height    = (int)(size / verticalScale);

                        y -= height;

                        var bucketRect = new Rectangle(x, y, bucketWidth, height);
                        if (bucketRect.Contains(e.X, e.Y))
                        {
                            string caption = string.Format("{0} {1} ({2:f2}%) - {3:n0} instances, {4} average size", t.typeName, FormatSize(size), 100.0 * size / totalSize, sizeCount.count, FormatSize((uint)(sizeCount.size / sizeCount.count)));
                            toolTip.Active = true;
                            toolTip.SetToolTip(graphPanel, caption);
                            return;
                        }
                    }
                    x += bucketWidth + gap;
                }
            }
            toolTip.Active = false;
            toolTip.SetToolTip(graphPanel, "");
        }
예제 #12
0
        private void exportMenuItem_Click(object sender, System.EventArgs e)
        {
            exportSaveFileDialog.FileName = "HistogramBySize.csv";
            exportSaveFileDialog.Filter   = "Comma separated files | *.csv";
            if (exportSaveFileDialog.ShowDialog() == DialogResult.OK)
            {
                StreamWriter w = new StreamWriter(exportSaveFileDialog.FileName);

                TypeDesc selectedType = FindSelectedType();

                string title = "Histogram by Size";
                if (selectedType != null)
                {
                    title += " of " + selectedType.typeName + " objects";
                }

                w.WriteLine(title);
                w.WriteLine();

                w.WriteLine("{0},{1},{2},{3},{4}", "Min Size", "Max Size", "# Instances", "Total Size", "Type");

                bool noBucketSelected = true;
                int  minSize          = 0;
                int  maxSize          = int.MaxValue;
                foreach (Bucket b in buckets)
                {
                    if (b.selected)
                    {
                        noBucketSelected = false;
                        minSize          = b.minSize;
                        maxSize          = b.maxSize;
                    }
                }
                foreach (Bucket b in buckets)
                {
                    if (noBucketSelected || b.selected)
                    {
                        foreach (DictionaryEntry d in b.typeDescToSizeCount)
                        {
                            TypeDesc  t         = (TypeDesc)d.Key;
                            SizeCount sizeCount = (SizeCount)d.Value;

                            if (selectedType == null || t == selectedType)
                            {
                                w.WriteLine("{0},{1},{2},{3},{4}", b.minSize, b.maxSize, sizeCount.count, sizeCount.size, t.typeName);
                            }
                        }
                    }
                }

                w.WriteLine();
                w.WriteLine();
                w.WriteLine("Raw data:");
                w.WriteLine();

                w.WriteLine("{0},{1},{2},{3}", "Instance Size", "# Instances", "Total Size", "Type");
                for (int i = 0; i < histogram.typeSizeStacktraceToCount.Length; i++)
                {
                    int   count      = histogram.typeSizeStacktraceToCount[i];
                    int[] stacktrace = histogram.readNewLog.stacktraceTable.IndexToStacktrace(i);
                    int   typeIndex  = stacktrace[0];
                    int   size       = stacktrace[1];

                    if (minSize <= size && size <= maxSize)
                    {
                        TypeDesc t = (TypeDesc)typeIndexToTypeDesc[typeIndex];

                        if (selectedType == null || t == selectedType)
                        {
                            w.WriteLine("{0},{1},{2},{3}", size, count, size * count, t.typeName);
                        }
                    }
                }

                w.Close();
            }
        }
 void AddToBuckets(TypeDesc t, int size, int count)
 {
     for (int i = 0; i < buckets.Length; i++)
     {
         if (buckets[i].minSize <= size && size <= buckets[i].maxSize)
         {
             ulong totalSize = (ulong)size*(ulong)count;
             buckets[i].totalSize += totalSize;
             SizeCount sizeCount;
             if (!buckets[i].typeDescToSizeCount.TryGetValue(t, out sizeCount))
             {
                 sizeCount = new SizeCount();
                 buckets[i].typeDescToSizeCount[t] = sizeCount;
             }
             sizeCount.size += totalSize;
             sizeCount.count += count;
             break;
         }
     }
 }
예제 #14
0
        private void DrawBuckets(Graphics g)
        {
            Debug.Assert(verticalScale != 0);
            bool noBucketSelected = true;

            Debug.Assert(bucketTable != null, "bucketTable != null");
            foreach (Bucket b in bucketTable)
            {
                if (b.selected)
                {
                    noBucketSelected = false;
                    break;
                }
            }
            int   x          = leftMargin;
            Brush blackBrush = Brushes.Black;

            foreach (Bucket b in bucketTable)
            {
                int y = graphPanel.Height - bottomMargin;
                if (b.minComment != null || b.maxComment != null)
                {
                    string lessOrGreater = "<";
                    double age           = b.maxAge;
                    string commentString = b.maxComment;
                    if (commentString == null)
                    {
                        lessOrGreater = ">";
                        age           = b.minAge;
                        commentString = b.minComment;
                    }
                    string s = string.Format("{0} {1} sec", lessOrGreater, FormatTime(age));
                    g.DrawString(s, font, blackBrush, x, y);
                    s = commentString;
                    if (g.MeasureString(s, font).Width > bucketWidth)
                    {
                        do
                        {
                            s = s.Substring(0, s.Length - 1);
                        }while (g.MeasureString(s, font).Width > bucketWidth);
                        s += "...";
                    }
                    g.DrawString(s, font, blackBrush, x, y + font.Height);
                    s = FormatSize(b.totalSize);
                    g.DrawString(s, font, blackBrush, x, y + 2 * font.Height);
                }
                else
                {
                    string s = string.Format("< {0} sec", FormatTime(b.maxAge));
                    g.DrawString(s, font, blackBrush, x, y);
                    s = FormatSize(b.totalSize);
                    g.DrawString(s, font, blackBrush, x, y + font.Height);
                }

                foreach (KeyValuePair <TypeDesc, SizeCount> d in b.typeDescToSizeCount)
                {
                    TypeDesc  t         = d.Key;
                    SizeCount sizeCount = d.Value;
                    int       height    = (int)(sizeCount.size / verticalScale);
                    y -= height;
                    bool cond = t.selected && (b.selected || noBucketSelected);
                    g.FillRectangle(cond ? blackBrush : t.brush, x, y, bucketWidth, height);
                }

                x += bucketWidth + gap;
            }
        }
예제 #15
0
        private int BuildBuckets(double timeScale, double maxAge)
        {
            int bucketCount = (int)Math.Ceiling(maxAge / timeScale);

            if (bucketTable == null || bucketTable.Length != bucketCount)
            {
                bucketTable = new Bucket[bucketCount];
                for (int i = 0; i < bucketTable.Length; i++)
                {
                    bucketTable[i].totalSize           = 0;
                    bucketTable[i].typeDescToSizeCount = new Hashtable();
                }

                if (typeIndexToTypeDesc == null || typeIndexToTypeDesc.Length < liveObjectTable.readNewLog.typeName.Length)
                {
                    typeIndexToTypeDesc = new TypeDesc[liveObjectTable.readNewLog.typeName.Length];
                }
                else
                {
                    foreach (TypeDesc t in typeIndexToTypeDesc)
                    {
                        if (t != null)
                        {
                            t.totalSize = 0;
                        }
                    }
                }
                double nowTime = liveObjectTable.readNewLog.TickIndexToTime(liveObjectTable.lastTickIndex);
                LiveObjectTable.LiveObject o;
                for (liveObjectTable.GetNextObject(0, int.MaxValue, out o); o.id < int.MaxValue; liveObjectTable.GetNextObject(o.id + o.size, int.MaxValue, out o))
                {
                    double allocTime   = liveObjectTable.readNewLog.TickIndexToTime(o.allocTickIndex);
                    double age         = nowTime - allocTime;
                    int    bucketIndex = (int)(age / timeScale);
                    bucketTable[bucketIndex].totalSize += o.size;
                    TypeDesc t = typeIndexToTypeDesc[o.typeIndex];
                    if (t == null)
                    {
                        t = new TypeDesc(liveObjectTable.readNewLog.typeName[o.typeIndex]);
                        typeIndexToTypeDesc[o.typeIndex] = t;
                    }
                    t.totalSize += o.size;
                    SizeCount sizeCount = (SizeCount)bucketTable[bucketIndex].typeDescToSizeCount[t];
                    if (sizeCount == null)
                    {
                        sizeCount = new SizeCount();
                        bucketTable[bucketIndex].typeDescToSizeCount[t] = sizeCount;
                    }
                    sizeCount.size  += o.size;
                    sizeCount.count += 1;
                }
            }

            int maxBucketSize = 0;

            foreach (Bucket b in bucketTable)
            {
                if (maxBucketSize < b.totalSize)
                {
                    maxBucketSize = b.totalSize;
                }
            }

            totalSize       = 0;
            sortedTypeTable = new ArrayList();
            foreach (TypeDesc t in typeIndexToTypeDesc)
            {
                if (t != null)
                {
                    sortedTypeTable.Add(t);
                    totalSize += t.totalSize;
                }
            }

            sortedTypeTable.Sort();

            return(maxBucketSize);
        }
예제 #16
0
        private ulong BuildBuckets(double timeScale, double maxAge)
        {
            ReadNewLog log = liveObjectTable.readNewLog;
            bool useMarkers = markersRadioButton.Checked;
            if (this.useMarkers != useMarkers)
            {
                this.useMarkers = useMarkers;
                bucketTable = null;
            }
            int bucketCount;
            if (useMarkers)
            {
                for (bucketCount = 0; bucketCount < log.commentEventList.count; bucketCount++)
                    if (log.commentEventList.eventTickIndex[bucketCount] >= liveObjectTable.lastTickIndex)
                        break;
                bucketCount++;
            }
            else
            {
                bucketCount = (int)Math.Ceiling(maxAge/timeScale);
                if (bucketCount == 0)
                    bucketCount = 1;
            }
            if (bucketTable == null || bucketTable.Length != bucketCount)
            {
                bucketTable = new Bucket[bucketCount];
                double nowTime = log.TickIndexToTime(liveObjectTable.lastTickIndex);
                double age = 0;
                for (int i = 0; i < bucketTable.Length; i++)
                {
                    bucketTable[i].totalSize = 0;
                    bucketTable[i].typeDescToSizeCount = new Dictionary<TypeDesc, SizeCount>();
                    bucketTable[i].minAge = age;
                    if (useMarkers)
                    {
                        int markerIndex = bucketTable.Length - i - 1;
                        if (i > 0)
                            bucketTable[i].minComment = log.commentEventList.eventString[markerIndex];
                        age = nowTime;
                        if (markerIndex > 0)
                        {
                            bucketTable[i].maxComment = log.commentEventList.eventString[markerIndex-1];
                            age -= log.TickIndexToTime(log.commentEventList.eventTickIndex[markerIndex-1]);                        
                        }
                    }
                    else
                    {
                        age += timeScale;
                    }
                    bucketTable[i].maxAge = age;
                }

                if (typeIndexToTypeDesc == null || typeIndexToTypeDesc.Length < log.typeName.Length)
                    typeIndexToTypeDesc = new TypeDesc[log.typeName.Length];
                else
                {
                    foreach (TypeDesc t in typeIndexToTypeDesc)
                    {
                        if (t != null)
                            t.totalSize = 0;
                    }
                }
                LiveObjectTable.LiveObject o;
                for (liveObjectTable.GetNextObject(0, ulong.MaxValue, out o); o.id < ulong.MaxValue; liveObjectTable.GetNextObject(o.id + o.size, ulong.MaxValue, out o))
                {
                    int bucketIndex;
                    double allocTime = log.TickIndexToTime(o.allocTickIndex);
                    age = nowTime - allocTime;
                    bucketIndex = (int)(age/timeScale);
                    if (bucketIndex >= bucketTable.Length)
                        bucketIndex = bucketTable.Length - 1;
                    else if (bucketIndex < 0)
                        bucketIndex = 0;
                    while (bucketIndex < bucketTable.Length - 1 && age >= bucketTable[bucketIndex].maxAge)
                        bucketIndex++;
                    while (bucketIndex > 0 && age < bucketTable[bucketIndex].minAge)
                        bucketIndex--;
                    bucketTable[bucketIndex].totalSize += o.size;
                    TypeDesc t = typeIndexToTypeDesc[o.typeIndex];
                    if (t == null)
                    {
                        t = new TypeDesc(log.typeName[o.typeIndex]);
                        typeIndexToTypeDesc[o.typeIndex] = t;
                    }
                    t.totalSize += o.size;
                    SizeCount sizeCount;
                    if (!bucketTable[bucketIndex].typeDescToSizeCount.TryGetValue(t, out sizeCount))
                    {
                        sizeCount = new SizeCount();
                        bucketTable[bucketIndex].typeDescToSizeCount[t] = sizeCount;
                    }
                    sizeCount.size += o.size;
                    sizeCount.count += 1;
                }
            }

            ulong maxBucketSize = 0;
            foreach (Bucket b in bucketTable)
            {
                if (maxBucketSize < b.totalSize)
                    maxBucketSize = b.totalSize;
            }

            totalSize = 0;
            sortedTypeTable = new ArrayList();
            foreach (TypeDesc t in typeIndexToTypeDesc)
            {
                if (t != null)
                {
                    sortedTypeTable.Add(t);
                    totalSize += t.totalSize;
                }
            }

            sortedTypeTable.Sort();

            return maxBucketSize;
        }
예제 #17
0
        private ulong BuildBuckets(double timeScale, double maxAge)
        {
            Debug.Assert(liveObjectTable != null, "liveObjectTable != null");
            ReadNewLog log        = liveObjectTable.readNewLog;
            bool       useMarkers = markersRadioButton.Checked;

            if (this.useMarkers != useMarkers)
            {
                this.useMarkers = useMarkers;
                bucketTable     = null;
            }
            int bucketCount;

            if (useMarkers)
            {
                for (bucketCount = 0; bucketCount < log.commentEventList.count; bucketCount++)
                {
                    if (log.commentEventList.eventTickIndex[bucketCount] >= liveObjectTable.lastTickIndex)
                    {
                        break;
                    }
                }

                bucketCount++;
            }
            else
            {
                bucketCount = (int)Math.Ceiling(maxAge / timeScale);
                if (bucketCount == 0)
                {
                    bucketCount = 1;
                }
            }
            if (bucketTable == null || bucketTable.Length != bucketCount)
            {
                bucketTable = new Bucket[bucketCount];
                double nowTime = log.TickIndexToTime(liveObjectTable.lastTickIndex);
                double age     = 0;
                for (int i = 0; i < bucketTable.Length; i++)
                {
                    bucketTable[i].totalSize           = 0;
                    bucketTable[i].typeDescToSizeCount = new Dictionary <TypeDesc, SizeCount>();
                    bucketTable[i].minAge = age;
                    if (useMarkers)
                    {
                        int markerIndex = bucketTable.Length - i - 1;
                        if (i > 0)
                        {
                            bucketTable[i].minComment = log.commentEventList.eventString[markerIndex];
                        }

                        age = nowTime;
                        if (markerIndex > 0)
                        {
                            bucketTable[i].maxComment = log.commentEventList.eventString[markerIndex - 1];
                            age -= log.TickIndexToTime(log.commentEventList.eventTickIndex[markerIndex - 1]);
                        }
                    }
                    else
                    {
                        age += timeScale;
                    }
                    bucketTable[i].maxAge = age;
                }

                if (typeIndexToTypeDesc == null || typeIndexToTypeDesc.Length < log.typeName.Length)
                {
                    typeIndexToTypeDesc = new TypeDesc[log.typeName.Length];
                }
                else
                {
                    foreach (TypeDesc t in typeIndexToTypeDesc)
                    {
                        if (t != null)
                        {
                            t.totalSize = 0;
                        }
                    }
                }
                LiveObjectTable.LiveObject o;
                for (liveObjectTable.GetNextObject(0, ulong.MaxValue, out o); o.id < ulong.MaxValue; liveObjectTable.GetNextObject(o.id + o.size, ulong.MaxValue, out o))
                {
                    double allocTime = log.TickIndexToTime(o.allocTickIndex);
                    age = nowTime - allocTime;
                    int bucketIndex = (int)(age / timeScale);
                    if (bucketIndex >= bucketTable.Length)
                    {
                        bucketIndex = bucketTable.Length - 1;
                    }
                    else if (bucketIndex < 0)
                    {
                        bucketIndex = 0;
                    }

                    while (bucketIndex < bucketTable.Length - 1 && age >= bucketTable[bucketIndex].maxAge)
                    {
                        bucketIndex++;
                    }

                    while (bucketIndex > 0 && age < bucketTable[bucketIndex].minAge)
                    {
                        bucketIndex--;
                    }

                    bucketTable[bucketIndex].totalSize += o.size;
                    TypeDesc t = typeIndexToTypeDesc[o.typeIndex];
                    if (t == null)
                    {
                        t = new TypeDesc(log.typeName[o.typeIndex]);
                        typeIndexToTypeDesc[o.typeIndex] = t;
                    }
                    t.totalSize += o.size;
                    SizeCount sizeCount;
                    if (!bucketTable[bucketIndex].typeDescToSizeCount.TryGetValue(t, out sizeCount))
                    {
                        sizeCount = new SizeCount();
                        bucketTable[bucketIndex].typeDescToSizeCount[t] = sizeCount;
                    }
                    sizeCount.size  += o.size;
                    sizeCount.count += 1;
                }
            }

            ulong maxBucketSize = 0;

            foreach (Bucket b in bucketTable)
            {
                if (maxBucketSize < b.totalSize)
                {
                    maxBucketSize = b.totalSize;
                }
            }

            totalSize       = 0;
            sortedTypeTable = new List <TypeDesc>();
            Debug.Assert(typeIndexToTypeDesc != null);
            foreach (TypeDesc t in typeIndexToTypeDesc)
            {
                if (t != null)
                {
                    sortedTypeTable.Add(t);
                    totalSize += t.totalSize;
                }
            }

            sortedTypeTable.Sort();

            return(maxBucketSize);
        }