我有一个包含1M浮点数的浮点数组
我想做抽样:对于每4个花车,我只想采取1.所以我这样做:
for(int i = 0; i< floatArray.Length; i++) {
if(i % 4 == 0) {
resultFloat.Add(floatArray[i])
}
}
这样可以正常工作,但是需要花费很多时间来运行所有元素,是否有其他方法可以使其具有更好的结果(如果有的话)
答案 0 :(得分:6)
每次迭代只需将循环增加4而不是1:
for(int i = 0; i< floatArray.Length; i+=4)
{
resultFloat.Add(floatArray[i]);
}
答案 1 :(得分:6)
我可以看到两个可能会降低性能的因素。
正如您已经提供的那样,您应该将步骤设置为4:
for (int i = 0; i < floatArray.Length; i += 4)
{
resultFloat.Add(floatArray[i]);
}
看起来resultFloat
是float
的列表。我建议使用数组而不是列表,如下所示:
int m = (floatArray.Length + 3) / 4;
float[] resultFloat = new float[m];
for (int i = 0, k = 0; i < floatArray.Length; i += 4, k++)
{
resultFloat[k] = floatArray[i];
}
答案 2 :(得分:1)
如果你真的遇到性能问题,那么你最好不要使用动态容器来获得结果,而是使用静态大小的数组。
float[] resultFloat = new float[(floatArray.Length + 3) >> 2];
for(int i = 0; i < resultFloat.Length; i++)
resultFloat[i] = floatArray[i << 2];
通常,性能不是一个问题,你不应该优化,直到一个分析器给你证明你应该这样做。在所有其他情况下,可读的代码更易读。
答案 3 :(得分:0)
只是要添加另一个选项,如果您希望这个选项最快,请使用Parallel.For
而不是正常的for循环。
int resultLength = (floatArray.Length + 3) / 4;
var resultFloat = new float[resultLength];
Parallel.For(0, resultLength, i =>
{
resultFloat[i] = floatArray[i * 4];
});
答案 4 :(得分:-2)
List<decimal> list = new List<decimal>();
list.Add(1);
list.Add(2);
list.Add(3);
list.Add(4);
list.Add(5);
list.Add(6);
list.Add(7);
list.Add(8);
list.Add(9);
list.Add(10);
list.Add(11);
list.Add(12);
list.Add(13);
list.Add(14);
list.Add(15);
list.Add(16);
var sampleData = list.Where((x, i) => (i + 1) % (4) == 0).ToList();