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

时间:2011-04-23 17:50:00

标签: c# .net vb.net function

System.Func确实拥有多少内存?

如果System.Func是1行或1000行,有什么区别吗?

4 个答案:

答案 0 :(得分:12)

函数功能<>是委托类型,实例在x86抖动中占用32个字节的存储空间:

  • 对象标题的8个字节
  • Delegate._methodBase字段的4个字节
  • Delegate._methodPtr字段的4个字节
  • Delegate._methodPtrAux字段的4个字节
  • Delegate._target字段的4个字节
  • MulticastDelegate._invocationCount字段的4个字节
  • MulticastDelegate._invocationList字段的4个字节

目标方法大小不相关,委托对象只存储方法的地址。

答案 1 :(得分:7)

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

我想在这里关注两个不同的内存:

  1. 分配用于保存代码的内存
  2. 通过代码分配的内存
  3. 第一部分由JITter分配,这肯定与方法中的代码量有关。但是,如果您决定将该方法扩展到多个方法(您应该这样做,方法不应该是千行,更不用说50个),那么您还将通过这些方法分散内存。事实上,每种方法可能有一定数量的开销,所以从这个角度来看,如果你使用的方法多于一个大的方法,它最终可能会为JITted代码使用更多的内存,但这是无关紧要的。拆分它。严重。

    第二块内存是代码在执行时分配的内容。这当然完全取决于代码的作用,因此没有办法说一种方法比仅根据行数判断的方法更好。 1000行方法可能不会分配太多,而1行方法可能会分配很多。除非通过检查实际代码,否则无法分辨。

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

    但是,在调试期间,该变量的生命周期延长到持续到示波器/方法结束,因此如果您在代码中不再使用该变量的那部分某处停止该程序,则可以仍检查其内容。

    所以,总结一下:

    1. 较长的方法可能需要比较短的方法更多的JITted内存,但除非您实际上可以删除代码,而不是仅仅移动它并将其拆分,这是不相关的。 写短文。
    2. 该方法分配的内存与行数无关,而与这些行的内容无关。
    3. 现在,对于System.Func<T...>,这只是一个指向小对象的指针。该对象的大小将取决于它所引用的func /方法的参数数量(如果我没记错),但是它不依赖于方法,代码或内存分配的大小等等。 / p>

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

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

答案 2 :(得分:3)

System.Func只是一个委托,put只保存一个指向函数的指针列表,因此System.Func占用的内存量相对于分配给它的函数委托数是恒定的它实际指向的函数大小。

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

答案 3 :(得分:1)

我不知道它有多大帮助,但使用它我们可以了解进程的内存使用情况

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

不,我不认为它有1或1000行有任何区别。您可以使用分析器。下载您的工具包分析器并附上您的应用程序,然后您可以看到您的代码的内存使用情况,我认为这将有助于您...................