में लैम्ब्डा फ़ंक्शंस के ऊपरी हिस्से को समझना यह Why C++ lambda is slower than ordinary function when called multiple times? और C++0x Lambda overhead में पहले से ही छुआ था, लेकिन मुझे लगता है कि मेरा उदाहरण पूर्व में चर्चा से थोड़ा अलग है और परिणामस्वरूप उत्तरार्द्ध में परिणाम है।सी ++ 11
मेरी कोड में अड़चन के लिए खोज पर मैं एक recusive टेम्पलेट समारोह है कि किसी भी प्रोसेसर समारोह के साथ एक variadic तर्क सूची को संसाधित करता है, एक बफर में मूल्य को कॉपी की तरह मिल गया।
int buffer[10];
int main(int argc, char **argv)
{
int *p = buffer;
for (unsigned long int i = 0; i < 10E6; ++i)
{
p = buffer;
ProcessArguments<int>([&p](const int &v) { *p++ = v; }, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}
}
संकलित:
template <typename T>
void ProcessArguments(std::function<void(const T &)> process)
{}
template <typename T, typename HEAD, typename ... TAIL>
void ProcessArguments(std::function<void(const T &)> process, const HEAD &head, const TAIL &... tail)
{
process(head);
ProcessArguments(process, tail...);
}
मैं एक कार्यक्रम एक लैम्ब्डा समारोह के साथ-साथ एक वैश्विक समारोह है कि एक वैश्विक बफर में प्रतियां तर्क एक चलती सूचक का उपयोग कर के साथ साथ इस कोड का उपयोग करता है के क्रम तुलना जी ++ 4.6 और -O3 उपकरण समय के साथ मापने के साथ अपने मशीन पर अधिक से अधिक 6 सेकंड लेता है, जबकि
int buffer[10];
int *p = buffer;
void CopyIntoBuffer(const int &value)
{
*p++ = value;
}
int main(int argc, char **argv)
{
int *p = buffer;
for (unsigned long int i = 0; i < 10E6; ++i)
{
p = buffer;
ProcessArguments<int>(CopyIntoBuffer, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10);
}
return 0;
}
1,4 के बारे में सेकंड लेता है।
मुझे उन दृश्यों के पीछे क्या नहीं चल रहा है जो समय के ऊपर की व्याख्या करते हैं और मुझे आश्चर्य है कि क्या मैं रनटाइम के भुगतान के बिना लैम्ब्डा कार्यों का उपयोग करने के लिए कुछ बदल सकता हूं।
तो वैश्विक एक वास्तव में धीमी है: ध्यान दें कि यह प्रत्याशित ही inlined लैम्ब्डा शरीर आप सबसे अच्छा प्रदर्शन दे रहा है? आप कहते हैं कि यह लैम्ब्डा-आधारित एक के लिए 6 बनाम 1.4 है, लेकिन फिर अंतिम वाक्य समझ में नहीं आता है। – dasblinkenlight
अपने विश्लेषण करते समय, क्या आपने जेनरेट की गई असेंबली सूची में देखा? – WhozCraig
'const' संदर्भ द्वारा 'प्रक्रिया' को पारित कर देगा, इस तरह,' शून्य प्रक्रिया क्रियाएं (const std :: function और प्रक्रिया) ', कोई फर्क पड़ता है? –
dasblinkenlight