代码之家  ›  专栏  ›  技术社区  ›  AMissico

如何知道在.NET的大对象堆(LOH)中分配了一个结构数组?

  •  0
  • AMissico  · 技术社区  · 16 年前

    在使用CLR Profiler进行了一些实验之后,我发现:

    Node[,] n = new Node[100,23]; //'84,028 bytes, is not placed in LOH
    Node[,] n = new Node[100,24]; //'86,428 bytes, is 
    
        public struct Node {
            public int Value;
            public Point Point;
            public Color Color;
            public bool Handled;
            public Object Tag;
        }
    

    3 回复  |  直到 16 年前
        1
  •  2
  •   Matt Dearing    16 年前
        2
  •  1
  •   Dean Harding    16 年前

    从你的评论来看,我不认为你真的需要知道这个物体是否会进入LOH。当您真正想做的只是在用户输入一个“太大”的值时向用户显示一个警告时,这是否是导致应用程序减速的真正原因是无关紧要的。

    至于您的实际性能问题,您可以简单地分配一堆“较小”的一维数组,而不是分配一个大的二维数组。而不是:

    Node[,] n = new Node[100,100]; // this will go the LOH
    

    Node[][] n = new Node[100][];
    for(int i = 0; i < n.Length; i++) {
        n[i] = new Node[100];  // none of these will be on the LOH
    }
    

    总的节点数还是相同的,但是LOH上什么也没有。就我个人而言,我想你可能会发现,其实表演不会有太大的不同,但也许值得一试。

        3
  •  1
  •   user492238    15 年前

    你可以在分配后马上找到。使用GC.GetGeneration生成(object)重载以获取生成编号,对象位于。对于LOH这将是2。

    Node[,] n = new Node[100,23]; 
    // GC.GetGeneration(n) should give 0
    Node[,] n = new Node[100,24]; 
    // GC.GetGeneration(n) should give 2