c#int [] array to byte [] array only LSB

时间:2016-02-04 00:11:57

标签: c# arrays algorithm type-conversion

将int []数组写入byte []数组的最快方法是什么,但只有LSB(最后8位)?我使用for循环和位掩码bArray[i] = (byte)(iArray[i] & 0xFF),但数组很长(+ 900k),这需要大约50ms。你知道其他更快的选择吗?

2 个答案:

答案 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%的显着改善。