###### tags: `c#` # Bit演算や条件式の排除、Parallel化をするとどれくらい早くなるのかの検証 *Mono+il2cppパターンで検証 ## 検証するコード 1. ふつうのコード ```csharp int sum = 0; foreach (int number in ia1)//forも同様に検証 { if (number % 2 != 0) { sum += number; } } ``` 2. Bit ```csharp int buffer = 0; for (int i = 0; i < ia1.Length; i++) { var element = ia1[i]; if ((element & 1) == 1) buffer += element; } int sum = buffer; ``` 3. 条件分岐をなくす ```csharp int buffer = 0; for (int i = 0; i < ia1.Length; i++) { var element = ia1[i]; var odd = element & 1; buffer += (odd * element); } int sum = buffer; ``` 4. Parallel ```csharp int bufferA = 0; int bufferB = 0; fixed (int* data = &ia1[0]) { var p = (int*)data; for (int i = 0; i < ia1.Length; i += 2) { bufferA += (p[0] & 1) * p[0]; bufferB += (p[1] & 1) * p[1]; p += 2; } } int sum = bufferA + bufferB; ``` ## 速度の検証結果 ![](https://i.imgur.com/m8XLPQz.png) ## まとめ Parallel化したコードはParallel化していないコードと比べると2倍近く早い 条件分岐をなくすことは測度に非常に貢献してくれる 状況にもよると思うが今回のケースではbit演算の方が若干遅い(ぶれあり)