Versio

snelheid van random door vele iteraties

Overzicht Reageren

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

25/05/2012 18:07:26
Gesponsorde koppelingen:
 
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 Erkelens

Eddy Erkelens

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 rrrr

Jelmer rrrr

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

Get Adobe Flash player