簡體   English   中英

如何在不使用委托的情況下將方法作為參數傳遞並立即調用它?

[英]How to pass a method as a parameter without using delegates and call it instantly?

簡而言之:我想將任何方法傳遞給靜態方法並從那里調用它,但我對委托不滿意,因為它們不是立即執行的,它們有延遲。 我需要代碼行的完美排序。

詳細信息:例如,如果我嘗試通過將一些被測方法作為委托傳遞來執行手動內存分析,它會失敗,顯示 0 KB 的已分配內存,因為委托沒有在代碼中按順序執行,就像正常的函數調用一樣:

public static void RunMethod(Action function)
{
    long beforeMemory = GC.GetTotalMemory(true);
    function.Invoke();
    long afterMemory = GC.GetTotalMemory(true);
    
    GD.Print("GetTotalMemory = " + (double)beforeMemory / 1024 + " - " + (double)afterMemory / 1024 + " = " + (double)(afterMemory - beforeMemory) / 1024 + " kb");
}

我得到 0 kb 分配,function.Invoke() 之前和之后的內存仍然是 316 kb:

GetTotalMemory = 316.9453125 - 316.9453125 = 0 kb

我正在考慮將函數的名稱和對類實例的引用傳遞給方法,然后僅使用引用來查找所需的函數並調用它。 如何更有效地做到這一點? 有什么方法可以不使用字符串直接傳遞方法嗎? 我不喜歡 String,因為這會導致額外的內存分配。 還是有更好的解決方案來滿足我的需求?


我正在使用的委托示例:

using Godot;
using System;

namespace Test.Perfomance_GC_Allocation_Measure
{
    public partial class Test : Node
    {
        public override void _Process(double delta)
        {
            if(Input.IsActionJustPressed("ui_right"))
            {
                Tools.Profiling.RunMethod(DoTest0);
            }
        }


        public void DoTest0()
        {
            ushort[] collection = new ushort[1000000];
        }
    }
}
using Godot;
using System;
using System.Diagnostics;

namespace Tools
{
    public class Profiling
    {
        static Stopwatch sw = new Stopwatch();

        public static void RunMethod(Action function)
        {
            long before_GetTotalMemory = GC.GetTotalMemory(true);
            function.Invoke();
            long after_GetTotalMemory = GC.GetTotalMemory(true);
            
            GD.Print("GetTotalMemory = " + (double)before_GetTotalMemory / 1024 + " - " + (double)after_GetTotalMemory / 1024 + " = " + (double)(after_GetTotalMemory - before_GetTotalMemory) / 1024 + " kb");
        }
    }
}

感謝評論中的幫助,我想通了:

1 . 代表立即被處決。

2 . 我弄亂了GC.GetTotalMemory(true)中的參數值。 “true”參數等待垃圾收集發生。 這就是為什么當調用序列返回到我的RunMethod時,內存已經被清除並顯示為 0 kb。 使用“false”參數是正確的。

3 . 對於內存分析,最好使用GC.GetTotalAllocatedBytes而不是GC.GetTotalMemory

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM