Virtual OS
Virtual OS
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
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
Tjrs VOS
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]
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]
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
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. ♪
Li tens revient, je ne fais riens. ♪
Très juste
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
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
Ca fait cher au kilo!
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.

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)
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.

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)
suite des tests
J'ai remarque des choses.
prenons un objet:
puis une fonction:
si on appelle:
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:
La la mémoire est liberée apres appel.
si on appelle la fonction avec eval:
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)
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));
}
}
}
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;
}
Code : Tout sélectionner
var tmo=setTimeout(testmem4,60000);
cette mémoire (50mo) restera occupée jusqu'au rechargement de la page.
si on appelle directement la fonction:
Code : Tout sélectionner
testmem4();
si on appelle la fonction avec eval:
Code : Tout sélectionner
eval("testmem4();");
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)
precisions
je précise que:
au lieu de:
ne change pas la donne...
Message envoyé avec : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
Code : Tout sélectionner
setTimeout(...)
Code : Tout sélectionner
var tmo = setTimeout(...)
Message envoyé avec : Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)
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.
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. ♪
Li tens revient, je ne fais riens. ♪
Oki
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:
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)
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;
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)
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
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. ♪
Li tens revient, je ne fais riens. ♪
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
@+
--
Pierre
Message envoyé avec : Opera/9.52 (Windows NT 5.1; U; fr)
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

@+
--
Pierre
Message envoyé avec : Opera/9.52 (Windows NT 5.1; U; fr)
Inutile?
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)
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)
Qui est en ligne ?
Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 4 invités