c++ - Why is this code slower even if the function is inlined? -
मेरे पास इस तरह एक विधि है:
bool MyFunction (int & i) {स्विच (एम_स्टेप) {मामला 1: यदि (एसीएमप्लेक्स कंडिशन) {i = m_i; वापस सच; } मामला 2: // कुछ कोड के मामले 3: // कुछ कोड}}
चूंकि बहुत सारे मामले बयान हैं (3 से अधिक) और फ़ंक्शन बड़ा हो रहा है, मैंने कोशिश की 1 के मामले में कोड निकालें और इसे एक इनलाइन फ़ंक्शन में डालें:
इनलाइन बूल फ़ंक्शन (इंट एंड आई) {यदि (एसीम्पलेक्स कंडिशन) {i = m_i; वापस सच; } विवरण झूठा है; } Bool MyFunction (int & i) {स्विच (एम_स्टेप) {मामला 1: यदि (फ़ंक्शन (आई)) {वापसी सत्य; } मामला 2: // कुछ कोड के मामले 3: // कुछ कोड}}
ऐसा लगता है कि यह कोड मूल से काफी धीमी है। मैं -इनलाइन के साथ जांच की और फ़ंक्शन को रेखांकित किया गया है। यह कोड धीमा क्यों है? मैंने सोचा था कि यह समतुल्य होगा मैं देखता हूं कि अंतर केवल दूसरे संस्करण में एक और सशर्त जांच है, लेकिन मैंने सोचा कि कंपाइलर इसे दूर करने में सक्षम होना चाहिए। सही?
संपादित करें: कुछ लोगों ने सुझाव दिया कि मतभेदों को देखने के लिए मुझे दोनों संस्करणों में प्रत्येक विधानसभा निर्देशों को रोकने के लिए जीडीबी का उपयोग करना चाहिए। मैंने ऐसा किया है।
पहला संस्करण इस तरह दिखता है:
mov callq (कॉल करने के लिए एसीप्लेक्स कंडिशन ()) परीक्षा जे (कूदना नहीं) mov (i = m_i दूसरे संस्करण, जो थोड़ी धीमी है, सरल लगता है। Movil (m_step = 1)
ए कॉम्प्लेक्स कंडिशन ()) परीक्षा जे (कूद नहीं है) mov (i = m_i) xchg% ax,% ax (यह मुझे लगता है कि एक एनओपी है)
ये दो संस्करण ऐसा लगता है एक ही बात है, इसलिए मुझे नहीं पता कि दूसरा संस्करण अभी भी धीमा क्यों है।
बस के माध्यम से कदम यह। एक ब्रेकपॉइंट संयंत्र, disassembly के दृश्य में जाएं, और कदम शुरू करें
सभी रहस्य गायब हो जाएंगे।
Comments
Post a Comment