将int []数组写入byte []数组的最快方法是什么,但只有LSB(最后8位)?我使用for
循环和位掩码bArray[i] = (byte)(iArray[i] & 0xFF)
,但数组很长(+ 900k),这需要大约50ms。你知道其他更快的选择吗?
答案 0 :(得分:1)
您可以尝试并行化工作负载:
Parallel.For(0,iArray.Length, i => bArray[i] = (byte)(iArray[i] & 0xFF));
这会产生多个线程来进行转换。它趋于在我的机器上更快,但是,由于产生多个线程的开销,有时需要更长的时间。
你在做什么50ms太慢了?
答案 1 :(得分:1)
部分缓慢来自于需要阅读超出您需要的数据:当您执行
时array[i] & 0xFF
你读了int
的整个四个字节,只删掉了三个最重要的字节。
使用不安全的代码可以避免这种开销。请记住,下面的方法假设小端架构:
static unsafe void CopyLsbUnsafe(int[] from, byte[] to) {
fixed (int* s = from) {
fixed (byte* d = to) {
byte* sb = (byte*) s;
int* db = (int*)d;
int* end = db + to.Length/4;
while (db != end) {
*db++ = (*(sb + 0) << 0)
| (*(sb + 4) << 8)
| (*(sb + 8) << 16)
| (*(sb + 12) << 24);
sb += 16;
}
}
}
}
上面的代码将int
数组重新解释为字节数组,将字节数组重新解释为整数数组。然后它使用指针将每个第4个字节读入目标数组,使用整数赋值以4个字节为一组写入目标。
我的测试表明,与简单的循环相比,可以获得60%的显着改善。