Оптимизация расчета порога

Я пытаюсь оптимизировать следующий код 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 вместо байта и посмотрите, быстрее ли он

Другие вопросы по тегам