Я посмотрел на другой вопрос переполнения стека относительно std :: function и почему он медленный, но я все еще не убежден/не понимаю. Я запустил программу с вопросом с несколькими изменениями.std :: function performance по сравнению с шаблонами
#include <iostream>
#include <functional>
#include <string>
#include <chrono>
template <typename F>
float calc1(F f) { return -1.0f * f(3.3f) + 666.0f; }
float calc2(const std::function<float (float)>& f) { return -1.0f * f(3.3f) + 666.0f; }
int main() {
std::function<float (float)> f = [](float arg){ return arg * 0.5f; };
for (int i = 0; i < 1e9; ++i) {
// calc2(f);
calc1([](float arg){ return arg * 0.5f; });
}
return 0;
}
С шаблонной версией, код работает в 4-х секунд, но с станд :: функциями задействована во время выполнения увеличивается до 15 секунд. Я понимаю, почему копирование функции std :: может быть дорогостоящим, но здесь даже с передачей ссылки, кажется, нет никакой разницы, может кто-нибудь объяснить, почему это происходит?
Просто для справки это выход, когда я набираю в г ++ --version
Apple LLVM version 7.0.2 (clang-700.1.81)
И вы скомпилировали с включенными оптимизациями? – Cornstalks
Yep с оптимизацией, включенной в обычный код, занимает всего 0,4 секунды, я полагаю, что ничего не выполняется вообще, поскольку в другом месте кода нет зависимости, но с помощью std :: function время выполнения составляет 1,9 секунды – Curious
@NirFriedman: Это другое. 'std :: function' больше, чем просто функтор. Он использует стирание типа, что является существенной разницей. – Cornstalks