"Else" "switch () halda" dan daha sürətli?

Mümkün dublikat:
C / 'də if / else və switch-case istifadə arasında əhəmiyyətli fərq varmı?

Mən C # öyrənən bir Paskal oğlanam. Mənim sualım belədir:

Kod bir keçid yaratmaqdan daha sürətli mı azalır?

 int a = 5; if (a == 1) { .... } else if(a == 2) { .... } else if(a == 3) { .... } else if(a == 4) { .... } else .... 

Və keçid:

 int a = 5; switch(a) { case 1: ... break; case 2: ... break; case 3: ... break; case 4: ... break; default: ... break; } 

Hansı biri daha sürətli?

Mən proqramı bənzər bir quruluşa sahib olduğum üçün soruşuram (çox, bir çox "başqa əgər"). Onları açarlarıma daxil etməliyəmmi?

261
20 апр. İvan Prodanov tərəfindən təyin olunan 20 apr. 2009-04-20 14:07 '09 at 14:07 2009-04-20 14:07
@ 14 cavab

Bir neçə element üçün fərqi kiçikdir. Bir çox elementiniz varsa, mütləq keçiddən istifadə etməlisiniz.

Keçiddə beşdən çox element varsa, bir axtarış masası və ya hash siyahısı istifadə olunur. Bu, bütün maddələrin əvvəlki şərtləri qiymətləndirməsi lazım olduğu üçün, sonuncu maddənin nail olmaq üçün daha uzun sürəcəyi ifa siyahısı ilə müqayisədə eyni giriş vaxtını əldə etməsi deməkdir.

443
20 апр. Guffa tərəfindən 20 apreldə verilən cavab 2009-04-20 14:14 '09 da 14:14, 2009-04-20 14:14

Niyə qayğı edirsiniz?

Vaxtın 99.99% -i, sizə qayğı vermir.

Mikro-optimallaşdırmanın bu tipləri kodunuzun performansına təsir göstərə bilməz.

border=0

Əlavə olaraq, diqqət etməlisinizsə, kodunuzun bir performans profilini yerinə yetirməlisiniz. Bu vəziyyətdə, keçid işi ilə if-else bloku arasındakı işin fərqini tapmaq qeyri-adi olacaqdır.

Düzenle: Aydınlıq üçün: daha dəqiq və asan saxlanılan hər hansı bir dizaynı tətbiq edin. Bir qayda olaraq, böyük bir kommutasiya işi ilə qarşılaşdıqda və ya if-else həllini blokirovkada polimorfizmi istifadə etməkdir. Değişen ve kapsülleyen bir davranış tapın. Daha əvvəl də bu kimi böyük, çirkin keçid kodu ilə məşğul olmalıyam və ümumiyyətlə asanlaşdırmaq çətin deyil. Amma çox gözəl.

144
20 апр. Cavab verilir Wedge 20 Aprel. 2009-04-20 14:27 '09 at 14:27 2009-04-20 14:27

Bu performansın təxminini nəzərə alaraq, keçid işi daha sürətli olur.

Bu nəticə belədir:

Nəticələr göstərir ki, switch ifadəsi if-else-nərdivandan daha sürətlidır. Bu, kompilyatorun açar bəyanatını optimallaşdırma qabiliyyətinə görədir. Bir if-else-nərdivası vəziyyətində, kod hər bir if hesabatda proqramçı tərəfindən müəyyən edilmiş qaydada işləməlidir. Bununla birlikdə, keçid ifadəsindəki hər bir iddianın əvvəlki hallara etibar etmədiyi üçün, derleyici testi ən sürətli icrası təmin etmək üçün bir şəkildə yenidən sıralayabilir.

18
20 апр. Apr 20-də Michael Barth tərəfindən verilmiş cavab 2009-04-20 14:11 '09 at 14:11 2009-04-20 14:11

Hesab etmək üçün başqa bir şey: bu həqiqətən tətbiqinizin darboğazıdır? Bu cür optimallaşdırma həqiqətən zəruri olduqda nadir hallarda olur. Çox vaxt, alqoritmlərinizi və məlumat strukturlarınızı yenidən nəzərdən keçirərək daha yaxşı təkmilləşdirmələr əldə edə bilərsiniz.

10
20 апр. cavab Vilx- 20 apr tərəfindən verilir . 2009-04-20 14:18 '09 da 14:18 'da 2009-04-20 14:18

Mən keçid yolu olduğunu deyirəm, daha sürətli və daha yaxşıdır.

