[ASP/VBS] Efficienter If of Case *

Pagina: 1
Acties:

  • sjink
  • Registratie: Oktober 2002
  • Laatst online: 03-02-2025
Ben een script aan het maken voor een behoorlijk groot formulier af te handelen in AS, met vbscript dus. Nou vroeg ik me af wat sneller is in een bepaald geval een aantal if-statements of een select-case constructie. Er moet op 2 voorwaarden worden gecontroleerd.

Optie 1
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
if a = 1 AND x = 5 then
  'doe iets...

elseif a = 2 AND x = 5 then
  'doe iets...

elseif a = 2 AND x = 5 then
  'doe iets...

elseif a = 3 AND x = 5 then
  'doe iets...

elseif a = 4 AND x = 5 then
  'doe iets...

elseif a = 5 AND x = 5 then
  'doe iets...

end if


Optie 2
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
select case a
    case 1

        if x = 5 then
            'doe iets...
        end if

    case 2

        if x = 5 then
            'doe iets...
        end if

    case 3

        if x = 5 then
            'doe iets...
        end if

    case 4

        if x = 5 then
            'doe iets...
        end if

    case 5

        if x = 5 then
            'doe iets...
        end if

end select

[ Voor 6% gewijzigd door sjink op 28-05-2004 10:54 ]

*blup*


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Maakt geen klote uit kwa snelheid. De gecompileerde programmacode zou er theoretisch hetzelfde uit moeten zien. Maar een select case ziet er natuurlijk in de code veel netter uit.

Misschien een gek idee trouwens, maar wat dacht je hiervan?
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if x = 5 then
  select case a
    case 1
            'doe iets...

    case 2
            'doe iets...

    case 3
            'doe iets...

    case 4
            'doe iets...

    case 5
            'doe iets...
  end select
end if

Kijk eens wat dat je een checks scheelt...

[ Voor 52% gewijzigd door NMe op 28-05-2004 10:56 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • OZ-Gump
  • Registratie: November 2002
  • Laatst online: 14-05-2024

OZ-Gump

terug van weggeweest

voor zover ik weet is het in dit soort gevallen niet een kwestie van tijd, maar van overzichtelijkheid die je zou moeten doen besluiten voor de case te gaan.

Volgens mij maakt het qua tijd geen noemenswaardig verschil.

Edit:
In jouw bovenstande case, ben je natuurlijk niet slim bezig. Je kijkt eerst naar de verschillende cases, maar in elke case controleer je of de x 5 is.

Controleer eerst of de x 5 is, zo ja, spring de case in. Is nog een stukkie optimaler ;)

[ Voor 37% gewijzigd door OZ-Gump op 28-05-2004 10:57 ]

My personal website


  • sjink
  • Registratie: Oktober 2002
  • Laatst online: 03-02-2025
NMe84 schreef op 28 mei 2004 @ 10:55:
Maakt geen klote uit kwa snelheid. De gecompileerde programmacode zou er theoretisch hetzelfde uit moeten zien. Maar een select case ziet er natuurlijk in de code veel netter uit.
Volgens mij wordt ASP met vbscript pas gecompileerd op het moment dat je het opvraagt, dus kan misschien wel een tijdverschil in compileren zitten.

*blup*


  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Ik denk dat je het beste kunt beginnen met het testen van x, want het lijkt erop dat die altijd 5 moet zijn.
Snelheid hangt over het algemeen af van de hoeveelheid vergelijkingen die er gemiddeld uitgevoerd moeten worden.

Never underestimate the power of


  • sjink
  • Registratie: Oktober 2002
  • Laatst online: 03-02-2025
owja :D
slimme mensen hier :D

*blup*


Verwijderd

Wellicht handiger om eerst met de if x = 5 te beginnen
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
if x = 5 then
    select case a
        case 1
            'doe iets...
        case 2
            'doe iets...
        case 3
            'doe iets...
        case 4
            'doe iets...
        case 5
            'doe iets...
    end select
end if

mmm.. het copy/paste koste toch veel ;)

[ Voor 11% gewijzigd door Verwijderd op 28-05-2004 10:59 ]


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

sjink schreef op 28 mei 2004 @ 10:57:
Volgens mij wordt ASP met vbscript pas gecompileerd op het moment dat je het opvraagt, dus kan misschien wel een tijdverschil in compileren zitten.
Nope, maakt geen noemenswaardig verschil. En als je moet kiezen tussen veel overzichtelijkere code, en een nanoseconde snelheidswinst, dan zou die snelheidswinst me niet veel kunnen schelen. ;)
Overigens geldt dit bij elke taal, en niet alleen bij ASP/VBScript. :)

