7
votes

Opérations de base CPU Time Coût

Je me demandais comment optimiser les boucles pour les systèmes avec des ressources très limitées. Disons-nous, si nous avons un de base pour boucle, comme (écrit dans JavaScript ):


pour (var i = somerr.length - 1; i> -1; i--) { SOMARR [I] }


Je ne sais honnêtement pas, n'est pas ! = moins cher que > ?

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 >> , ~ , ! ! , et ainsi de suite.


4 commentaires

Attendez, vous essayez de micro-optimiser javascript ??


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


6 Réponses :


1
votes

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.

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.


0 commentaires

10
votes

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.

En cas de doute, commencez toujours à demander à Donald Knuth:

http: / /Shreevatsa.wordpress.com/2008/05/16/Premature-Optimization-is-throot-of-all-evil/

ou, pour un front de moins élevé, prenez la micro-optimisation:

http://www.codinghorror.com/blog/archives/000185.html < / a>



0
votes

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.


0 commentaires

16
votes

performance sur un processeur moderne est loin d'être trivial. Voici quelques choses qui le compliquent:

  • Les ordinateurs sont rapides. Votre CPU peut exécuter plus de 6 milliards d'instructions par seconde. Donc, même l'instruction la plus lente peut être exécutée des millions de fois par seconde, ce qui signifie que ce n'est que vraiment matière si vous utilisez très souvent
  • Les CPU modernes ont des centaines d'instructions en vol simultanément. Ils sont pipelinés, ce qui signifie que si une instruction est en cours de lecture, une autre lecture des registres, un troisième est en cours d'exécution et une quatrième écrit à un registre. Les CPU modernes ont 15 à 20 étapes de ce type. En plus de cela, ils peuvent exécuter 3-4 instructions en même temps sur chacune de ces étapes. Et ils peuvent réorganiser ces instructions. Si l'unité de multiplication est utilisée par une autre instruction, nous pouvons peut-être trouver une instruction d'addition à exécuter à la place, par exemple. Donc, même si vous avez des instructions lentes mélangées, leurs coûts peuvent être cachés très bien la plupart du temps, en exécutant d'autres instructions en attendant que le lent ait fini.
  • la mémoire est des centaines de fois plus lents que la CPU. Les instructions étant exécutées ne comptent pas vraiment si leur coût est nain par récupération des données de la mémoire. Et même ce n'est pas fiable, car la CPU a ses propres caches à bord pour tenter de cacher ce coût.

    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.

    N'essayez pas de telles microoptimations à moins que vous vraiment 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 . Ou qui juste sacrifier la lisibilité sur quelque chose qui ne fait aucune différence du tout.

    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:

    Nous devrions oublier de petites gains d'efficacité, disons environ 97% du temps: l'optimisation prématurée est la racine de tout mal

    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:

    la plupart du temps , 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 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 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.


4 commentaires

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.



0
votes

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.


0 commentaires

1
votes

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.

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 .

BTW ma manière préférée de codage de votre boucle est la suivante: xxx


0 commentaires