Hej, Troligtvis Select Case satser. Select Case är snabbare och effektivare. If-sats-tramset är oftast ytterligt marginell. Optimeringar är nästan alltid av ondo. Det förstör utseendet på kod. Precis som Niklas säger så kommer y aldrig att testas om x är falsk då man skriver if(x && y), hur fallet är med VB vet jag inte men det verkar närmast absurt att separera en sådan sats. Optimeringar bör göras på CPU-intensiva/tidskrävande delar och inte för att ev. vinna någon nanosekund. I VB har man inte short-circuiting, nej. Lite off topic eftersom det här är VB-forumet, men i VB.NET kan man skriva AndAlso istället för And för att den ska avbryta kontrollen så fort ett av argumenten inte stämmer. Ang. Niklas svar. Helt rätt. <b>>Om det första inte svarar True så är det djä... onödigt att kolla dom 5 andra.</b> Och när Vi ändå är inne på logik och speed. Så om jag har en bool-variabel HasBoughtMilk, och vill göra en speciell grej om jag inte har köpt mjölk, så tycker du att det är snyggare att skriva: LOL :-) Bra Niklas Jag har alltid varit facinerad av optimization. Sven, om vi pratar VB och stränghantering så lär det vara snabbare att anropa UCase, LCase Mattematik är alltid snabbare än stränghantering. <b>>Men ! skulle man inte kunna få in DisgustingCookie Sven, för att kunna använda "matematik" (addition av heltal, gäsp) <b>>If a Or b Or c then Ja, det stämmer. Jag kan ha antytt fel angående And också. Där kan ett falskt resultat alltid bryta satsen, men gör det inte.Speed?
Undrar vilket alternativ som är snabbast resp. effektivas, Select Case eller If then else.
Har skrivit en rutin med ca 10-15 händelser enligt nedanstående.
If...then
elseif...then
elseif...then
osv
end if.
Fråga - bör jag skriva om till Select Case?
Tacksam för svar
GöranSv: Speed?
Men prestandaskillnaden är nog inte speciellt stor, men om du har 15 olika är det mycket lättare att läsa med en Select Case sats, så det är den stora fördelen.Sv:Speed?
Marginellt men ändå om man är optimerings-"bög" som jag.
En annan sak i detta sammanhang så är det mycket effektivare att skriva.
<code>
If a > 10 Then
If a < 20 Then
'do youre stuff
End If
End If
</code>
Skulle kunna skrivas mindre effektivt
<code>
If a > 10 And a < 20 Then 'Do your stuff
</code>Sv: Speed?
Notera också att if-sats-kommentaren i stort sett bara är tillämpbar i fallet VB eller VBA. I alla moderna språk så använder man short-circuiting som snarare ger motsvarande "optimering" negativ effekt.
Låt säga att du i C++ har koden:
if(x && y)
z;
och "optimerar" den till:
if(x){
if(y)
z;
}
Då är det möjligt att den senare varianten är sämre.
Sv:Speed?
/PeterSv: Speed?
if jobbigproc1 And jobbigproc2 and jobbigproc3 and jobbigproc4 then ...
kommer alltid att göra alla 4 grejerna. I fall där de ingående argumenten är komplicerade finns det en vinst i att skriva om det som sven säger. Är det enkla grejer så finns det ingen mätbar nytta med det.Sv:Speed?
ThomasSv:Speed?
Mitt exempel var inte bra.
Men om du har, som man ser ibland And And And And osv. så är det mycket
effektivar att omvandla till IF satser eller om det går Select Case.
Som Niklas skriver, VB kollar alla onödiga AND.
Om det första inte svarar True så är det djä... onödigt att kolla dom 5 andra.Sv: Speed?
Framförallt - och det är en stor brist i VB - kan det vara så att dessutom blir fel om man kollar resten.
Om jag i VB skulle skriva
<code>
if Not IsNothing(x) And x.apa = y then
...
</code>
Skulle först "IsNothing(x)" utföras, sen "x.apa=y". Men tanken med ifsatsen var ju att om x inte finns så skulle vi slippa göra den andra jämförelsen, och det leder i sin tur till att vi får ett fel.
I C++ skulle jag ha skrivit:
T *x;
if(x != 0 && x->apa ==y)
...
Är då x == 0 så testas inte x->apa, och vi får inget fel.
I VB är enda möjligheten att komma runt det att göra på "Svens" sätt.
Sv:Speed?
Det där med <b>Not</b> har jag aldrig förstått (Woops det rimmar om man säger det)
Varför skriver man <b>If Not While Not</b> mfl. Skulle det vara en logisk genväg ?
<b>Neeeeeeej ! </b> Skriker jag djä... trams när du kan formulera dig mer positivt.
Undrar om man inte kan urskilja dom positiva programmerarna
från dom negativa genom att läsa deras kod.
Mycket <b>Not</b> en pesemist (dysternisse) typ Lejonborg ;-)Sv: Speed?
<code>
...
If HasBoughtMilk Then
Else
DoStuff
End If
...
</code>
än
<code>
...
If Not HasBoughtMilk Then
DoStuff
End If
...
</code>
?
Eller om jag vill veta om jag har köpt mjölk och samtidigt att kakan inte är äcklig:
<code>
If HasBoughtMilk And Not DisgustingCookie Then
DoStuff
End if
</code>
Är det då bättre med:
<code>
If Not(Not HasBoughtMilk And DisgustingCookie) Then
DoStuff
End if
</code>
Eller kanske:
<code>
If HasBoughtMilk Then
If DisgustingCookie Then
Else
DoStuff
End if
End if
</code>
Not är en självklar boolesk operator.Sv:Speed?
<b>If HasBoughtMilk Then</b> allt är Ok behöver inte gör något mer <b>Exit Function</b>
nästa rad:
<b>Skicka kärringen att köpa mjölk ;-)</b>
<b>End Function</b>
Lite osäker där i skrivande stund.
Men ! skulle man inte kunna få in <b>DisgustingCookie</b>
i en <b> Or </b> sats. <b> Or </b> är till skillnad mot <b>And</b> mycket effektivt.Sv: Speed?
<code>
If x <> 0 Or y <> 0 Then ....
'Kan skrivas
y = - (x > 0)
'Eller kanske
If (x = 0) Xor (y <> 0 ) Then ....
</code>
När jag skriver kod så räcker det med att jag begriper.
Förstår att dom skulle bli vansinniga på mig om jag jobbade i ett team.
Tex om jag vill ändra mellan Versaler och Gemena så vet jag att det skiljer 32 mellan dom.
"A" är 65 gemena är 65 + 32 dvs 97. Sån är jag och det står jag för. ;-)Sv:Speed?
än att konvertera varje bokstav i strängen till en ny sträng för den aktuella positionen, följt av konvertering till integer/Long, följt av addition och sedan konvertering tillbaks till en sträng för bokstaven och till sist strängbyggande för att få tillbaks det ursprungliga ordet. Det blir en jäkla massa strängskapande, dvs allokering av minne. VB-implementationen är såklart smartare än så, därför bör du använda den. Dessutom blir koden mycket mer lättläst.Sv: Speed?
Har märkt att många av Er "nissar" är rädda för matte och siffror,
jag tänker alltid i siffror om det går.
Ärligt ! Vad tror du functionen UCase LCase gör ? Jooo jobbar + - med 32
Ett av dom bästa optimizationstrix jag vet och stulit är när man använder DoEvents.
[DoEvents i Loop:ar]Sv:Speed?
i en Or sats. Or är till skillnad mot And mycket effektivt.</b>
Or är precis lika ineffektivt, använder inte heller short-cicuiting.
<code>
If a Or b Or c then
</code>
Kommer alltid att evaluera a, b, och c även om a är falskt.
Och det är klart att man kan skulle kunna traggla med att försöka skriva om det på något sätt.
Problemet är bara att det är ointressant. Att använda normala "snygga" ifsatser gör koden läsbar. Att modifiera dem till snurriga ifsatser gör koden svår att läsa.
Och framför allt - att ta bort "not" ger ingen som helst prestandavinst. Det gör koden mer svårläst och ger inget.Sv:Speed?
i Ditt tänk, så krävs MER stränghantering än vad UCase/LCase orsakar.
Eftersom du måste konvertera mellan tal och strängar fler gånger,
och det är detta som tar tid. Sv: Speed?
>Kommer alltid att evaluera a, b, och c även om a är falskt.</b>
En liten rättelse: om a är <b>sant</b> menade du nog. Annars måste man givetvis kolla resterande villkor också.
/PeterSv:Speed?