snelheid van random door vele iteraties

Overzicht Reageren

Sponsored by: Vacatures door Monsterboard

Rudie dirkx

rudie dirkx

17/10/2008 14:40:00
Quote Anchor link
Ik ben benieuwd wat sneller is in PHP en wat het "netste" is.
Het volgende moet ongeveer 50*50 keer uitgevoerd worden:

1. geen mogelijkheden
2. IF (X): 1 extra mogelijkheid
3. IF (X): 1 extra mogelijkheid
4. IF (X): 1 extra mogelijkheid
5. IF (X): 1 extra mogelijkheid
6. kies een willekeurige mogelijkheid
Er is er altijd minstens 1 mogelijk, dus het niet altijd random (als er maar 1 optie is, wordt die natuurlijk gekozen), maar meestal zijn er 3 opties.

Wat is de beste, snelste, netste manier om die opties "op te slaan" en er 1 van te kiezen?

Ik gebruik nu dit (al oud):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

$p
= '';
if ( w ) { $p .= 'a'; }
if ( x ) { $p .= 'b'; }
if ( y ) { $p .= 'c'; }
if ( z ) { $p .= 'd'; }
$r = $p{rand(0, strlen($p)-1)};

?>

Dat werkt. Maar heb geen idee of dit sneller is (en het bovenstaande is een beetje raar en ik heb ooit gehoord dat {} niet meer "mag"):
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php

$p
= array();
if ( w ) { $p[] = 'a'; } // of is push($p, 'a') sneller?
if ( x ) { $p[] = 'b'; }
if ( y ) { $p[] = 'c'; }
if ( z ) { $p[] = 'd'; }
$r = $p[array_rand($p)];

?>


De snelheid kan ik wel benchmarken, maar ben benieuwd wat jullie zouden doen en wat de status is van zo een char in een string pakken: $str{x}.
Dank
 
PHP hulp

PHP hulp

24/04/2024 10:45:25
 
Rudie dirkx

rudie dirkx

17/10/2008 14:45:00
Quote Anchor link
De eerste methode is sneller. (ongeveer 10%)
 
- -

- -

17/10/2008 14:54:00
Quote Anchor link
@ t vercetti, waar baseer je dit op?
 
Rudie dirkx

rudie dirkx

17/10/2008 14:58:00
Quote Anchor link
Dat heb ik gebenchmarkt, als dat een woord is.
 
Eddy E

Eddy E

17/10/2008 15:29:00
Quote Anchor link
Ik denk dat dit een nettere mogelijkheid is.
Vooral omdat je dan ook doet, wat je in feite doet:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
<?php
$9 = 0;
if ( w ) { $p .= 1 }
if ( x ) { $p .= 2; }
if ( y ) { $p .= 3; }
if ( z ) { $p .= 4; }
$r = $p{rand(1, strlen($p))};
?>


Je maakt ipv van een alfarieke-code (als "acd" een numeriek getal: 134.
Numeriek is sowieso sneller.
Door alvast een 0 in te stellen hoef je met strlen() geen berekening uit te voeren.
Je moet daarna (ja, dat wel) nog even de 1 vervangen door een a etc.
Maar waarschijnlijk kan je toch al beter overstappen op getallen i.p.v. letters.
 
Jelmer -

Jelmer -

17/10/2008 17:15:00
Quote Anchor link
Door die '.', wat niets meer dan een 'concatenate string' opdracht is afgekort naar één teken, doe je in essentie juist een string-operatie. En jep, die heeft twee strings nodig.

Dus zodra je $p = 9; $p .= 3; doet, voert PHP juist 2 extra operaties uit: namelijk, zowel 9 als 3 moeten omgezet worden naar een string (omdat je ze anders niet aan elkaar kan plakken). En bij ieder getal dat er bij komt in een if-stukje gebeurt dat nog eens. In theorie is het dus langzamer.

Ik denk (denk, dus niet getest) dat de string-methode die je momenteel gebruikt voor een klein aantal het snelste is. Bij meer if-stukjes vermoed ik dat de array-aanpak sneller is omdat elementen bij een array aanschuiven niet zo duur is als 2 strings aan elkaar plakken. Let wel even dat je alleen maar array_rand() hoeft aan te roepen. Deze geeft al een element terug. Die $p[...] eromheen is niet meer nodig.
 



Overzicht Reageren

 
 

Om de gebruiksvriendelijkheid van onze website en diensten te optimaliseren maken wij gebruik van cookies. Deze cookies gebruiken wij voor functionaliteiten, analytische gegevens en marketing doeleinden. U vindt meer informatie in onze privacy statement.