оценка производительности — c ++ шаги как эффективность

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

Function(int a, int b)
{
int lowest = a - b;                   //3 steps, allocating, assigning and calculating
lowest = lowest * lowest / lowest;    //3 steps, 2 in calculating, 1 in assigning
//6 steps total

return lowest;
}

Function(int a, int b)
{
int lowest;        //1 step in allocating
if(a > b){         // 2 steps, 1 in comparing, 1 in picking the outcome
lowest = b;        // 1 step in assigning
// Total 4 steps
}else{
lowest = a;        // 1 step in assigning
// Total 4 steps
}
return lowest;
}

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

1

Решение

Подсчет шагов — это способ анализа асимптотический эффективность алгоритма. Это мера того, насколько хорошо алгоритм масштабируется до больших входных данных.

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

  1. выполняемые шаги — это не операторы C ++, а инструкции машинного кода, к которым они компилируются
  2. даже если каждый из ваших операторов C ++ скомпилирован с одинаковым количеством инструкций (чего они, вероятно, не делают), для выполнения инструкций не требуется одинаковое количество тактов
  3. даже если все они имели одинаковую условную задержку, эти функции, вероятно, будут встроенными, что означает, что рассматривать их изолированно не так уж и полезно. Вы должны знать, как они влияют на оптимизированный код на каждом сайте вызова

Есть много практических правил о том, какие операции скорее всего быть медленнее, чем другие, но единственный способ быть уверенным — это измерить в обстановке, максимально точно воспроизводящей ваш реальный вариант использования.


Заметка

В этом конкретном коде:

  • версия 1 не выглядит так, как будто она даст правильный результат, но игнорируя ее — в ней больше шагов, но в основном это целочисленная арифметика, которая сильно оптимизирована и обычно быстра
  • Версия 2 имеет меньше шагов, но одним из этих шагов является ветвь (если), которая исторически была медленной.

    Некоторые архитектуры позволяют одновременно выполнять обе ветви (if и else), что может сделать его снова быстрым. Это также может привести к разливу с предсказанием ветвления с эффектами «наезд» на другой код, замедляя что-то еще.

0

Другие решения

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

Тем не менее, для больших вычислений метод определенно оправдан. На самом деле, подсчет «шагов», подобных этому, является основой для подполя информатики, известного как «Анализ алгоритмов».

На практике вам понадобится еще много шагов, чтобы это действительно имело значение — по крайней мере, сотни тысяч, если эти шаги не являются необычно дорогими.

0

По вопросам рекламы [email protected]