Précédent   Forum des professionnels en informatique > PHP > Langage > Fonctions
Fonctions Forum d'entraide sur les fonctions PHP. Avant de poster -> FAQ fonctions et Sources diverses
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/04/2011, 17h59   #1
Invité de passage
 
Inscription : avril 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 3
Points : 1
Points : 1
Par défaut microtime(true) + usleep(), benchmark bande passante incohérent.

Bonjour à tous.
Ce post pour demander de l'aide à propos d'un comportement étrange qui peut être reproduit tout le temps (apcahe2 + php5).
Je ne sait pas si je me plante mais je vais essayer d'expliquer la finalité de la démarche:

J'ai besoin d'envoyer des chunks de donnée binaires (par exemple 30), puis de calculer la bande passante moyenne sur ces 30 shunts en Kbit/s.
J'additionne chaque temps d'output dans une var, ainsi que la taille de chaque chunk, puis je fait le total à la fin.

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
33
34
35
36
37
38
 
	<?php
 
	// build my binary chunk
	$var= '';
	$o=9000;
	while($o--)
	{
		$var.= "testtest";
	}
 
	// get the size, prepare the memory.
	$size = strlen($var);
	$tt_sent = 0;
	$tt_time = 0;
 
	// I send my chunk 30 times
	for ($i = 0; $i < 30; $i++)
	{
		// start time
		$t = microtime(true);
		echo $var."\n";
		ob_flush();
		flush();
		$e = microtime(true);
		// end time
		// the difference should reprenent what it takes to the server to 
		// transmit chunk to client right ?
 
		// add this chuck bench to the total
		$tt_time += round($e-$t,4);
		$tt_sent += $size;
	}
 
	// total result
	echo "\n total: ".(($tt_sent*8)/($tt_time)/1024)."\n";
 
	?>

Dans l'exemple du dessus, ça semble marcher, mes résultats sont cohérents lorsque je limite ma bande passante sur le port 80.

Maintenant, supposons que j'ai besoin de limiter l'envoi de ces chunks ( car le client à assez de data à traiter avec un shunts sur une seconde ).

J'utilise usleep(1000000), ainsi, après l'envoit d'un chunk puis l'estimation du temps que cela à pris, je fait une petite pause.


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
33
34
35
36
37
38
39
40
 
	<?php
 
	// build my binary chunk
	$var= '';
	$o=9000;
	while($o--)
	{
		$var.= "testtest";
	}
 
	// get the size, prepare the memory.
	$size = strlen($var);
	$tt_sent = 0;
	$tt_time = 0;
 
	// I send my chunk 30 times
	for ($i = 0; $i < 30; $i++)
	{
		// start time
		$t = microtime(true);
		echo $var."\n";
		ob_flush();
		flush();
		$e = microtime(true);
		// end time
		// the difference should reprenent what it takes to the server to 
		// transmit chunk to client right ?
 
		// add this chuck bench to the total
		$tt_time += round($e-$t,4);
		$tt_sent += $size;
 
		usleep(1000000); // the usleep
	}
 
	// total result
	echo "\n total: ".(($tt_sent*8)/($tt_time)/1024)."\n";
 
	?>
Dans l'exemple ci-dessus, mon calcul final est tout bonnement incohérent, j'ai des saut de 70000Kbit/s, à + d'un millions, car l'estimation du temps d'output est complètement falsifiée : (le temps calculé (microtime(true)) d'envoi de chaque chunk devient ridiculement court, même avec des données binaires plus importantes).

J'ai besoin d'aide pour comprendre ce qu'il va pas dans cet exemple, ou si c'est un comportement normal (ob_flush();/flush(); asynchrones …)

Config: LAMP php 5.3


Merci !
nunja est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/04/2011, 20h00   #2
Modérateur
 
Avatar de sabotage
 
Homme Vincent
Inscription : juillet 2005
Messages : 14 929
Détails du profil
Informations personnelles :
Nom : Homme Vincent

Informations forums :
Inscription : juillet 2005
Messages : 14 929
Points : 16 381
Points : 16 381
Tes microtime() correspondent a des temps de traitement PHP, tu ne mesures pas le temps jusqu'au client.
sabotage est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/04/2011, 00h01   #3
Invité de passage
 
Inscription : avril 2011
Messages : 3
Détails du profil
Informations forums :
Inscription : avril 2011
Messages : 3
Points : 1
Points : 1
J'avais la meme interogation.
Cependant, lorsque la bandpassante est bridee (volontairement, NetLimiter) cote client, les valeurs sans usleep correspondent pile avec ma valeure de limite. D'autres scripts prouvent que c'est un bon moyen de mesurer une bande passante disponible. C'est l'introduction des usleep qui change la donne.

Il y a surement quelque chose que j'ai pas compris (de fondamental).

Merci !

Nunja
nunja est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h28.


 
 
 
 
Partenaires

Hébergement Web