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, ""); }
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(); } }
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++; }
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(); } }
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); } }
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; } } }
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; } }
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; } }
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; } } }
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; } } }
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, ""); }
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; } } }
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; } }
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); }
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; }
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); }