c# - 有没有更有效的方法将 double 转换为 float?

标签 c# performance

我需要将多维 double 组转换为锯齿状 float 组。大小将从 [2][5] 到大约 [6][1024] 不等。

我很好奇如何将 double 循环并转换为 float ,这还不错,对于 [2][5] 数组大约需要 225µs - 这是代码:

const int count = 5;
const int numCh = 2;
double[,] dbl = new double[numCh, count];
float[][] flt = new float[numCh][];

for (int i = 0; i < numCh; i++)
{
    flt[i] = new float[count];
    for (int j = 0; j < count; j++)
    {
        flt[i][j] = (float)dbl[i, j];
    }
}

但是,如果有更有效的技术,我想使用它们。我应该提到我只对两个嵌套循环计时,而不是它之前的分配。

经过更多的实验,我认为 99% 的时间都花在了循环上,即使没有分配!

最佳答案

这会运行得更快,对于小数据不值得做 Parallel.For(0, count, (j) => 它实际上对于非常小的数据运行相当慢,这就是为什么我已将该部分注释掉。

double* dp0;
float* fp0;

fixed (double* dp1 = dbl)
{
    dp0 = dp1;

    float[] newFlt = new float[count];
    fixed (float* fp1 = newFlt)
    {
        fp0 = fp1;
        for (int i = 0; i < numCh; i++)
        {
            //Parallel.For(0, count, (j) =>
            for (int j = 0; j < count; j++)
            {
                fp0[j] = (float)dp0[i * count + j];
            }
            //});
            flt[i] = newFlt.Clone() as float[];
        }
     }
  }

这运行得更快,因为双重访问双重数组 [,] 由于数组边界检查,在 .NET 中确实很费力。 newFlt.Clone() 只是意味着我们不会一直修复和取消修复新指针(因为这样做会产生轻微的开销)

您需要使用 unsafe 代码标签运行它并使用 /UNSAFE 编译

但实际上,您应该使用接近 5000 x 5000 而不是 5 x 2 的数据运行,如果某件事花费的时间少于 1000 毫秒,您需要添加更多循环或增加数据,因为在那个级别 cpu 事件会出现轻微峰值会给您的分析添加很多噪音。

关于c# - 有没有更有效的方法将 double 转换为 float?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7671700/

相关文章:

c# - PerfView:分析应用程序的性能,包括数据库调用

c# - 如何选择相邻座位?座位表

c# - 实现领域驱动设计

performance - 在 Kubernetes 中并置 pod

c++ - 根据时钟滴答测量算法运行时间

c# - SQL 服务器 : randomize rows (shuffle IDs)

c# - Java 和 C# 之间的桥梁

mysql - SQL 中的 JOIN 的成本如何?和/或,性能和标准化之间的权衡是什么?

android - 在生成 .aar 文件的 Gradle 项目中添加依赖项

谷歌 Go 的表现如何?