/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Hvad er hurtigst, switch (..) eller if (..~
Fra : Kim Andersen


Dato : 12-07-04 13:03

under Visual Studio .NET C++ ?

Hvis man eksempel har 200+ evalueringer man skal lave, er en switch sætning
så hurtiger at udføre end en if sætning.

Eks.

int iValue = 100;

switch (iValue)
{
case 1: ..code.. break;
.....
.....
.....
case 100: ..code.. break;

default: ..code.. break;
}


eller

int iValue = 100;

if (iValue == 1)
{
...code..
}
.....
.....
.....
else if (iValye == 100)
{
...code..
}
else
{
...code..
}


/Kim



 
 
Kent Friis (12-07-2004)
Kommentar
Fra : Kent Friis


Dato : 12-07-04 13:12

Den Mon, 12 Jul 2004 14:03:09 +0200 skrev Kim Andersen:
> under Visual Studio .NET C++ ?
>
> Hvis man eksempel har 200+ evalueringer man skal lave, er en switch sætning
> så hurtiger at udføre end en if sætning.

Hvorfor prøver du ikke bare?

Hvis optimizeren er god, vil den generere den samme kode i begge
tilfælde. Hvis den ikke er helt så god, er switchen nemmere at optimere.

Mvh
Kent
--
Help test this great MMORPG game - http://www.eternal-lands.com/

Anders Bo Rasmussen (12-07-2004)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 12-07-04 14:06

On Mon, 12 Jul 2004 14:03:09 +0200 Kim Andersen wrote:

> under Visual Studio .NET C++ ?
>
> Hvis man eksempel har 200+ evalueringer man skal lave, er en switch sætning
> så hurtiger at udføre end en if sætning.

Må man svare på det ud fra den EULA man har indgået med Microsoft? Så
vidt jeg husker var der noget med at man ikke måtte offentliggøre
benchmarks.

>
> Eks.
>
> int iValue = 100;
>
> switch (iValue)
> {
> case 1: ..code.. break;
> ....
> ....
> ....
> case 100: ..code.. break;
>
> default: ..code.. break;
> }
>
>
> eller
>
> int iValue = 100;
>
> if (iValue == 1)
> {
> ..code..
> }
> ....
> ....
> ....
> else if (iValye == 100)
> {
> ..code..
> }
> else
> {
> ..code..
> }
>
>
> /Kim
>
>


--
41 6E 64 65 72 73

Jesper Louis Anderse~ (12-07-2004)
Kommentar
Fra : Jesper Louis Anderse~


Dato : 12-07-04 14:56

Kim Andersen <_dingdong@dingeling> wrote:
> under Visual Studio .NET C++ ?
>
> Hvis man eksempel har 200+ evalueringer man skal lave, er en switch s?tning
> s? hurtiger at udf?re end en if s?tning.
>

[switch versus en if-chain]

Hvis man har rigtigt mange evalueringer er metoden som regel at lave
en jump-table. Det vil sige en tabel, der til hver indgang knytter et
jump-point hvor der er noget kode som skal udfoeres. Hvis der er
faa kan det som regel ikke betale sig, og saa laver man bare den
naermest standardiserede if-chain.

Gode compilere vil vaere stort set ligeglad med hvilken konstruktion du
vaelger og optimere internt efter antallet af cases. Mindre gode
compilere vil kun jump-table konvertere switch'en og mindre gode
compilere igen vil bare lave en lang if-then-else chain ved anvendelse
af et switch-statement.

Hvis dog bare switch kunne lave sjovere ting end at checke paa
konstanter ;)

Et mellemting er at lave tabellen om til et binaert-trae og saa soege
igennem det. Koeretider for de forskellige metoder vil vaere:

if-chain: O(n)
binary-tree: O(lg n)
jump-table: O(1)

Husk dog paa at dette ikke siger noget om den konstante faktor, saa for
smaa vaerdier er if-chains nok hurtigst, specielt hvis man kigger paa
cache.

I praksis, naar du binder til en oversaetter, saa er Kents raad godt:

Profile!

Se paa koden der kommer ud og se om du kan lide det.

--
j.

Bertel Lund Hansen (12-07-2004)
Kommentar
Fra : Bertel Lund Hansen


Dato : 12-07-04 19:10

Kim Andersen skrev:

>Hvis man eksempel har 200+ evalueringer man skal lave, er en switch sætning
>så hurtiger at udføre end en if sætning.

Skriv det der giver den mest overskuelige kode. Fidusoptimeringer
koster mere tid end de sparer.

