我需要将多维双精度数组转换为交错浮点数组。大小将从2到6左右变化。
我很好奇如何循环并将双精度数转换为浮点数,这并不是太糟糕,对于2数组来说大约是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%的时间都是在循环上消耗的,即使没有赋值!
发布于 2011-10-06 22:18:55
这会运行得更快,对于小的数据,不值得做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的数据运行,如果需要的时间少于1000ms,则需要添加更多循环或增加数据,因为在该级别上,cpu活动的小峰值可能会给评测添加大量噪声。
发布于 2011-10-06 16:36:30
在你的例子中-我认为你不会像数组访问那样测量双精度/浮点数比较(这应该是处理器内部指令)(它有很多重定向加上明显的……aray分隔符检查(用于边界的数组索引异常)。
我建议在不使用数组的情况下执行测试。
发布于 2011-10-06 16:42:17
如果您可以在您的案例中也使用列表,则可以使用LINQ方法:
List<List<double>> t = new List<List<double>>();
//adding test data
t.Add(new List<double>() { 12343, 345, 3, 23, 2, 1 });
t.Add(new List<double>() { 43, 123, 3, 54, 233, 1 });
//creating target
List<List<float>> q;
//conversion
q = t.ConvertAll<List<float>>(
(List<double> inList) =>
{
return inList.ConvertAll<float>((double inValue) => { return (float)inValue; });
}
);如果它更快,你必须测量你自己。(怀疑)但你可以将它并行化,这可能会使它紧固(PLINQ)
https://stackoverflow.com/questions/7671700
复制相似问题