Versio

CPU-effectief iedere halve seconde loopen

Overzicht Reageren

Pagina: 1 2 volgende »

Teun Beijers

Teun Beijers

21/03/2009 01:20:00
Quote Anchor link
Ik heb een scriptje dat iedere halve seconde(of sneller) moet loopen. Nu dacht ik het met dit te kunnen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
while(true) {
//Code van mij hier
usleep(500);
}

?>

Dit kost me(omdat ik ook nog eens zelf code heb natuurlijk) echter 50% van mijn cpu.
Dit script:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<?php
while(true) {
//Code van mij hier
sleep(1);
}

?>

Kost maar 0.6% CPU. Alleen dat script werkt natuurlijk weer niet om de halve seconde. Iemand een ideetje hoe ik dit kan aanpakken?
 
PHP hulp

PHP hulp

24/05/2012 07:16:02
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Kasper Isgek

Kasper Isgek

21/03/2009 01:57:00
Quote Anchor link
Wat is er in hemelsnaam zo belangrijk dat hij iedere halve seconde moet updaten? :/

Hoe dan ook, van php.net:
Quote:
Halt time in micro seconds. A micro second is one millionth of a second.


Je update met usleep(500) dus niet iedere halve seconde, maar veel vaker (namelijk 2000 keer per seconde, en dat verklaart ook je overwerkende CPU). Met usleep(500000) zou je iedere halve seconde moeten updaten.
 
Jonathan -

Jonathan -

21/03/2009 08:34:00
Quote Anchor link
Als je het echt zo exact wilt hebben: vergeet niet dat het uitvoeren van de while en de code binnen de while ook tijd kost, die er dus bovenop komt. Stel jouw script is 0,1 seconde bezig, dan wordt er na die 0,1 seconde nog 0,5 seconde gewacht. Dan draait je script dus elke 0,6 seconde. Mocht het belangrijk zijn dat het echt exact elke 0,5 seconde draait, probeer dan eens wat met microtime te bouwen.
 
Bo az

Bo az

21/03/2009 10:14:00
Quote Anchor link
Jonathan schreef op 21.03.2009 08:34:
Als je het echt zo exact wilt hebben: vergeet niet dat het uitvoeren van de while en de code binnen de while ook tijd kost, die er dus bovenop komt. Stel jouw script is 0,1 seconde bezig, dan wordt er na die 0,1 seconde nog 0,5 seconde gewacht. Dan draait je script dus elke 0,6 seconde. Mocht het belangrijk zijn dat het echt exact elke 0,5 seconde draait, probeer dan eens wat met microtime te bouwen.


Zelfs dan nog kan je er niks over zeggen. Het kan wel zijn dat je proces verder wil, maar als je OS eerst een ander proces laat gaan, duurt het als nog langer.
 
Jonathan -

Jonathan -

21/03/2009 13:30:00
Quote Anchor link
Boaz schreef op 21.03.2009 10:14:
Jonathan schreef op 21.03.2009 08:34:
Als je het echt zo exact wilt hebben: vergeet niet dat het uitvoeren van de while en de code binnen de while ook tijd kost, die er dus bovenop komt. Stel jouw script is 0,1 seconde bezig, dan wordt er na die 0,1 seconde nog 0,5 seconde gewacht. Dan draait je script dus elke 0,6 seconde. Mocht het belangrijk zijn dat het echt exact elke 0,5 seconde draait, probeer dan eens wat met microtime te bouwen.


Zelfs dan nog kan je er niks over zeggen. Het kan wel zijn dat je proces verder wil, maar als je OS eerst een ander proces laat gaan, duurt het als nog langer.

Conclusie: bedenk een andere oplossing.
 
Wouter DS

Wouter DS

21/03/2009 13:34:00
Quote Anchor link
cronjobs?
 
Jonathan -

Jonathan -

21/03/2009 13:38:00
Quote Anchor link
Paradox™ schreef op 21.03.2009 13:34:
cronjobs?

Dat kan ik niet zeggen als ik niet weet wat de bedoeling van de TS is. Als hij iets elke halve seconde uit wil voeren dan denk ik dat er een denkfout in het systeem zit.
 
Willem Jan Z

Willem Jan Z

21/03/2009 13:46:00
Quote Anchor link
Paradox, je kan geen cronjobs elke halve seconde starten :P Maar denk ook niet dat dat zijn bedoeling is.
 
Justin S

Justin S

21/03/2009 16:40:00
Quote Anchor link
Wat is de hele bedoeling van het script? Waarom zou je in vredesnaam iets elke halve seconde willen loopen :-s? Mis ik iets?
 
Teun Beijers

Teun Beijers

21/03/2009 17:58:00
Quote Anchor link
Het hoeft niet eens precies een halve seconde te zijn hoor. Maar gewoon sneller dan een seconde, het is eigenlijk alleen maar voor een soort "educatief" projectje, geen echt project dus. Kasper heeft me wel de goede oplossing gegeven. Dacht er inderdaad even niet aan dat het 1 miljoenste was.

