2011-04-23 85 views
5

System.Func具有多少内存?C#vb:System.Func需要多少内存?

如果System.Func是1行或1000行,是否有区别?

+2

System.Func只是一个指向编译代码的指针。为了得到一个大概的想法,在添加代码之前和之后查看DLL的大小。 :) – 2011-04-23 17:52:54

回答

8

FUNC <>是委托类型,一个实例需要32个字节的存储空间在x86抖动:用于Delegate._methodBase字段

  • 8字节为目标首标的
  • 4字节
  • 4个字节用于Delegate._methodPtr字段
  • Delegate._methodPtrAux字段的4个字节
  • 4个字节用于Delegate._target字段
  • 4个字节用于MulticastDelegate._invocationCount字段
  • 为MulticastDelegate._invocationList字段

目标方法大小

  • 4个字节是不相关的,则委托对象只存储该方法的地址。

  • +0

    invocationCount(并列出)它被调用了多少次或者有多少事情指向它的计数? (还是别的?) – Hogan 2011-04-24 01:02:40

    +0

    代表指向了多少个目标。它被事件使用。 – 2011-04-24 09:00:26

    +0

    哦,我想这个改变了..我记得有一个prev字段会先执行。 – Hogan 2011-04-24 18:32:08

    7

    这个问题在很多层面上都有答案,我担心你不会得到一个真正的100%准确的答案,但是在这里。

    有两种不同的内存条我想在这里重点:

    1. 分配给持有
    2. 的内存分配代码

    第一个代码中的内存一块是由JITter分配的,这肯定与该方法中的代码量有关。但是,如果您决定将这种方法分散在多种方法中(您应该这样做,一种方法不应该是一千行,更不用说50),那么您也将通过这些方法分散内存。实际上,每种方法可能会有一定的开销,所以有鉴于此,如果使用更多的方法而不是一个大的方法,它可能会最终为JITted代码使用更多的内存,但这是无关紧要的。拆分它。认真。

    第二块内存是代码在执行时分配的任何内容。这当然完全取决于代码的作用,所以没有办法说一种方法比另一种方法更好地仅根据行数来判断。 1000行方法可能分配不多,而1行方法可能分配很多。除了通过检查实际的代码之外,没有办法告诉。

    此外,在调试器外部运行的发布模式构建中,垃圾收集器非常具有侵略性,因此在方法的顶部声明了一个变量,填充了一个数据结构,然后在该方法因为它可以鸟瞰你的代码,所以GC可以回收它。它可以“看到”该变量不再被使用,因此收集其中的任何内容是安全的。

    但是,在调试期间,该变量的生命被人为地延长到了范围/方法的末尾,因此,如果您停止程序中不再使用该变量的那部分代码的某个地方,您仍然可以检查其内容。

    因此,得出结论:

    1. 更长的方法可能会需要更多的即时编译的内存比一个更短的方法来保存,但是除非你其实可以删除代码,而不是仅仅移它周围,分裂起来,这是不相关的。 写简短的方法。
    2. 该方法分配的内存与行数无关,而与这些行的内容无关。

    现在,至于System.Func<T...>,这只是一个指向小对象的指针。该对象的大小将取决于参数的数量(如果我正确地记得)它所引用的func /方法,但除此之外,它不依赖于方法,代码或内存分配或内存的大小。

    正如@Marc指出的那样,.NET中的委托是启用多播的。这是使用一系列对象解决的,所以使用的内存也将取决于该链中元素的数量。

    不要担心使用代表。它们相当便宜,无论是CPU还是内存方面。

    +0

    另外;认为“多播” – 2011-04-23 18:05:54

    +0

    啊,是的,忘了这一点。 – 2011-04-23 18:43:38

    3

    System.Func仅仅是一个代表,它把简单地保持指针的功能的列表,以便由System.Func占用的存储器的量是相对于分配给它无论函数的大小的函数代表的多个恒定它实际上指向。

    另一方面,它自身的函数会根据代码的物理行和代码实际执行的操作而具有不同的内存要求。后者是您应该关注的已实现函数的内存分配要求和算法效率。

    1

    我不知道有多少帮助,但利用这一点,我们可以知道一个进程

    int memory; 
    Process[] application; 
    application = Process.GetProcessesByName("MyApplication.exe"); 
    applicationMemory = application[0].PrivateMemorySize; 
    Console.WriteLine("Memory used: {0}.", applicationMemory); 
    

    不,我不认为有什么区别要么有1个或1000的内存使用情况线。你可以使用这个分析器。下载你的工具包分析器并附上你的应用程序,之后你可以看到你的代码的内存使用情况,我认为这对你有帮助...................