c#int[]数组到byte[]数组仅限LSB
将int[]数组写入byte[]数组的最快方法是什么,但只写入LSB(最后8位)?我将c#int[]数组到byte[]数组仅限LSB,c#,arrays,algorithm,type-conversion,C#,Arrays,Algorithm,Type Conversion,将int[]数组写入byte[]数组的最快方法是什么,但只写入LSB(最后8位)?我将用于循环和位掩码bArray[I]=(字节)(iArray[I]&0xFF),但数组非常长(+900k),这大约需要50ms。您知道其他更快的选择吗?您可以尝试并行化工作负载: Parallel.For(0,iArray.Length, i => bArray[i] = (byte)(iArray[i] & 0xFF)); 这将产生多个线程来进行转换。在我的机器上它往往更快,但是,由于产生多个线
用于
循环和位掩码bArray[I]=(字节)(iArray[I]&0xFF)
,但数组非常长(+900k),这大约需要50ms。您知道其他更快的选择吗?您可以尝试并行化工作负载:
Parallel.For(0,iArray.Length, i => bArray[i] = (byte)(iArray[i] & 0xFF));
这将产生多个线程来进行转换。在我的机器上它往往更快,但是,由于产生多个线程的开销,有时需要更长的时间
50ms太慢了,你在做什么?部分慢是因为需要读取比需要更多的数据:当你这样做的时候
array[i] & 0xFF
您读取了一个int
的全部四个字节,但只删除了三个最重要的字节
您可以使用不安全的代码来避免这种开销。请记住,以下方法采用的是little endian体系结构:
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;
}
}
}
}
静态不安全void CopyLsbUnsafe(int[]from,byte[]to){
固定(int*s=from){
固定(字节*d=to){
字节*sb=(字节*)s;
int*db=(int*)d;
int*end=db+to.Length/4;
while(db!=结束){
*db++=(*(sb+0)你是说你想把int数组中每个int的LSB放到byte数组中吗?你需要以50毫秒的速度处理将近100万个项目…你有没有想过要并行到一个GPU?除此之外,我认为你可能会遇到CPU限制here@bpgeck是,整数数组到字节数组中每个整数的LSB。即,16位I的200个LSB值nt数组到200个值的8位字节数组。@drew_w我知道这是非常大的数据量,但我想知道C#中最快的选项。根据下面的注释,如果您正在处理图像数据,最好的选项是使用诸如BitBlt和MemCpy()之类的低级操作系统指令。这些可以通过PInvoke调用,并应提供最佳性能。希望这会有所帮助!我想显示图像阵列,但我的函数只需要字节作为参数-256灰度就足够了,并且比16位快。