हम एक प्रदर्शन महत्वपूर्ण अनुप्रयोग को .NET पर माइग्रेट करना चाहते हैं और यह पता लगाएं कि सी # संस्करण प्रोसेसर के आधार पर Win32/C की तुलना में 30% से 100% धीमा है (मोबाइल T7200 प्रोसेसर पर अधिक अंतर)। मेरे पास कोड का एक बहुत ही सरल नमूना है जो इसे प्रदर्शित करता है। संक्षिप्तता के लिए मैं सिर्फ सी संस्करण दिखाऊंगा - सी # एक सीधा अनुवाद है:सी # (काफी धीमी) और Win32/C के बीच प्रदर्शन अंतर क्यों?
#include "stdafx.h"
#include "Windows.h"
int array1[100000];
int array2[100000];
int Test();
int main(int argc, char* argv[])
{
int res = Test();
return 0;
}
int Test()
{
int calc,i,k;
calc = 0;
for (i = 0; i < 50000; i++) array1[i] = i + 2;
for (i = 0; i < 50000; i++) array2[i] = 2 * i - 2;
for (i = 0; i < 50000; i++)
{
for (k = 0; k < 50000; k++)
{
if (array1[i] == array2[k]) calc = calc - array2[i] + array1[k];
else calc = calc + array1[i] - array2[k];
}
}
return calc;
}
अगर हम के लिए Win32 में disassembly को देखो 'शेष' हमने:
35: else calc = calc + array1[i] - array2[k];
004011A0 jmp Test+0FCh (004011bc)
004011A2 mov eax,dword ptr [ebp-8]
004011A5 mov ecx,dword ptr [ebp-4]
004011A8 add ecx,dword ptr [eax*4+48DA70h]
004011AF mov edx,dword ptr [ebp-0Ch]
004011B2 sub ecx,dword ptr [edx*4+42BFF0h]
004011B9 mov dword ptr [ebp-4],ecx
(यह है डिबग लेकिन मेरे साथ सहन) में
अनुकूलित C# अनुकूलित exe पर CLR डीबगर का उपयोग कर संस्करण के लिए disassembly:
else calc = calc + pev_tmp[i] - gat_tmp[k];
000000a7 mov eax,dword ptr [ebp-4]
000000aa mov edx,dword ptr [ebp-8]
000000ad mov ecx,dword ptr [ebp-10h]
000000b0 mov ecx,dword ptr [ecx]
000000b2 cmp edx,dword ptr [ecx+4]
000000b5 jb 000000BC
000000b7 call 792BC16C
000000bc add eax,dword ptr [ecx+edx*4+8]
000000c0 mov edx,dword ptr [ebp-0Ch]
000000c3 mov ecx,dword ptr [ebp-14h]
000000c6 mov ecx,dword ptr [ecx]
000000c8 cmp edx,dword ptr [ecx+4]
000000cb jb 000000D2
000000cd call 792BC16C
000000d2 sub eax,dword ptr [ecx+edx*4+8]
000000d6 mov dword ptr [ebp-4],eax
संभवतः प्रदर्शन अंतर का कारण कई और निर्देश।
तो 3 प्रश्न वास्तव में:
2 कार्यक्रमों के लिए सही disassembly तलाश में हूं या उपकरण मुझे गुमराह कर रहे हैं?
तो उत्पन्न निर्देश की संख्या में अंतर क्या अंतर है का कारण नहीं है?
क्या हम संभवतः इसके बारे में क्या कर सकते हैं अन्य की तुलना में एक देशी DLL में हमारे सभी प्रदर्शन महत्वपूर्ण कोड रहते हैं।
अग्रिम धन्यवाद स्टीव
पुनश्च मैं एक तरह बिल्डिंग प्रदर्शन महत्वपूर्ण देशी अनुप्रयोगों 'हम्म एक संयुक्त एमएस/इंटेल संगोष्ठी हकदार कुछ करने के लिए हाल ही में आमंत्रण प्राप्त था ...
क्या आप असेंबली निर्देशों के बीच सभी न्यूलाइन हटा सकते हैं। –
हमेशा की तरह, यह देखने के लिए प्रोफाइल करें कि सबसे अधिक प्रदर्शन हिट कितना खर्च करता है। (ऐसा कोई तरीका नहीं है कि हम देख सकें कि आपके कोड में समय क्या है, इसलिए हमें पूछने में कोई बात नहीं है। इसके बजाय एक प्रोफाइलर से पूछें) इसके अलावा, एक सरल चाल आपके सी # कोड को एनजेन के माध्यम से चलाने के लिए हो सकती है। यह प्रदर्शन को थोड़ा सा बढ़ावा देना चाहिए। – jalf
सीएलआर का कौन सा संस्करण आप तुलना कर रहे हैं। जहां तक मुझे पता है, .NET 3.5 SP1 जेआईटी कंपाइलर पुराने लोगों की तुलना में अधिक कुशल है। X64 जेआईटी ऑप्टिमाइज़र x86 एक से अधिक आक्रामक है। –