77 votes

Les commentaires ralentissent-ils un langage interprété?

Je demande cela parce que j'utilise Python, mais il pourrait s'appliquer à d'autres langages (Ruby, PHP, JavaScript).

Chaque fois que je laisse un commentaire dans mon code, est-il ralentir l'interprète? Ma compréhension limitée d'un interprète, c'est qu'il lit le programme des expressions en tant que chaînes et convertit ces chaînes de caractères dans le code. Il semble que chaque fois qu'il traite un commentaire, c'est du temps perdu.

Est-ce le cas? Est-il une convention pour des observations dans des langages interprétés, ou l'effet est négligeable?

109voto

Luper Rouch Points 5033

Dans le cas de Python, les fichiers source sont compilés avant d'être exécutés (les fichiers .pyc ) et les commentaires sont supprimés au cours du processus. Les commentaires pourraient donc ralentir le temps de compilation si vous en avez des milliards, mais ils n’auront pas d’impact sur le temps d’exécution.

37voto

Rich Bradshaw Points 33598

Eh bien, j'ai écrit un court programme en python comme ceci:

for i in range (1,1000000):
    a = i*10

L'idée est de faire un simple calcul des charges de temps.

Par la synchronisation, il a fallu 0.35±0.01 secondes pour s'exécuter.

J'ai ensuite réécrit avec l'ensemble de la Bible King James inséré comme ceci:

for i in range (1,1000000):
    """
The Old Testament of the King James Version of the Bible

The First Book of Moses:  Called Genesis


1:1 In the beginning God created the heaven and the earth.

1:2 And the earth was without form, and void; and darkness was upon
the face of the deep. And the Spirit of God moved upon the face of the
waters.

1:3 And God said, Let there be light: and there was light.

...
...
...
...

Even so, come, Lord Jesus.

22:21 The grace of our Lord Jesus Christ be with you all. Amen.
    """
    a = i*10

Cette fois, il a pris de 0,4±0,05 secondes à s'exécuter.

Donc la réponse est oui. 4 mo de commentaires dans une boucle, faire une différence mesurable.

24voto

KennyTM Points 232647

Les commentaires sont généralement supprimés à l'étape d'analyse ou avant, et l'analyse est très rapide. Par conséquent, les commentaires ne ralentiront pas le temps d'initialisation.

6voto

SLC Points 13490

L'effet est négligeable pour une utilisation quotidienne. Il est facile de tester, mais si vous considérez une simple boucle, tels que:

For N = 1 To 100000: Next

Votre ordinateur peut traiter que (nombre pour 100 000 habitants), plus rapide que vous pouvez cligner des yeux. Le fait d'ignorer une ligne de texte qui commence avec un certain personnage sera plus de 10 000 fois plus rapide.

Ne vous inquiétez pas à ce sujet.

5voto

Nick T Points 5466

Fait un script comme Riche avec quelques commentaires (seulement environ 500 ko, texte):

# -*- coding: iso-8859-15 -*-
import timeit

no_comments = """
a = 30
b = 40
for i in range(10):
    c = a**i * b**i
"""
yes_comment = """
a = 30
b = 40

# full HTML from http://en.wikipedia.org/
# wiki/Line_of_succession_to_the_British_throne

for i in range(10):
    c = a**i * b**i
"""
loopcomment = """
a = 30
b = 40

for i in range(10):
    # full HTML from http://en.wikipedia.org/
    # wiki/Line_of_succession_to_the_British_throne

    c = a**i * b**i
"""

t_n = timeit.Timer(stmt=no_comments)
t_y = timeit.Timer(stmt=yes_comment)
t_l = timeit.Timer(stmt=loopcomment)

print "Uncommented block takes %.2f usec/pass" % (
    1e6 * t_n.timeit(number=100000)/1e5)
print "Commented block takes %.2f usec/pass" % (
    1e6 * t_y.timeit(number=100000)/1e5)
print "Commented block (in loop) takes %.2f usec/pass" % (
    1e6 * t_l.timeit(number=100000)/1e5)


C:\Scripts>timecomment.py
Uncommented block takes 15.44 usec/pass
Commented block takes 15.38 usec/pass
Commented block (in loop) takes 15.57 usec/pass

C:\Scripts>timecomment.py
Uncommented block takes 15.10 usec/pass
Commented block takes 14.99 usec/pass
Commented block (in loop) takes 14.95 usec/pass

C:\Scripts>timecomment.py
Uncommented block takes 15.52 usec/pass
Commented block takes 15.42 usec/pass
Commented block (in loop) takes 15.45 usec/pass

Modifier comme par David commentaire:

 -*- coding: iso-8859-15 -*-
import timeit

init = "a = 30\nb = 40\n"
for_ = "for i in range(10):"
loop = "%sc = a**%s * b**%s"
historylesson = """
# <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
# blah blah...
# --></body></html> 
"""
tabhistorylesson = """
    # <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" 
    # blah blah...
    # --></body></html> 
"""

s_looped = init + "\n" + for_ + "\n" + tabhistorylesson + loop % ('   ','i','i')
s_unroll = init + "\n"
for i in range(10):
    s_unroll += historylesson + "\n" + loop % ('',i,i) + "\n"
t_looped = timeit.Timer(stmt=s_looped)
t_unroll = timeit.Timer(stmt=s_unroll)

print "Looped length: %i, unrolled: %i." % (len(s_looped), len(s_unroll))

print "For block takes %.2f usec/pass" % (
    1e6 * t_looped.timeit(number=100000)/1e5)
print "Unrolled it takes %.2f usec/pass" % (
    1e6 * t_unroll.timeit(number=100000)/1e5)


C:\Scripts>timecomment_unroll.py
Looped length: 623604, unrolled: 5881926.
For block takes 15.12 usec/pass
Unrolled it takes 14.21 usec/pass

C:\Scripts>timecomment_unroll.py
Looped length: 623604, unrolled: 5881926.
For block takes 15.43 usec/pass
Unrolled it takes 14.63 usec/pass

C:\Scripts>timecomment_unroll.py
Looped length: 623604, unrolled: 5881926.
For block takes 15.10 usec/pass
Unrolled it takes 14.22 usec/pass

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X