[ Voor 8% gewijzigd door NMe op 28-05-2004 11:07 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • Sponge
  • Registratie: Januari 2002
  • Laatst online: 18:24

Sponge

Serious Game Developer

Eh, ik ben het oneens met alle reacties hier.

Select Case is 'veel sneller' dan de bovenstaande Else If constructie. Bij de Else IF constructie zal de hele If/Else if constructie gechecked moeten worden of iets true is of niet. Hetzelfde geldt voor de "AND" als je die binnen de eerste if zet, wordt deze pas gevalideerd als de eerste conditie (bijv If A = 1) true is, ipv dat beide If A = 1, "and" X = 5 gechecked worden.

Bij de Select Case wordt er gestopt met het evalueren van de "cases" wanneer er een case gematched is. Daarom moet de meest voorkomende Case ook altijd bovenaan staan.

  • cameodski
  • Registratie: Augustus 2002
  • Laatst online: 06-11-2023
Sponge schreef op 28 mei 2004 @ 11:08:
Eh, ik ben het oneens met alle reacties hier.

Select Case is 'veel sneller' dan de bovenstaande Else If constructie. Bij de Else IF constructie zal de hele If/Else if constructie gechecked moeten worden of iets true is of niet. Hetzelfde geldt voor de "AND" als je die binnen de eerste if zet, wordt deze pas gevalideerd als de eerste conditie (bijv If A = 1) true is, ipv dat beide If A = 1, "and" X = 5 gechecked worden.

Bij de Select Case wordt er gestopt met het evalueren van de "cases" wanneer er een case gematched is. Daarom moet de meest voorkomende Case ook altijd bovenaan staan.
Je zou voor de grap eens een if/else if constructie moeten debuggen. Dan zul je zien dat zo gauw als er een if/else if true oplevert, dat stukje uitgevoerd wordt en dat de rest van de if/else if overgeslagen wordt. Dus net zo als een case wordt uitgevoerd.
Of ga je nu beweren dat dat in vbscript niet zo gebeurd :?

[ Voor 4% gewijzigd door cameodski op 28-05-2004 11:14 ]

Never underestimate the power of


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

Sponge schreef op 28 mei 2004 @ 11:08:
Eh, ik ben het oneens met alle reacties hier.

Select Case is 'veel sneller' dan de bovenstaande Else If constructie. Bij de Else IF constructie zal de hele If/Else if constructie gechecked moeten worden of iets true is of niet. Hetzelfde geldt voor de "AND" als je die binnen de eerste if zet, wordt deze pas gevalideerd als de eerste conditie (bijv If A = 1) true is, ipv dat beide If A = 1, "and" X = 5 gechecked worden.

Bij de Select Case wordt er gestopt met het evalueren van de "cases" wanneer er een case gematched is. Daarom moet de meest voorkomende Case ook altijd bovenaan staan.
Je vergeet dat de code van TS niet optimaal is. Als de bovenste code uit de startpost "goed" herschreven zou worden, dan maakt het niet meer uit:
Visual Basic .NET:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if x = 5 then
  if a = 1 then
    'doe iets...

  elseif a = 2 then
    'doe iets...

  elseif a = 3 then
    'doe iets...

  elseif a = 4 then
    'doe iets...

  elseif a = 5 then
    'doe iets...

  end if
end if

Op deze manier is het minimale en maximale aantal checks 2, net zoals bij de select case die ik hierboven heb herschreven.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • The Lord
  • Registratie: November 1999
  • Laatst online: 23:15
En als aanvulling op Sponge:

Bij een CASE kun je ook heel goed met berekeningen werken. Stel je hebt 2 variabelen waarop je wilt controleren. Indien je deze twee kan combineren (bijvoorbeeld met een XOR) tot één unieke waarde dan hoef je enkel op deze unieke waarde te controleren. Wellicht kun je de data welke voor de checks wordt gebruikt hierop aanpassen.

geeft geen inhoudelijke reacties meer


  • NMe
  • Registratie: Februari 2004
  • Laatst online: 24-05 14:53

NMe

Quia Ego Sic Dico.

The Lord schreef op 28 mei 2004 @ 11:19:
En als aanvulling op Sponge:

Bij een CASE kun je ook heel goed met berekeningen werken. Stel je hebt 2 variabelen waarop je wilt controleren. Indien je deze twee kan combineren (bijvoorbeeld met een XOR) tot één unieke waarde dan hoef je enkel op deze unieke waarde te controleren. Wellicht kun je de data welke voor de checks wordt gebruikt hierop aanpassen.
XOR is net als OR en AND een manier om 2 checks van elkaar te scheiden, dus je verhaaltje klopt niet helemaal. ;)

Verder is een systeem met XOR ook denkbaar in een if/else constructie.

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


  • The Lord
  • Registratie: November 1999
  • Laatst online: 23:15
NMe84 schreef op 28 mei 2004 @ 11:21:
[...]

XOR is net als OR en AND een manier om 2 checks van elkaar te scheiden, dus je verhaaltje klopt niet helemaal. ;)
Helemaal mee eens.
Verder is een systeem met XOR ook denkbaar in een if/else constructie.
Dit wordt saai; ben ik ook met je eens.

Het XOR verhaal valt eigenlijk in de categorie 'optimalisatie van code naar condities'. En daaronder valt natuurlijk ook dat als je in elk conditionele statement zou controleren op 'x=5' dat je dat beter anders kan schrijven in code.

Ik bedoelde het meer als algemene hint; op meerdere condities controleren kan wellicht efficiënter op een andere wijze.

In dit geval zou er wellicht eerst een XOR kunnen worden uitgevoerd waarna een CASE enkel op geproduceerde waarde hoeft te controleren. En wellicht kan dat gewoonweg niet, omdat de topicstarten gewoon een willekeurig voorbeeld voor het probleem heeft genomen.

geeft geen inhoudelijke reacties meer


  • curry684
  • Registratie: Juni 2000
  • Laatst online: 12-05 22:23

curry684

left part of the evil twins

[ASP/VBS] in de topictitel gefrot, let daar aub zelf op volgende keer :)

Professionele website nodig?


  • sjink
  • Registratie: Oktober 2002
  • Laatst online: 03-02-2025
curry684 schreef op 28 mei 2004 @ 11:46:
[ASP/VBS] in de topictitel gefrot, let daar aub zelf op volgende keer :)
Dacht ik net aan toen ik em gepost had, zal er de volgende keer aandenken. ;)

*blup*

Pagina: 1