1

我有以下问题:我需要测试具有最高速度性能的算法列表(~300)。

由于每一个都是独一无二的,我将它们创建为静态类并制作了如下所示的 execute() 函数。

每个都有一些固定的参数(相同的数量),最终我可以将其设为 consts;

我能够获得一个 execute() 方法列表,创建一个委托并运行它。

现在在 CI 中会生成一些函数指针,仅此而已。

制作一个函数指针数组。

如何获得整个静态对象的委托,而不仅仅是特定方法?

实际上我需要它们的列表或数组。

我宁愿在初始化()中做一些繁重的工作,比如反射,所以我可以拥有最大值。execute() 运行时的性能;

现在我不确定这是最好的方法,我不是 C# 专家。

感谢您的建议。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Text;
using System.Threading.Tasks;

namespace test
{
  public static class algorithms
  {
    public static void initialize()
    {

      List<Type> types = typeof(algorithms).GetNestedTypes(BindingFlags.Public | BindingFlags.Static).ToList();

      foreach ( Type t in types )
      {
        var method = t.GetMethod("Execute");

        var execute = (Func<int, int>)Delegate.CreateDelegate(typeof(Func<int, int>), null, method);

        int reply = execute(0x12345678); // I was able to obtain *ptr to execute() for each one

        // how can I obtain a *ptr to entire object in order to access it's members too ?
      }
    }

    // list of ~300 algorithms, unique (so no need to have instances)

    public static class alg1
    {
      public static string Name;      // each share the same parameters
      public static string Alias;

      public static int Execute(int data)     // the same execute function
      {
        // but different processing for each algorithm
        return 1;
      }
    }

    public static class alg2
    {
      public static string Name;
      public static string Alias;

      public static int Execute(int data)
      {
        return 2;
      }
    }

    public static class alg3
    {
      public static string Name;
      public static string Alias;

      public static int Execute(int data)
      {
        return 3;
      }
    }

  }
}
4

1 回答 1

3

现在在 CI 中会生成一些函数指针,仅此而已。创建一个函数指针数组。

在 C# List<Func<int,int>>中是你想要的。

如何获得整个静态对象的委托,而不仅仅是特定方法?实际上我需要它们的列表或数组。

那将是List<Type>。静态类永远不会只有一个类型的“对象”。

或者,在 C# 中对此进行建模的更自然的方法是使每个算法成为非静态类型,然后您可以让它们都继承基类或接口,例如:

public abstract class Algorithm
{
    public static string Name;      // each share the same parameters
    public static string Alias;
    public abstract int Execute(int data);
}
public class alg1 : Algorithm
{
    public override int Execute(int data)     // the same execute function
    {
        // but different processing for each algorithm
        return 1;
    }
}

然后你可以使用List<Algorithm>并且可以编写类似的东西

foreach (var a in algorithms)
{
   var result = a.Execute(3);
}
于 2021-08-27T16:40:26.027 回答