2012-09-25 15 views
20

पर बहुत धीमा है मेरे सहकर्मी ने कल इस प्रश्न को पोस्ट किया: 7-second EF startup time even for tiny DbContextएंटीटी फ्रेमवर्क स्पिनअप x64 बनाम x86

अपना कोड लेने के बाद और इसे जितना संभव हो सके इसे अलग करने के लिए इसे अलग समाधान में ले जाने के बाद, मैंने पाया कि युक्त प्रोजेक्ट के प्लेटफ़ॉर्म लक्ष्य को ईएफ स्टार्टअप प्रक्रिया के रनटाइम पर गहरा असर पड़ा था।

x64 को लक्षित करते समय, मैंने देखा कि परीक्षण को पहले डीबीकॉन्टेक्स्ट और < को दूसरे डीबीकॉन्टेक्स्ट को स्पिन करने के लिए ~ 7 सेकंड लग गए थे (मेरे सहकर्मी के निष्कर्षों के अनुरूप जो x64 को लक्षित कर रहा है)। हालांकि जब मैंने प्लेटफार्म लक्ष्य को x86 पर स्विच किया, तो पहला डीबीकॉन्टेक्स्ट स्पिन अप टाइम लगभग 4 सेकंड तक 3.34633 सेकेंड तक कम हो गया, जबकि दूसरा डीबीकॉन्टेक्स्ट x64 केस के समान समय ले गया।

यह देखते हुए, ऐसा लगता है कि 64-बिट सिस्टम बनाम 32-बिट सिस्टम को लक्षित करते समय एंटीटी फ्रेमवर्क एक बहुत ही अलग प्रारंभिक प्रक्रिया के माध्यम से जा रहा है। क्या किसी को समझाने के लिए हुड के नीचे क्या हो रहा है इस बारे में कोई अंतर्दृष्टि है?

+0

क्या यह शायद असेंबली जांच कर रहा है? आप फ्यूजन लॉग को उस पर त्वरित जांच के रूप में देख सकते हैं। –

+0

@CraigStuntz मैंने फ़्यूज़न लॉग की जांच की और x86 बनाम x64 में अलग-अलग कुछ भी नहीं देखा। – Sidawy

+1

यह दिलचस्प है। एफवाईआई ईएफ में 32- या 64-बिट आर्किटेक्चर के लिए कोई कोड विशिष्ट नहीं है - यह शुद्ध आईएल है। फिर भी अंतर बहुत बड़ा है। – Pawel

उत्तर

11

यह मुद्दा पूरी तरह से पुन: उत्पन्न होता है। मैंने इसे अभी चलाया है और x86 और x64 निष्पादन दोनों के लिए स्नैपशॉट एकत्र करने के लिए डॉटट्रेस प्रदर्शन प्रोफाइलर का उपयोग किया है। जैसा कि आप रिपोर्ट करते हैं, मुझे उतनी ही बार मिलती है। लेकिन x64 और x86 निशान के बीच वास्तव में कोई स्पष्ट अंतर नहीं है - सिवाय इसके कि x64 हर जगह x86 के समय से कम से कम दो बार लेता है।

लेकिन यह एनयूनीट परीक्षण चलाने का पता लगा रहा था। कंसोल अनुप्रयोगों के समान परीक्षण चलाकर मुझे इस तरह के समय मिलते हैं:

x86: 0,6864012, 0,0468001 
x64: 1,0608019, 0,0468001 

यह बहुत बेहतर दिखता है, है ना? X86 और x64 के बीच अभी भी अंतर है लेकिन कुछ परिचालनों के लिए x64 कोड सामान्य रूप से धीमा हो सकता है।

इस बिंदु पर समस्या ईएफ के बारे में नहीं है बल्कि एनयूनीट और इसके परीक्षण धावक के बारे में है।

संपादित करें:

मैंने कुछ और परीक्षण किया। एनयूनीट और रिशेर्पर के कार्य धावक दोनों के पास यह मुद्दा है लेकिन यह केवल पहले परीक्षण को प्रभावित करता है। अन्य सभी परीक्षण जल्दी से चलते हैं। xUnit एक ही व्यवहार दिखाता है।

+2

आप पता है कि वे क्या कहते हैं ..."बिट्स को दोगुना करें, मज़ा दोहराएं!" अरे रुको। यह सही नहीं है। – BoltClock

+0

बहुत दिलचस्प है। मैं निशान के एक ही सेट भाग गया और एक ही व्यवहार देखा। यह सवाल पूछता है कि नूनिट धावक और ईएफ के बीच बातचीत के परिणामस्वरूप x64 में रनटाइम बढ़ गया है। – Sidawy