|
| 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
| |
|
|