Bunları müqayisə edən test testlərini göstərən müxtəlif linklər var ( http://www.blackwasp.co.uk/SpeedTestIfElseSwitch.aspx ).

7
20 апр. Cavab 20 aprel tarixində Şaun Bohannon tərəfindən verilir. 2009-04-20 14:10 '09 at 14:10 2009-04-20 14:10

Çətinliklər olmamalı, 5 ədəd arasında keçid və ya işlədilən bir funksiya yarada, bu funksiyaya rand (1,5) və bir neçə dəfə synchronized zaman bir dövrü atır.

5
20 апр. Cavab Ólafur Waage tərəfindən verilir 20 Apr 2009-04-20 14:10 '09 at 14:10 2009-04-20 14:10

Derleyici bir jump masası yaratmaq üçün bir keçid adətən uzun bir ifs siyahısından daha sürətli olur. Siyahı nə qədər uzun olsa, daha yaxşı keçid bəyanatı ifadələrin bir sıra üstündə yerləşir.

5
20 апр. Steven tərəfindən 20 Martda cavablandı 2009-04-20 14:11 '09 at 14:11 2009-04-20 14:11

Daha çox vacibdir ki, keçidin effektiv faydaları (nisbətən kiçik, amma qeyd etmək lazımdır) - okunabilirlik problemləri.

Ips zəncirləri ilə müqayisədə, nizam-intizamlı və təmiz ağ məkanında mümkün qədər açıq olan ifadəni tapıram.

4
20 апр. Cavab verildi annakata Apr 20 2009-04-20 14:24 '09 at 14:24 2009-04-20 14:24

Mən əmin deyiləm, amma hesab edirəm ki, dəyişiklik sürəti istifadə etdiyiniz proqramlaşdırma dilinə bağlıdır.

Mən adətən keçiddən istifadə etməyi üstün tuturam. Belə ki, kodu oxumaq asandır.

3
04 апр. cavab user308693 04 apr tərəfindən verilir . 2010-04-04 15:47 '10 at 15:47 2010-04-04 15:47

switch , mümkünsə, kompilyator tərəfindən adətən istinad masasına çevrilir. Beləliklə, istədiyinizi tapmaqdan əvvəl, özbaşına bir iş axtararkən, O (1), həqiqətən, bir neçə hal eşlemesi gerçekleştirmek yerine.

Beləliklə, bir çox hallarda if / else if zəncir yavaş olacaq. İşlərinizin düşdüyü tezliyə görə, lakin əhəmiyyətsizdir.

3
20 апр. Joey tərəfindən aprelin 20-də verdiyi cavab 2009-04-20 14:13 '09 at 14:13 2009-04-20 14:13

Texniki cəhətdən dəqiq bir nəticə verirlər, buna görə də onlar eyni şəkildə optimallaşdırılmalıdırlar. Buna baxmayaraq, kompilyator jump masa ilə iftlərə keçid vəziyyətini optimallaşdırır.

Buradakı ümumi vəziyyətdən bəhs edirəm. 5 giriş üçün, ifs üçün yerinə yetirilən testlərin ortalama sayıları, frekansın şərtlərini sifariş etsəniz, 2,5-dən az olmalıdır. Yalnız bir çox sıx loopda evə yazmaq çətin deyil.

3
20 апр. cavab jfclavette 20 Apr tərəfindən verilir 2009-04-20 14:10 '09 at 14:10 2009-04-20 14:10

Qısa cavab: switch ifadəsini daha sürətli

If ifadəsində, düzgün cümləə getmək üçün ortalama olaraq iki müqayisə (nümunə kodunu icra edərkən) etmək lazımdır.

Şifrləmə bəyanatı deməkdir ki, müqayisələrin orta sayı neçə müxtəlif haldan asılı olmayaraq bərabər olacaqdır. Derleyici / VM derleme zamanında olası variantların bir "axtarış masası" yaradır.

Bu kodları tez-tez yerinə yetirirsinizsə, virtual maşınlar if deyimini eyni şəkildə optimize edə bilərmi?

2
20 апр. Cavab AnnaR 20 apr. 2009-04-20 14:14 '09 da 14:14, 2009-04-20 14:14

bax http://msdn.microsoft.com/en-us/library/system.reflection.emit.opcodes.switch%28VS.71%29.aspx

Şifrləmə bəyanatı, əsasən, məlum olan parametrləri olan bir cədvəl axtarır və bəyanat məntiqi bir tipə bənzəyir. Mənim üçün onlar keçid edirlər, əgər eynidırlarsa, məntiq keçid üçün daha yaxşı kömək edə bilərlər. if-else isə anlamaq və oxumağa kömək edir.

1
29 сент. User42590 tərəfindən verildi 29 sentyabr . 2012-09-29 11:24 '12 at 11:24 am 2012-09-29 11:24

switch if / else zəncirinizlə eyni niyyəti nəzərdə tutduğundan, lakin daha məhdud formal şəkildə, ilk fərziyyəniz kodunuza tətbiq edilən şərtlər haqqında daha çox nəticələr əldə edə biləcəyi üçün kompilyator daha yaxşı optimallaşdırmalıdır. (yəni, yalnız bir dövlət doğru ola bilər, müqayisəli dəyər ibtidai tipdir və s.). İş saatları üçün iki oxşar dil strukturunu müqayisə edərkən bu, ədalətli təhlükəsiz paylaşılan bir həqiqətdir.

1
20 апр. Cavab 20 aprel mquander tərəfindən verilir 2009-04-20 22:25 '09 saat 10:25 pm 2009-04-20 22:25

bağlı digər suallar və ya sual verin