Jeg har ikke forstand på moderne compilere - de laver en masse
krumspring der giver effektiv kode. I en gammeldags compiler er
switchen meget hurtigere end en stribe if-sætninger fordi den kan
genreres som en jumptabel (én test, ét spring), mens
if-sætningerne skal gennemtygges én ad gangen.

--
Bertel
http://bertel.lundhansen.dk/   FIDUSO: http://fiduso.dk/

Igor V. Rafienko (12-07-2004)
Kommentar
Fra : Igor V. Rafienko


Dato : 12-07-04 20:40

[ Kim Andersen ]

> under Visual Studio .NET C++ ?
>
> Hvis man eksempel har 200+ evalueringer man skal lave, er en switch
> sætning så hurtiger at udføre end en if sætning.


Siden du skal lage så få evalueringer, så er det helt uinteressant
hvilken av metodene vil være rasket.

[ ... ]





ivr
--
<html><form><input type crash></form></html>

Anders Bo Rasmussen (12-07-2004)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 12-07-04 23:07

On 12 Jul 2004 21:39:55 +0200 Igor V. Rafienko wrote:

>> under Visual Studio .NET C++ ?
>>
>> Hvis man eksempel har 200+ evalueringer man skal lave, er en switch
>> sætning så hurtiger at udføre end en if sætning.
>
>
> Siden du skal lage så få evalueringer, så er det helt uinteressant
> hvilken av metodene vil være rasket.

Jeg tror han mener at han har 200 "cases" i switch. Hvis han skal køre
switchen mange gange kan det sikkert godt betyde noget.

Men det kan jo ændrer sig i næste version af compileren eller efter
hvilken processor man bruger. Med mindre det er et meget tidskritisk
sted, og noget meget tidskritisk kode, ville jeg under ingen
omstændigheder kigge på det. Vælg det kode der er mest forståligt.

--
41 6E 64 65 72 73

Anders Bo Rasmussen (12-07-2004)
Kommentar
Fra : Anders Bo Rasmussen


Dato : 12-07-04 23:16

On Tue, 13 Jul 2004 00:07:16 +0200 Anders Bo Rasmussen wrote:

>>> under Visual Studio .NET C++ ?
>>>
>>> Hvis man eksempel har 200+ evalueringer man skal lave, er en switch
>>> sætning så hurtiger at udføre end en if sætning.
>>
>>
>> Siden du skal lage så få evalueringer, så er det helt uinteressant
>> hvilken av metodene vil være rasket.
>
> Jeg tror han mener at han har 200 "cases" i switch. Hvis han skal køre
> switchen mange gange kan det sikkert godt betyde noget.
>
> Men det kan jo ændrer sig i næste version af compileren eller efter
> hvilken processor man bruger. Med mindre det er et meget tidskritisk
> sted, og noget meget tidskritisk kode, ville jeg under ingen
> omstændigheder kigge på det. Vælg det kode der er mest forståligt.

Derudover afhænger resultatet måske også af hvor ofte de forskellige
"cases" forekommer. Hvis det nu i 99.99% af tilfældende er den første
"case" der forekommer, er resultatet måske anderledes end hvis
hver case forekommer lige ofte.

--
41 6E 64 65 72 73

Mogens Hansen (13-07-2004)
Kommentar
Fra : Mogens Hansen


Dato : 13-07-04 08:06


"Anders Bo Rasmussen" <fuzz01@spamfilter.dk> wrote:

[8<8<8<]
> Derudover afhænger resultatet måske også af hvor ofte de forskellige
> "cases" forekommer. Hvis det nu i 99.99% af tilfældende er den første
> "case" der forekommer, er resultatet måske anderledes end hvis
> hver case forekommer lige ofte.

Det skulle "Profile guided optimization" hjælpe på.
Det har længe været muligt med Intel C++ for Windows og kommer i næste
udgave af Microsoft Visual C++ .NET (2005).

Venlig hilsen

Mogens Hansen



Kim Andersen (13-07-2004)
Kommentar
Fra : Kim Andersen


Dato : 13-07-04 07:45

Tak for jeres svar.

Jeg vil lave det så det er mest overskueligt for mig selv, og lade compiler
gøre det bedste den kan for mig. Men i samme ende vil den jo nok lave det
samme assembler kode.. måske.

/Kim



Søg
Reklame
Statistik
Spørgsmål : 177580
Tips : 31968
Nyheder : 719565
Indlæg : 6409076
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste