Virtual OS

HTML5, CSS3, Javascript, support des mobiles... Que penser de votre site ? Vous manquez d'informations pour la construction d'un site qui puisse s'afficher correctement partout ? C'est un problème simple, un peu complexe ? Venez ici !
Mix78

Virtual OS

Message par Mix78 »

Bonjour à tous

Développant depuis plusieurs années un pseudo système d'explotation virtuel tout en javascript (30000 lignes) un souci m'enuie depuis pas mal de temps.

Le resultat est affreusement LENT! lol :$

Du coup une question me taraude, à vos avis?

Pourquoi est il lent?

J'ai deux hypotèses et souhaite des avis pour trancher.

1/ Mon script est buggé

2/ Javascript EST lent; lent sous IE et lent sous geko...


Merci merci merci

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Conrad

Message par Conrad »

Je pense que les 3 causes principales sont les suivantes :
- Les bibliothèques que tu as utilisé.
- Le code que tu as toi-même fais.
- Le Javascript en lui-même.

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Invité

lol

Message par Invité »

Bonsoir

Lol, oui il doit y avoir un peu de tout ca. au moins les deux derniers car j'ai une forte tendant a réinventer ma roue...

Merci de ta réponse

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Invité

Tjrs VOS

Message par Invité »

Si quelqu'un veut voir comment cela est fichu

http://archipel.paysrochefortais.fr/vos

je vous previens il faut que votre ordi booste bien... lol

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1[/url]
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message par Benoit »

JavaScript est lent sous IE, c'est un fait. Mais dans Gecko, Opera et Webkit (Safari) de très gros progrès ont été faits dans les performances.

Je soupçonnerais donc plus la manière de manipuler le DOM et peut-être une tendance à réinventer la roue au lieu d'utiliser les fonctions natives plus performantes (mais je n'ai pas vu ton code). Une manière d'éviter ça serait de charger des bibliothèques éprouvées comme jQuery au lieu d'écrire tes propres fonctions.

Il y a aussi un gros inconvénient de JavaScript pour l'instant, c'est l'absence de threads. Suivant ce que tu fais ça peut être un handicap, ou pas du tout :)
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
Invité

Précision

Message par Invité »

A savoir aussi:

ca bug!
Ca marche pas avec IE (en ce moment en tous cas)!

Voili

Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Mix78

Très juste

Message par Mix78 »

Je suis assez d'acc en effet.
L'absence de thread dans javascript est un frein au dev d'appli complexe.

Je crois aussi que mon problème viens peut être de ma façon de manipuler le dom... Surtout de détruire les objets graphique après leur utilisation.

Je n'a pas encore bien saisi comment Javascript déreference les objets (je pense au marshalling) c quand mème assez fin tout ca...



Message envoyé avec : Mozilla/5.0 (Windows; U; Windows NT 5.0; fr; rv:1.9.0.1) Gecko/2008070208 Firefox/3.0.1
Mix78

Ca fait cher au kilo!

Message par Mix78 »

Re Bonjour a tous,

Depuis mon dernier post g travailler sur le sujet au niveau de mon script. Il en resulte que les objets graphiques ke je crée occupent chacun dans les 250 kilo de mémoire. Ces objet sont dérivés (inheritFrom) d'objets gestionnaires d'evenements, ils comprennent un membre Dc qui reference un element html créé avec createElement. chacun d'eux contient en plus une cinquantaine de fonctions membres, et divers sous objets tel un gestionnaire de propriétés, un gestionaire de drag&drop etc...
Chacun reference son parent, ses enfants; formant ainsi une liste chainée arboréscente aisément manipulable.

Image

je suppose que tous ces inter référencement d'un objet a d'autre (i compris la possibilité de créer un membre parentcontainer de l'objet htmlnodeelement [créé par document.createElement] pour pouvoir retrouver l'objet grace a document.getElementById(htmlnodeelement).parentcontainer) doivent rendre compliquée voir impossible la destruction propre des objets graphiques.

Le souci c'est que au bout de 200 creéations d'objets; ce qui correspond a un bureau chargé avec un strict minimum d'elements on est déja à plusieurs centaines de mo!!

Comme je n'arrive pas tro a alléger mon code plus ke je ne l'ai deja fait je prie pour avoir créé un bug et ke sa résolution puisse rendre le tt BCP plus réactif.

Comme je ne trouve pas de destructeur correspondant a createElement et que j'ai l'impression que removeChild n'est pas tré efficace au niveau de la mémoire j'ai crée un cache qui permet a mes objet graphique de recycler les element dom. Je compte faire comme ca pour d'autre objets...

Mais le fait est que si je ne resoud pas ce bug de mon script ou pire si ce n'en est pas un...Si c'est mon modéle qui est trop lourd pr javascript; ben je sui cuit! lol

donc je m'interroge et si quelqu'un a des conseils...


Message envoyé avec : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Mix78

suite des tests

Message par Mix78 »

J'ai remarque des choses.
prenons un objet:

Code : Tout sélectionner

function Funny()
{
	var PT=this;
	this.funnystring="";
	var ss;
	var rr;
	
	for(ss=0;ss<1000;ss++)
	{
		for(rr=0;rr<1000;rr++)
		{
		       PT.funnystring+=String.fromCharCode(Math.floor(Math.random() * 255));
		}
		
	}
}
puis une fonction:

Code : Tout sélectionner

