2014-12-09 6 views
2

Вопрос в значительной степени говорит обо всем. На данный момент я использую Math.Abs(a - b) для вычисления абсолютного значения выражения вычитания, например 5 - 10 и 10 - 5, возвращающихся 5.Есть ли более эффективный способ вычисления абсолютного значения выражения вычитания

Есть ли более эффективный способ сделать это, или это самый эффективный способ?

+2

Любое улучшение в том, что, скорее всего, будет ничтожна. Иди с этим, а не пытаешься изобрести колесо. –

+0

Встроенные функции, как правило, эффективны. Я бы предположил, что используемый вами компилятор играет более значительную роль в эффективности. –

+1

Да, есть несколько способов, но тогда вы должны рассмотреть язык ассемблера. –

ответ

2

Пожалуйста, не микро оптимизируйте свой код, пока не узнаете, где именно проблема.

Вы можете реализовать свою собственную функцию и сделать ее встроенной функцией, чтобы уменьшить стоимость вызова функции с помощью MethodImplAttribute.

Если вы используете Int32 значения и ваши входы не случится граничные значения, то вы можете использовать этот

Abs(x) = (x^(x >> 31)) - (x >> 31) 

, но я предлагаю вам забыть об этом, профиль приложения, вы увидите реальная проблема в другом месте не в вызове Math.Abs. Вы всегда должны сделать свой код читабельным, а затем настроить проблемы с производительностью после того, как вы докажете, что это действительно проблемы с производительностью!

Программистов тратить огромное количество времени, думая о том, или беспокоиться о , скорости некритических частей их программ, и эти попытки эффективности фактически оказывают сильное негативное воздействие, когда отладка и обслуживание считаются. Мы должны забыть о небольших эффектах, скажем, около 97% времени: преждевременная оптимизация - это корень всех зла . Однако мы не должны упускать наши возможности в том, что критически 3%.
(бумажные DonaldKnuth в "StructuredProgrammingWithGoToStatements")

прочитать this пожалуйста

+1

Согласовано. Я разработчик игр, и мне никогда не нужно было оптимизировать вычисление абсолютного значения. (Но если бы я занимался графическим программированием, это было бы целое «однообразное животное».) – piojo

+1

И даже в графике переупорядочение инструкций и выбор правильного сочетания типов данных будут более полезными, чем другой способ абс. :) – Peter

+0

Вычисление этого выражения является пробным. медленнее, чем 'x> = 0? x: -x', который может скомпилироваться (вводится в edi/output в eax): 'xor eax, eax/sub eax, edi/cmovle eax, edi' на x86. 2 инструкции по критическому пути, как с малой задержкой. cmovLE = условная копия, если предыдущее сравнение было меньше или равно. (т. е. если '0 <= input',' output = input', else сохранить '0-output', который также действует как сравнение.) Hrm, clang использует мою идею, gcc использует ваш xor/shift/sub. ICC использует 'cltd' для копирования знакового бита ввода в каждый бит другого регистра вместо смены. https://goo.gl/Lj9JeR. –

Смежные вопросы