std::function<>Yakalama yöntemini kullanarak özyinelemeli bir işlevi özyinelemeli bir lambda işleviyle karşılaştıran bir ölçüt çalıştırdım . Clang sürüm 4.1'de tam optimizasyonlar etkinleştirildiğinde, lambda sürümü önemli ölçüde yavaşladı.
#include <iostream>
#include <functional>
#include <chrono>
uint64_t sum1(int n) {
return (n <= 1) ? 1 : n + sum1(n - 1);
}
std::function<uint64_t(int)> sum2 = [&] (int n) {
return (n <= 1) ? 1 : n + sum2(n - 1);
};
auto const ITERATIONS = 10000;
auto const DEPTH = 100000;
template <class Func, class Input>
void benchmark(Func&& func, Input&& input) {
auto t1 = std::chrono::high_resolution_clock::now();
for (auto i = 0; i != ITERATIONS; ++i) {
func(input);
}
auto t2 = std::chrono::high_resolution_clock::now();
auto duration = std::chrono::duration_cast<std::chrono::milliseconds>(t2-t1).count();
std::cout << "Duration: " << duration << std::endl;
}
int main() {
benchmark(sum1, DEPTH);
benchmark(sum2, DEPTH);
}
Sonuç verir:
Duration: 0 // regular function
Duration: 4027 // lambda function
(Not: Derleme zamanı değerlendirmesini ortadan kaldırmak için cin'ten girdileri alan bir sürümle de onayladım)
Clang ayrıca bir derleyici uyarısı üretir:
main.cc:10:29: warning: variable 'sum2' is uninitialized when used within its own initialization [-Wuninitialized]
Bu beklenen ve güvenli, ancak not edilmelidir.
Alet kayışlarımızda bir çözüme sahip olmak harika, ancak performansın mevcut yöntemlerle karşılaştırılabilir olması durumunda, dilin bu durumu ele almak için daha iyi bir yola ihtiyacı olacağını düşünüyorum.
Not:
Bir yorumcunun işaret ettiği gibi, VC ++ 'nın son sürümü bunu eşit performans noktasına göre optimize etmenin bir yolunu bulmuş gibi görünüyor. Belki de bununla başa çıkmanın daha iyi bir yoluna ihtiyacımız yok, sonuçta (sözdizimsel şeker hariç).
Ayrıca, diğer bazı SO yayınları son haftalarda ana hatlarıyla belirtildiği gibi std::function<>, en azından lambda yakalama, std::functionküçük functors için kitaplık için optimize edilmiş alan kullanımlarına sığmayacak kadar büyük olduğunda, performansın doğrudan arama işlevine karşı yavaşlamasının nedeni olabilir. (Sanırım çeşitli kısa dize optimizasyonları gibi?).