2016-07-07 1 views
1

У меня есть быстрый вопрос об оптимизации скорости моего кода.Вычисление скорости функций

Быстро ли возвращать двойник в функции или иметь указатель на ваш двойник в качестве одного из ваших аргументов?

Возвращение двойной

double multiply(double x,double y) { 
    return x * y; 
} 

Указатель аргумент

void multiply(double x,double y,double *xy) { 
    *xy = x * y; 
} 
+3

Вы пробовали профилировать свой код в обе стороны? – dbush

+0

http://norvig.com/21-days.html (достойное чтение) заканчивается «таблицей ответов», которая имеет отношение к известности. –

+2

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

ответ

4

Рода решения вы говорите здесь часто называют microoptimization - вы оптимизации кода, сделав маленький вместо того, чтобы переосмыслить общую стратегию программы. Как правило, «микрооптимизация» имеет коннотацию «переписывания чего-то менее очевидным образом с намерением выжать немного больше производительности». Явный способ передачи данных из функции осуществляется через возвращаемые значения, а программисты используются для того, чтобы видеть это для примитивных типов, поэтому, если вы собираетесь перейти с «скрипта» и использовать такой параметр, должен быть хороший причина для этого.

Вы абсолютно уверены, что этот код выполняется так часто, что стоит рассмотреть переписывание, затрудняющее чтение в интересах эффективности? Хороший оптимизирующий компилятор, скорее всего, встраивает этот вызов функции, так что шансы на то, что стоимость совсем невелика. Чтобы убедиться, что стоит переписать код, вы должны начать с запуска профилировщика и получить убедительные доказательства того, что этот конкретный код действительно является узким местом.

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

Наконец, если вы уверены, что это узкое место, и вы уверены, что нет способа избавиться от умножений, тогда вы должны спросить, будет ли это изменение что-либо делать. И для этого единственным реальным способом узнать было бы внести изменения и измерить разницу. Это изменение настолько незначительно, что большинство хороших компиляторов были достаточно умны, чтобы понять, что вы делаете, и оптимизировать соответственно. В результате я был бы поражен, если бы вы действительно видели увеличение производительности здесь.

Резюмируя:

  • читаемость настолько гораздо более ценным, чем эффективность, что в качестве отправной точки, это стоит использовать «правильный» особенность языка для работы. Просто сначала используйте оператор return.

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

  • Если вам абсолютно необходимо многократно вызывать функцию, то внесите изменения и посмотрите, работает ли она, но не ожидайте, что на самом деле это будет иметь значение, потому что изменение незначительное, а оптимизация компиляторов - умная ,