我有这个:
var data = new byte[100,100,1];
//data is populated from external source
for (var h = 0; h < 100 ; h++)
{
for (var w = 0; w < 100; w++)
{
if (Data[h, w, 0] > 10)
{
Data[h, w, 0] = 255;
}
}
}
我只是说值是否大于10,然后将其更改为255。
但是,它很慢。
有没有一种更快的方法来完成上述操作?
答案 0 :(得分:5)
您还可以将其与unsafe
和 Pointers 混合使用。但是,您需要跳过更多的循环。它在带指针的释放模式下应该会给您带来一些性能
// p is because you cant used fixed in a lambda
public static unsafe byte* p;
// AggressiveInlining to compile in line if possible
[MethodImpl(MethodImplOptions.AggressiveInlining)]
public static unsafe void DoOp(int i)
{
if (*(p + i) > 10) *(p + i) = 255;
}
public static unsafe void Main()
{
int x = 10, y = 10, z = 1;
var data = new byte[x, y, z];
fixed (byte* pbytes = data)
{
p = pbytes;
Parallel.For(0, x * y,
new ParallelOptions() { MaxDegreeOfParallelism = Environment.ProcessorCount},
DoOp);
}
}
答案 1 :(得分:3)
您可以对外部for loop
执行并行操作,以提高性能。
var Data = new byte[100,100,1];
//data is populated from external source
// Parallelize the outer loop for h
Parallel.For(0, 100, h=>
{
for (var w = 0; w < 100; w++)
{
if (Data[h, w, 0] > 10)
{
Data[h, w, 0] = 255;
}
}
});
注意:您必须在源代码中包含using System.Threading.Tasks;
。