[英]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.