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