function testmem4()
{
	var te;
	var sr=new Array()
	for(te=0;te<10;te++)
	{
		sr[te]=new Funny();
	}
	clearTimeout(tmo);
	delete tmo;
}
si on appelle:

Code : Tout sélectionner

var tmo=setTimeout(testmem4,60000);
la fonction crée 10 objets Funny de environ 5mo chaque
cette mémoire (50mo) restera occupée jusqu'au rechargement de la page.

si on appelle directement la fonction:

Code : Tout sélectionner

testmem4();
La la mémoire est liberée apres appel.

si on appelle la fonction avec eval:

Code : Tout sélectionner

eval("testmem4();");
La aussi la mémoire est liberée apres appel.

meme en fesant un clearTimeout la mémoire n'est pas liberée...
Peut être en fesant un delete du de l'objet timeout créé...


Message envoyé avec : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Mix78

precisions

Message par Mix78 »

je précise que:

Code : Tout sélectionner

setTimeout(...)
au lieu de:

Code : Tout sélectionner

var tmo = setTimeout(...)
ne change pas la donne...

Message envoyé avec : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message par Benoit »

Là c'est normal, ta fonction reste référencée par le timeout que tu es censé pouvoir relancer à tout instant tant qu'il n'est pas détruit. Et tu ne supprimes jamais ta variable sr !

Le clearTimeout remet juste le compteur à zéro mais la fonction existe toujours (d'autant que tu l'appelles dans la fonction elle-même).

Au fait, tu peux très bien supprimer des éléments individuels de ton tableau dès que tu n'en as plus besoin.
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
Mix78

Oki

Message par Mix78 »

Bonjour,
merci de votre reponse,

Je crois avoir saisi...

Aprés je crois que j'ai omis de parler d'un truc que j'ai pris l'habitude de faire et qui va en faire rire plus d'un je crois.

Chaque fois que je crée une fonction d'objet je fais commencer mon code par:

Code : Tout sélectionner

var PT=this;
lol!

en plus quand je crée un objet qui herite d'un autre, la aussi, je recrée une variable PT égale à this...

Est ce que le fait de deleter un objet qui contient un membre referencent this est tré eficace et sain???

C'est possible que non, j'immagine! lol!


Message envoyé avec : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Benoit
Administrateur
Messages : 4894
Inscription : 19 juil. 2003, 10:59

Message par Benoit »

Je crois que ça n'a pas d'incidence dans Mozilla, par contre il me semble qu'IE6 avait de gros problèmes avec le nettoyage d'objets se référençant eux-mêmes.

Mais je crois que c'est surtout inutile si tu peux utiliser this à chaque fois :)
♫ Li tens s'en veit, je n'ai riens fais ;
Li tens revient, je ne fais riens. ♪
Avatar de l’utilisateur
ra-mon
Varan
Messages : 1540
Inscription : 16 janv. 2004, 09:51

Message par ra-mon »

Salut,
Pour info, le "système d'exploitation virtuel en javascript" ne fonctionne pas du tout sur IE8, Opera 9.5 et Safari 3 et probablement pas non plus dans Amaya, Swift, Arora, HV3...
Par contre la page blanche s'y affiche très rapidement, ce qui résoud/masque, au moins sur ces navigateurs, le problème initial de lenteur :lol:

@+
--
Pierre

Message envoyé avec : Opera/9.52 (Windows NT 5.1; U; fr)
Mix78

Inutile?

Message par Mix78 »

Bonsoir Benoit,
Un ti lol pour Conrad :)

Hihi, moi j'arrive pas a faire sans cette petite variable!

En fait j'ai éssayé d'enlever tout ca mais il y a des endroit ou je sèche...

Quand un objet appelle une fonction a laquelle il doit fournir une fonction de rappel (callback) et qu'il fournit 'this.nomDeFonction', au moment ou est rappelé le callback 'this' n'existe plus ou reference autre chose et l'appel échoue...

Si l'objet fournit plutot la fonction interne 'nomDeFonction', l'appel fonctionnera mais dans la fonction rapellée (interne a l'objet) le mot clé 'this' ne reference plus l'objet!!

Tout ceci est dit sous reserve de tt ce qui m'echappe...

J'immagine que ce fonctionnement est normal mais moi ca me bloque! lol!

Aprés, il est surement possible de programmer en JS sans avoir recour a tt plein de callback :$

Ce que j'ai donc fait (patiement...) c'est de demander (gentiment) à tous les objets qui utilisent cette variable PT de la supprimer avant de 'mourrir'. Enfin de la rendre egale a 'null' a defaut de pouvoir faire un 'delete'. Car mon objet de base gere lui meme sa suppression (!) et ceux qui heritent de lui (et utilisent aussi 'var PT=this;') sont 'avvertis' par un système d'évènements de leur 'mort' prochaine....

C'est efficace, mon objet graphique de base (Container ) ne fuit plus, quant je crée et detruit 1000 Container je retombe sur la quantité de mémoir initiale...

Je fonctionne sous firefox 3 pourtant....

Pour Conrad: J'ai un petit etonnement pour ie8 et opera... pas que mon machin soit deja au stade exploitable mais bon moi ca se lance... notement j'ai des pistes qui me font penser que ie8 est un firefox remaquillé et soit basé geko

Cordialement,

Marco

Message envoyé avec : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Répondre

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 3 invités