O ja, als je dan toch precies wil weten, het gaat erom dat "troepen" bij een soort age of empires achtig browserspel iedere halve seconde bewegen, een seconde vond ik net te lang om precies te zijn. Eerst dacht ik alleen de tijd van de bestemming bereiken te nemen, maar dan kun je bijvoorbeeld het niet zien als een troep, laten we zeggen, halverwege is en een gebouw dat daar staat voorbij komt.
Gewijzigd op 01/01/1970 01:00:00 door Teun Beijers
 
Midas

Midas

21/03/2009 18:08:00
Quote Anchor link
Doe dat dan met JavaScript.
 
Teun Beijers

Teun Beijers

21/03/2009 18:17:00
Quote Anchor link
Javascript kan door de gebruiker worden aangepast, dus dan kunnen ze instellen dat het loopje om de 1/10de van een seconde loopt en gaan de troepen sneller. Als ik iets fout zie moet je 't zeggen hè, ik leer graag ^^

EDIT: Het script runned trouwens niet voor elke gebruiker, het loopt 1x op een aparte server(in dit testgeval: mijn eigen pc), en managed alle gebruikers
Gewijzigd op 01/01/1970 01:00:00 door Teun Beijers
 
- Ricardo -

- Ricardo -

21/03/2009 18:25:00
Quote Anchor link
sleep(0.5) werkt ook gewoon bij mij hoor ??
 
Teun Beijers

Teun Beijers

21/03/2009 19:06:00
Quote Anchor link
serieus? is me nooit opgevallen iig xD
 
- Ricardo -

- Ricardo -

21/03/2009 19:08:00
Quote Anchor link
Misschien herinner ik het me wel verkeerd hoor, moet je maar even proberen, ik zou het graag weten :-)

Tijd geleden gebruikt
 
Midas

Midas

21/03/2009 19:09:00
Quote Anchor link
teuneboon schreef op 21.03.2009 18:17:
Javascript kan door de gebruiker worden aangepast, dus dan kunnen ze instellen dat het loopje om de 1/10de van een seconde loopt en gaan de troepen sneller. Als ik iets fout zie moet je 't zeggen hè, ik leer graag ^^

EDIT: Het script runned trouwens niet voor elke gebruiker, het loopt 1x op een aparte server(in dit testgeval: mijn eigen pc), en managed alle gebruikers
Kan je dat in dit geval niet serverside controleren ofzo?
 
Wouter DS

Wouter DS

21/03/2009 19:24:00
Quote Anchor link
WillemJan Z schreef op 21.03.2009 13:46:
Paradox, je kan geen cronjobs elke halve seconde starten :P Maar denk ook niet dat dat zijn bedoeling is.

Neen maar welke elke minuut en zoveel verschil zal dat wel niet maken zeker xD..


PS: voor wat staat iig
Gewijzigd op 01/01/1970 01:00:00 door Wouter DS
 
- Ricardo -

- Ricardo -

21/03/2009 19:30:00
Quote Anchor link
wat iig betekend :P? in ieder geval
of bedoelde je dat niet :)
 
Kasper Isgek

Kasper Isgek

21/03/2009 20:47:00
Quote Anchor link
Ricardo schreef op 21.03.2009 18:25:
sleep(0.5) werkt ook gewoon bij mij hoor ??
Als het goed is wordt 0.5 afgerond naar 1 seconde. 0.25 wordt 0 seconde. Zie ook de php.net pagina van sleep (in de comments ergens geloof ik).

Misschien een idee:
Het voordeel van javascript is dat je gebruik maakt van de rekenkracht van meerdere computers, in plaats van de rekenkracht van een server. Je zou javascript kunnen gebruiken voor het grootste gedeelte van de berekeningen, en op je server 'de grote lijnen' bijhouden (met een interval van bv. 30 seconden). De javascript berekeningen upload je dan iedere 30 seconden, en wijken de javascript berekeningen af van wat je verwacht - op basis van je php - dan genereer je een error. Op die manier kan je wellicht controleren of er met de javascript geknoeid is?
 
Teun Beijers

Teun Beijers

21/03/2009 21:07:00
Quote Anchor link
Inderdaad, heb wel ideetje, ik geef aan javascript per troep een bepaalde richting en positie door, maar alleen maar als die positie ook in het "line of sight" van die gebruiker zit. Maar ik vraag me dan wel af hoe iets als tribalwars.nl altijd als de troep aankomt ook precies de aanval uitvoert. Daar gaat het namelijk echt op de seconde precies.
 
- Ricardo -

- Ricardo -

21/03/2009 23:03:00
Quote Anchor link
Je kan het ook nog zo doen:

time_sleep_until(time()+0.2));

dan blijft hij 0.2 seconden werken, dat werkt sowieso op tienden secondes
 

Pagina: 1 2 volgende »



Overzicht Reageren