Это вопрос о принципе оценки эффективности.
В одном из моих проектов я сталкивался с такой ситуацией: функция получает два натуральных числа и возвращает наименьшее из двух.
Я хотел бы знать, является ли этот метод, который я обычно использую, где я вычисляю по количеству шагов, довольно точный метод оценки эффективности и есть ли другие, или я должен всегда просто сравнивать, как быстро они бегут.
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, потому что кажется, что она имеет меньше шагов.
Подсчет шагов — это способ анализа асимптотический эффективность алгоритма. Это мера того, насколько хорошо алгоритм масштабируется до больших входных данных.
Однако, чтобы сравнить, насколько быстры две функции для фиксированного размера ввода, нам действительно нужно посмотреть, насколько быстро они действительно выполняются. Подсчет шагов — в лучшем случае приблизительное руководство, потому что:
Есть много практических правил о том, какие операции скорее всего быть медленнее, чем другие, но единственный способ быть уверенным — это измерить в обстановке, максимально точно воспроизводящей ваш реальный вариант использования.
В этом конкретном коде:
Версия 2 имеет меньше шагов, но одним из этих шагов является ветвь (если), которая исторически была медленной.
Некоторые архитектуры позволяют одновременно выполнять обе ветви (if и else), что может сделать его снова быстрым. Это также может привести к разливу с предсказанием ветвления с эффектами «наезд» на другой код, замедляя что-то еще.
Для функций такого размера это почти наверняка не имеет значения, поскольку функция все равно будет работать так быстро.
Тем не менее, для больших вычислений метод определенно оправдан. На самом деле, подсчет «шагов», подобных этому, является основой для подполя информатики, известного как «Анализ алгоритмов».
На практике вам понадобится еще много шагов, чтобы это действительно имело значение — по крайней мере, сотни тысяч, если эти шаги не являются необычно дорогими.