Tout est parti d'un projet sur lequel je travaille, et qui utilise la librairie AS3XLS, qui permet de charger des documents Excel. Mais, avec de gros fichiers Excel, le traitement peut prendre pas mal de temps. Avec à la clé, un joli "TimeOut". Il fallait donc rendre le tout pseudo-asynchrone. Je ne vais pas montrer ici AS3XLS, aussi, appuyons-nous sur un exemple simpliste, qui montrera bien le "problème".

Prenons le code suivant :

private function testSynchronous():void
{
	while(compteur<max)
	{
		compteur++;				
	}				
}

Cette simple boucle prend chez moi 4.5s pour un max à 1000000. Pendant ces 4.5 secondes, l'application est bloquée : si je mets dans ma boucle un truc du genre infos.text = 'itération : '+compteur; je ne vois que le 1000000 à la fin des 4.5 secondes.

Si maintenant j'utilise du pseudo asynchrone, comme montré ici, voici notre code pour la même chose :

private function testAsynchronous():void
{
	infos.text = 'itération : '+iteration;
				
	while(compteur<=npI*iteration)
	{
		compteur++;
	}
				
	if(compteur >= max)
	{
		clearTimeout(t);
		return;
	}
	iteration++;
	t = setTimeout(testAsynchronous, 10);
}

On le voit, le but est d'exécuter x fois une boucle sur npI itération, en pausant pendant 10ms à chaque fois. En gros, on fait du "morceaux par morceaux".

Logiquement, on devrait pouvoir se dire que la durée d'exécution de ce code est la même que précédemment, plus x*10ms. Avec npI à 10000 (des morceaux de 10000), on va pauser au total 100 fois, donc le temps total devrait s'allonger de 1sec.

Et bien il n'en est rien ! Au contraire, c'est 5 fois plus rapide !!!

Voici de quoi tester :

;

Avez-vous une idée sur la cause ce comportement ?