Оптимизация расчета порога
Я пытаюсь оптимизировать следующий код C#, который устанавливает байты 0x00
или же 0xFF
на основе порога.
for (int i = 0; i < veryLargeNumber; i++)
{
data[i] = (byte)(data[i] < threshold ? 0 : 255);
}
Профилировщик производительности Visual Studio показывает, что приведенный выше код довольно дорогой, на его вычисление уходит почти 8 секунд - 98% от моих общих затрат на обработку. Я обрабатываю чуть менее тысячи предметов, так что в итоге получается более двух часов.
Я думаю, что проблема связана с троичным условным оператором, так как он вызывает ветвление. Я полагаю, что математическая операция в некотором роде может быть значительно быстрее, поскольку она дружественна к кэш-памяти процессора
Есть ли способ оптимизировать это? Я могу исправить пороговое значение, если это поможет. Я бы посчитал, что увеличение производительности на ~7% является выигрышем, так как это сокращает общее время обработки на 10 минут.
3 ответа
Если вы используете.NET 4.0 Framework, вы можете использовать Parallel Library по следующей ссылке:
http://msdn.microsoft.com/en-us/library/dd460717
В вашем случае вы должны проверить порог, в любом случае это займет время. Так что используйте потоки или лямбда-выражения
Просто чтобы предложить, используйте побитовые операторы для этой цели, потому что они быстрее, вместе с параллельным подходом.
0x00 = 0000 0000
0xFF = 1111 1111
Попробуй с OR
оператор (т.е. 0 | 1 = 1
где |
обозначает OR
оператор
РЕДАКТИРОВАТЬ:
Вот как вы можете сравнить, какое число больше: пусть a,b
быть числами:
int temp= a ^ b;
temp|= temp>> 1;
temp|= temp>> 2;
temp|= temp>> 4;
temp|= temp>> 8;
temp|= temp>> 16;
temp&= ~(temp>> 1) | 0x80000000;
temp&= (a ^ 0x80000000) & (b ^ 0x7fffffff);
Если вы хотите немного мудрое решение -
int intSize = sizeof(int) * 8 - 1;
byte t = (byte)(threshold - 1);
for (....)
{
data[i] = (byte)(255 + 1 ^ ((t - data[i]) >> intSize));
}
Примечание: не будет работать для углового случая 0. Извините, что
Также попробуйте использовать массив int вместо байта и посмотрите, быстрее ли он