为什么在 .NET 7 中使用带有泛型的 lambda 在 WebAssembly 中这么慢?

问题描述 投票:0回答:1

以下方法在 WebAssembly (WASM) 中运行得非常快:

public static int SumInt(int[] vals)
{
    int sum = default;

    for (int i = 0; i < vals.Length; i++)
        sum += vals[i];

    return sum;
}

对于我给出的输入,计算总和大约需要 70 毫秒。

在尝试使此方法通用(以便处理其他类型)时,我写了以下内容:

public static T Sum<T>(T[] vals, Func<T, T, T> add) where T : struct
{
    T sum = default;

    for (int i = 0; i < vals.Length; i++)
        sum = add(sum, vals[i]);

    return sum;
}

因此对于整数,我可以定义以下方法:

public static int Sum(int[] vals) => Sum(vals, (x, y) => x + y);

但是,对于与之前相同的输入,计算总和需要大约 1000 毫秒。

当我不在 WebAssembly 中运行此代码而是在 .NET 应用程序中运行此代码时,它们花费的时间大约相同。

对正在发生的事情有任何想法或改进代码以便以高性能方式处理其他类型(但也避免代码重复)的建议吗?

更多详情

通过上面的通用

Sum
,我还可以为其他特定类型定义它:

public static float Sum(float[] vals) => Sum(vals, AddOp);

public static double Sum(double[] vals) => Sum(vals, AddOp);
c# .net generics webassembly
1个回答
0
投票

我只是有点困惑为什么你不只使用内置的 Sum。除非有一些非数字类型,否则您想总结一下您没有告诉我们仅使用有什么问题:

int[] inar = new int[7];
double[] doar = new double[7];
float[] flar = new float[7];
decimal[] dear = new decimal[7];
long[] loar = new long[7];

int insum = inar.Sum();
double dosum = doar.Sum();
float flsum = flar.Sum();
decimal desum = dear.Sum();
long losum = loar.Sum();

© www.soinside.com 2019 - 2024. All rights reserved.