Ik heb een situatie waar ik geen oplossing op hoef, deze kan ik prima zelf bedenken. Het lijkt me een leuk idee om met ervaren en beginnende programmeurs over situaties na te denken
De situatie:
Ik wil op het scherm A óf B hebben staan, volledig random. Wat is de meest lightweight manier die je kunt verzinnen? Je mag uiteraard benchmarken, en als je een idee hebt maar niet weet of dat zou werken, dan kun je dat altijd vragen.
Een voorbeeldje (note: ik weet ook wel hoe ik dit simpeler maak, maar nu is er ruimte voor verbetering )
Ik zou een array maken waarin alle letters gestopt worden, in dit geval dus alleen A en B.
Hierna zou ik de array_rand() functie gebruiken om willekeurig een letter te kiezen.
@koosax: Punten voor uitbreidbaarheid, maar voor slechts 2 waardes is dit een beetje overkill. Php gaat niet zo efficient om met arrays, dus zeker op kleine schaal is dit een beetje pricey als je dit een miljoen keer doet.
Je zou ook zo kunnen doen als je in de array shuffle wilt blijft:
Martijn, het kan nog iets korter, maar ik denk dat je qua snelheid niet meer beter kan met je time() functie. Door === te gebruiken ben je ook sneller dan de ==.
Nu zijn jullie natuurlijk allemaal bloednieuwsgierig naar wat benchmarking, dus heb ik even een testje gemaakt: http://phphulp....itemasters
Pieter is nu dus het snelst, ong. 5% sneller dan Martijn's eerste script, en verbazingwekkend genoeg zorgt of de shuffle of de current functie ervoor dat Martijn's tweede script enorm traag is (in vergelijking met de rest).
---
Ook even eentje bedacht, geen idee of die snel is of niet:
---
Voor de eerlijkheid heb ik overal zoveel mogelijk whitespace gestript en onnodige variabele (zoals hierboven bij Pieter) weggehaald). Je ziet dan wat grotere verschillen.
Als je jouw Benchmark pagina enkele keren na elkaar refreshed krijg je telkens andere resultaten... De ene keer staan sommige scripts in het groen, dan in het rood, dan in het oranje...
Ik heb het gevoel dat dat waarschijnlijk te maken heeft met de verbinding tussen SiMa en jouw hosting?
UpLink, het heeft niks te maken met SiMa. Misschien wel wat met 'mijn' server die her en der wat traagjes loopt. De tool zelf is ook niet echt geweldig meer, ben bezig met een grote update, dus ik zou het vooral gebruiken voor het algemene overzicht.
De kleuren liggen trouwens ook aan het feit dat de tijd zo idioot snel is. 3 microseconde is 3E-9 seconde = .00000003 seconde. Een klein verschilletje in tijd kan dus al oplopen tot grote procentuele verschillen.
WouterJ en mij liggen heel erg nauw aan elkaar gewaagd. Kan je het anders niet 1000x laten uitvoeren? Dan zal het al iets betrouwbaarder zijn, niet? Of al de runs die al gelopen hebben opslaan en er een gemiddelde van nemen?
Waarschijnlijk is WouterJ zijn versie dus sneller dan de mijne in dit geval (mt_rand en echo ipv print):
@WouterJ: Dat het sloom is weet ik Zoals ik eerder zei, zijn arrays langzaam. Ik bedacht me gisterenavond dat mijne niet sneller is dan die van de reply boven me, omdat ik de hele array shuffle, wat in php een slecht idee is om high performance te doen.
Als we gaan benchmarken, wil ik deze ook wel zien:
Mijn vorige met time() is trouwens niet random zat ik later te denken, het is zowel te voorspellen (elke oneven secondes is het a) en het is op grote schaal niet random, want als je er 100 p/sec doet, dan krijg je 100x hetzelfde.
uniqid() gat op microtime, dus die kan tot milliseconde.
@de benchmark, leuk idee, maar volgens mij niet echt een benchmark. Allereerst, kun je er de code bij zetten? 'Martijn1' is niet zo duidelijk
Verder, hoeveel per stukje code doe je? Eigenlijk moet je het minimaal 1000x per stukje code doen. Ja dan wordt je pagina sloom, maar dan krijg je stabielere resultaten die beter kloppen en minder afhankelijk zijn van een server-hikje
edit2: Wat ik doe met benchmarks (Met grote getallen!) is het opslaan, en opslaan hoe vaak getest, dus hoe meer mensen het bekijken, hoe beter het klopt. Maar het is nu waarschijnlijk neit in een loop, dus de resultaten zijn veel te gevoelig zo
Pieter, de code van jou klopt niet. Een echo heeft geen return waarde en kan niet in zo'n conditite worden geplaatst. Print daarin tegen geeft altijd 1 terug en kan daarom wel in zo'n conditie geplaatst worden.
@Martijn en Pieter, de repeat staat momenteel op 1000, ik kan hem ook wat hoger zetten als jullie dat willen?
@De brenchmark, de code van PHPbench heb ik op github gezet: https://github.com/WouterJ/PHPbench/
Ik kan wegens wat gebreken de code niet laten zien bij de test, maar de totale code van deze test is ook op github te bekijken: https://github....asters.php
Het idee van opslaan van de gegevens is een goede, ik ga kijken of ik dat in V2.0 van PHPbench kan stoppen!
Hij staat nu op 10.000 en ik rond hem nu niet meer af, je ziet de maximale significantie.
Even voor de duidelijkheid, de code slaat de totale tijd die nodig is om de functie 10.000 keer uit te voeren op. Deze deelt hij door 10.000 om zo de gemiddelde, en vaak meest precieze, tijd te krijgen voor de functie. Die laat hij zien.
@Martijn, ik weet niet wat er mis is met je laatste script. Maar hij gaat wel heel traag...
Hm, ik vergeet altijd de naam voor %, maar ik was in de veronderstelling dat die wel snel was Ik geloof dat ik wat code anders moet gaan maken
@UpLink: Het probleem daarvan is dat we dus mensen code op de server moeten laten uitvoeren, en dan kunnen er rare dingen gaan gebeuren. Verder, stel 100 mensen gaan benchmarken, iets zwaarders dan een echo, dan wordt heel SiMa traag
Hm, ik vergeet altijd de naam voor %, maar ik was in de veronderstelling dat die wel snel was Ik geloof dat ik wat code anders moet gaan makenÂ
@UpLink: Het probleem daarvan is dat we dus mensen code op de server moeten laten uitvoeren, en dan kunnen er rare dingen gaan gebeuren. Verder, stel 100 mensen gaan benchmarken, iets zwaarders dan een echo, dan wordt heel SiMa traagÂ
edit: Met % heet modulus, het kwam opeens tot meÂ
Ok, let go of my idea then... =p
Had zover nog ni nagedacht =p