Что является самым быстрым способом записи массива int [] в массив byte [], но только LSB (последние 8 бит)? Я использовал for
цикл и битмаску bArray[i] = (byte)(iArray[i] & 0xFF)
, но массив очень длинный (+ 900k), и это занимает около 50 мс. Вы знаете, может быть, другой более быстрый вариант?C# int [] array to byte [] array only LSB
ответ
Вы можете попробовать распараллеливания нагрузки:
Parallel.For(0,iArray.Length, i => bArray[i] = (byte)(iArray[i] & 0xFF));
Это будет порождать несколько потоков, чтобы сделать преобразование. Он склоняется к, чтобы быть быстрее на моей машине, но иногда будет занимать больше времени из-за накладных расходов на нерестование нескольких потоков.
Что вы делаете, что 50 мс слишком медленно?
Я хочу отобразить массив изображений, но моя функция принимает только байты в качестве параметров - 256 оттенков серого достаточно и быстрее, чем 16 бит. – Archont
Часть медлительности исходит из необходимости читать больше данных, чем нужно: когда вы делаете
array[i] & 0xFF
вы читаете все четыре байта в int
, только уронить три наиболее значимых из них.
Вы можете избежать этих накладных расходов с помощью небезопасного кода. Имейте в виду, что подход ниже, предполагает небольшой архитектуры 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;
}
}
}
}
Приведенный выше код повторно интерпретирует int
массив как массив байтов и массив байтов в массив целых чисел. Затем он считывает каждый 4-й байт в целевой массив, используя указатель, записывая адресату в группы из четырех байтов, используя целочисленное назначение.
Мое тестирование показывает респектабельное улучшение на 60% по сравнению с простым циклом.
- 1. Int to byte array
- 2. Byte [] Array to Int
- 3. Int to byte array - byte shifting
- 4. ushort array to byte array
- 5. IntPtr to Byte [] Array C#
- 6. C# byte array to string
- 7. C# byte array to Image
- 8. Byte [] Array to String
- 9. Binary to Byte [] Array
- 10. Int Array to int C++
- 11. C++ char array to int и int to char array
- 12. ZipEntry to byte array
- 13. String to Byte Array
- 14. int16 to byte array
- 15. ByteBuffer to byte array
- 16. Turbo C++ charecter array to int array
- 17. Unsigned short to byte array
- 18. int array to string array
- 19. char array to int array
- 20. C/C++ Hex char * to byte array
- 21. C++ reference byte array
- 22. convert wave to byte array
- 23. struct to byte array [SafeArrayTypeMismatchException]
- 24. Angularjs Byte Array to Blob
- 25. Java byte array to Ruby
- 26. BYTE * Array in C#
- 27. WAV file to byte array
- 28. C++ char array to int
- 29. C# store int in byte array
- 30. C# Split byte [] array
Вы хотите, чтобы LSB каждого int в массиве int в массив байтов? – bpgeck
Вам нужно обработать почти миллион элементов быстрее, чем 50 мс ... подумали ли вы о распараллеливании с графическим процессором? Кроме этого, я думаю, что вы, вероятно, столкнулись с ограничениями процессора здесь –
@bpgeck yes, LSB каждого int в массиве int в байтовый массив. То есть 200 значений LSB 16-разрядного массива int до 200 значений 8-битового байтового массива. – Archont