auto lam = [](int a, int b, int c) { return a < b && b < c; };
struct functor {
int a;
int b;
bool operator()(int n) const { return a < n && n < b; }
};
संस्करण एक में, हमस्पीड functor struct के ऑपरेटर() बनाम (std :: समारोह के माध्यम से)
std::vector<std::function<bool (int)>> lamvals;
// get parameters and for each
lamvals.emplace_back(std::bind(lam, a, std::placeholders::_1, b));
विकल्प
std::vector<functor> lamvals;
// get parameters and for each
lamvals.emplace_back(functor{a, b});
दोनों ही मामलों में है हम एक साधारण पुनरावृत्ति
return std::any_of(lamvals.cbegin(), lamvals.cend(),
[n](const decltype(lamvals)::value_type & t){return t(n);});
मुझे गति दिखाई दे रही है बाध्य लैम्ब्डा धीमी गति से 3: 1 का अंतर। फंक्चर इंटीजर जोड़े को संग्रहित करने और परीक्षणों को हार्डकोड करने के रूप में लगभग तेज़ है। जाहिर है, हार्डकोडिंग उत्पादन कोड के लिए उतनी उपयोगी नहीं है, क्योंकि इसमें केवल कई ही काम नहीं होंगे। हालांकि, मैं या तो कई मजेदार या कई lambdas के साथ जा सकते हैं। उत्तरार्द्ध कोड की कम लाइनें है और क्लीनर दिखता है, लेकिन मुझे नहीं लगता कि मैं उस गति अंतर को बर्दाश्त कर सकता हूं; यह कोड एक महत्वपूर्ण पाश में है।
मैं speedup सुझावों की तलाश में हूं।
'std :: function' का उपयोग निश्चित रूप से धीमा होगा। इसके साथ सबसे अधिक संभवतः टाइप एरर (जो 'आभासी' और संभावित गतिशील आवंटन तक उबाल जाता है) के माध्यम से लागू किया जाता है, तो यह "सादे" मज़ेदार की तुलना में महत्वपूर्ण ओवरहेड का कारण बनता है। –
अपने मज़ेदार को 'std :: function' में स्टोर करें और यह लैम्ब्डा के समान समय लेगा। – Oktalist
यह ध्यान रखना बहुत महत्वपूर्ण है कि लैम्बडा मज़दूरों की तुलना में धीमी नहीं हैं।इसके बजाय, 'std :: function' कॉल नियमित फ़ंक्शन कॉल की तुलना में धीमी हैं। [Gcc.godbolt.org] के लिए –