操作多字节数组的更快方法

时间:2018-11-29 09:14:19

标签: c# arrays

我有这个:

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。

但是,它很慢。

有没有一种更快的方法来完成上述操作?

2 个答案:

答案 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;