Je me demandais comment optimiser les boucles pour les systèmes avec des ressources très limitées. Disons-nous, si nous avons un Je ne sais honnêtement pas, n'est pas Je vous serais reconnaissant de toute ressource couvrant le coût de l'informatique dans le contexte des opérateurs de base, tels que les de base pour code> boucle, comme (écrit dans
JavaScript code>): p>
pour (var i = somerr.length - 1; i> -1; i--)
{
SOMARR [I]
} code> p>
! = code> moins cher que
> code>? p>
>> code>,
~ code>,
! code>! code> , et ainsi de suite. p>
6 Réponses :
La plupart des comparaisons ont la même côte, car le processeur le compare tout simplement dans tous les aspects, puis après cela, il prend une décision basée sur des drapeaux générés par cette comparaison antérieure afin que le signal de comparaison ne comporte pas du tout. Mais certaines architectures tentent d'accélérer ce processus en fonction de la valeur que vous comparez avec, comme des comparaisons à 0. P>
Autant que je sache, les opérations bitwises sont les opérations les moins chères, légèrement plus rapides que l'ajout et la soustraction. Les opérations de multiplication et de division sont un peu plus chères et la comparaison est la plus haute opération de la côte. P>
Il est extraordinairement improbable que de telles micro-optimisations produisent une différence notable à votre code, mais les systèmes les plus extrêmes (systèmes intégrés en temps réel?). Votre temps serait probablement mieux servi à se soucier de rendre votre code lisible et de maintenir. p>
En cas de doute, commencez toujours à demander à Donald Knuth: P>
http: / /Shreevatsa.wordpress.com/2008/05/16/Premature-Optimization-is-throot-of-all-evil/ p>
ou, pour un front de moins élevé, prenez la micro-optimisation: p>
http://www.codinghorror.com/blog/archives/000185.html < / a> p>
Manque le point de la citation du Knuth. Knuth a seulement dit que c'était une mauvaise idée d'environ 97% du temps, impliquant qu'il est significatif et utile 3% du temps. Ce n'est pas "extraordinairement improbable" que la microoptimisation fera une différence notable. Cela arrive tout le temps. Cela signifie simplement que, sauf si vous savez ce que i> optimiser, vous êtes susceptible de frapper les 97% où il n'atteint pas une différence notable.
Excellent point. Dans ma défense, j'ai dit "de telles micro-optimisations" plutôt que "toutes les micro-optimisations", car l'affiche originale était préoccupée par la différence entre! = Et> dans un JavaScript pour la boucle.
Pourquoi optimiser JavaScript? 6502asm.com <= Il s'agit d'un émulateur 6502 et d'assembleur dans l'application JavaScript! Vraiment cool et évidemment le résultat d'un esprit malade avec beaucoup trop de temps sur ses mains, mais toujours vraiment cool. (Beaucoup de choses amusantes sont le résultat d'un malade, alors s'il vous plaît ne prenez aucune infraction.)
L'optimisation prématurée peut être dangereuse la meilleure approche consisterait à écrire votre demande sans vous soucier de cela, puis à trouver les points lents et à optimiser ceux-ci. Si vous êtes vraiment inquiet pour cela, utilisez une langue de niveau inférieure. Une langue interprétée comme JavaScript vous coûtera une certaine puissance de traitement par rapport à un langage de niveau inférieur tel que c. P>
performance sur un processeur moderne est loin d'être trivial. Voici quelques choses qui le compliquent: P>
La réponse courte est donc "N'essayez pas de déjouer le compilateur". Si vous êtes capable de choisir entre deux expressions équivalentes, le compilateur est probablement capable de faire la même chose et de choisir le plus efficace. Le coût d'une instruction varie en fonction de tous les facteurs ci-dessus. Quelles autres instructions sont exécutées, quelles données sont dans le cache du processeur, quel modèle de processeur précis est le code exécuté sur, etc. Le code qui est super efficace en un cas peut être très inefficace dans d'autres cas. Le compilateur essaiera de choisir les instructions les plus efficaces et de les planifier ainsi que possible. À moins que vous sachiez plus que le compilateur à ce sujet, vous êtes peu probable de pouvoir faire un meilleur travail. P>
N'essayez pas de telles microoptimations à moins que vous vraiment em> savez ce que vous faites. Comme le montre ce qui précède, les performances de bas niveau sont un sujet ridiculement complexe et il est très facile d'écrire des "optimisations" qui aboutissent à un code de plus lent em>. Ou qui juste sacrifier la lisibilité sur quelque chose qui ne fait aucune différence du tout. P>
En outre, la plupart de votre code n'a tout simplement pas d'impact mesurable sur la performance.
Les gens aiment généralement citer (ou mal citer) Knuth sur ce sujet: P>
Nous devrions oublier de petites gains d'efficacité, disons environ 97% du temps: l'optimisation prématurée est la racine de tout mal p>
blockQuote>
Les gens interprètent souvent cela comme "ne tentent pas d'essayer d'optimiser votre code". Si vous lisez réellement la citation complète, certaines conséquences beaucoup plus intéressantes devraient devenir claires: p>
la plupart du temps em>, nous devrions oublier les microoptimizations. La plupart du code est exécuté si rarement que les optimisations ne sera pas question. En gardant à l'esprit le nombre d'instructions d'un processeur peut exécuter par seconde, il est évident qu'un bloc de code doit être exécuté très em> souvent des optimisations en elle pour avoir un effet. Ainsi, environ 97% du temps, vos optimisations seront une perte de temps. Mais il dit aussi que, parfois, (3% du temps), vos optimisations em> question. Et évidemment, la recherche de ces 3% est un peu comme chercher une aiguille dans une botte de foin. Si vous venez de décider de « optimiser votre code » en général, vous allez perdre votre temps sur le premier 97%. , Vous avez besoin au lieu d'abord de localiser les 3% qui en fait besoin d'optimisation. En d'autres termes, exécutez votre code par un profileur, et laissez-vous dire quel code prend le plus de temps CPU. Ensuite, vous savez où optimiser. Et puis vos optimisations ne sont plus prématurée. P>
Réponse superlative. Étiez-vous l'OP, j'accepterais cette réponse.
Merci, cela résume à peu près l'approche. Je vais devoir profiler mon code contre un tableau de cas de réel et voir juste. Les CPU modernes sont rapides, mais les systèmes embarqués sont loin de ceux-ci. D'où ma question. Acclamations!
Attends une seconde. Vous exécutez JavaScript sur un système intégré et vous êtes inquiet pour la performance?
Widgets pour téléphones portables écrits en JavaScript.
Dans ce cas particulier,> VS = n'est probablement pas un problème de performance. Toutefois> est généralement un choix plus sûr car cela empêche les cas où vous avez modifié le code de la mise en marche dans les mauvaises herbes et bloqués dans une boucle infinie. P>
C'est comme demander un poisson, quand je préférerais vous apprendre à pêcher.
Il y a des moyens simples de voir par vous-même combien de temps les choses prennent. Mon favori est de simplement copier le code 10 fois, puis enveloppez-le dans une boucle de 10 ^ 8 fois. Si je l'exécute et que je regarde ma montre, le nombre de secondes qu'il faut se traduit par des nanosecondes. P>
Dire ne pas faire d'optimisation prématurée est une "ne pas" ". Si vous voulez un "faire", vous pouvez essayer une technique de réglage de la performance proactive comme Ceci . P>
BTW ma manière préférée de codage de votre boucle est la suivante: p>
Attendez, vous essayez de micro-optimiser javascript i> ??
Connu colloquiciellement dans le commerce comme "Téléchargement de Chrome"
Réponse courte: Supposons que chaque opération prend le même temps. Ce n'est pas toujours i> vrai, mais c'est une approximation décente.
@myers Oui, j'essaie de micro-optimiser JavaScript. Comme je l'ai mentionné, j'ai des systèmes avec très i> des ressources limitées à l'esprit. @skaffman chrome n'est qu'un navigateur, et ce n'est pas ce dont j'ai besoin. @jalf merci: c'est ce que je suis à la hauteur.