2011-04-23 47 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的內存使用情況線。你可以使用這個分析器。下載你的工具包分析器並附上你的應用程序,之後你可以看到你的代碼的內存使用情況,我認爲這對你有幫助...................