Комментарии замедляют интерпретируемый язык?

Я спрашиваю это, потому что я использую Python, но он мог относиться к другим интерпретируемым языкам также (Ruby, PHP, JavaScript).

Я замедляю интерпретатор каждый раз, когда я оставляю комментарий в своем коде? Согласно моему ограниченному пониманию интерпретатора, это читает выражения программы в как строки и затем преобразовывает те строки в код. Кажется, что каждый раз это анализирует комментарий, который напрасно тратится время.

Имеет место это? Есть ли некоторая конвенция для комментариев на интерпретируемых языках, или действительно ли эффект незначителен?

66
задан Azeezah M 19 April 2016 в 14:50
поделиться

9 ответов

В случае Python исходные файлы компилируются перед выполнением (файлы .pyc ), а комментарии удаляются в процессе. Так что комментарии могут замедлить время компиляции, если у вас их миллионы, но они не повлияют на время выполнения.

78
ответ дан 24 November 2019 в 14:58
поделиться

Я написал короткую программу на Python вроде этой:

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

Идея в том, чтобы выполнить простые вычисления много раз.

По подсчетам, для запуска потребовалось 0,35 ± 0,01 секунды.

Затем я переписал его, вставив всю Библию Короля Иакова следующим образом:

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

На этот раз для запуска потребовалось 0,4 ± 0,05 секунды.

Итак, ответ да . 4 МБ комментариев в цикле имеют ощутимое значение.

23
ответ дан 24 November 2019 в 14:58
поделиться

При повседневном использовании эффект незначительный. Это легко проверить, но если вы рассмотрите простой цикл, такой как:

For N = 1 To 100000: Next

Ваш компьютер может обработать это (считать до 100 000) быстрее, чем вы можете моргнуть. Игнорирование строки текста, начинающейся с определенного символа, будет более чем в 10 000 раз быстрее.

Не беспокойтесь об этом.

4
ответ дан 24 November 2019 в 14:58
поделиться

Комментарии обычно удаляются на этапе синтаксического анализа или до него, а анализ выполняется очень быстро, поэтому комментарии не замедляют время инициализации.

19
ответ дан 24 November 2019 в 14:58
поделиться

Сценарий, подобный сценарию Рича, с некоторыми комментариями (всего около 500 КБ текста):

# -*- 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

Отредактируйте согласно комментарию Дэвида:

 -*- 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
5
ответ дан 24 November 2019 в 14:58
поделиться

Наличие комментариев замедлит время запуска, поскольку сценарии будут преобразованы в исполняемую форму. Однако в большинстве случаев комментарии не замедляют время выполнения.

Кроме того, в python вы можете скомпилировать файлы .py в .pyc, которые не будут содержать комментариев (надеюсь) - это означает, что вы не получите попадания при запуске, если сценарий уже скомпилирован.

1
ответ дан 24 November 2019 в 14:58
поделиться

Как уже указывалось в других ответах, современный интерпретируемый язык, такой как Python, сначала анализирует и компилирует исходный код в байт-код, а синтаксический анализатор просто игнорирует комментарии. Это явно означает, что любая потеря скорости будет происходить только при запуске, когда исходный код действительно проанализирован.

Поскольку синтаксический анализатор игнорирует комментарии, на фазу компиляции никакие добавленные вами комментарии практически не влияют. Но байты в самих комментариях фактически считываются, а затем пропускаются во время синтаксического анализа. Это означает, что если у вас есть безумное количество комментариев (например, сотни мегабайт), это замедлит работу интерпретатора. Но опять же, это замедлит работу любого компилятора.

0
ответ дан 24 November 2019 в 14:58
поделиться

Это зависит от того, как реализован интерпретатор. Большинство достаточно современных интерпретаторов делают, по крайней мере, небольшую предварительную обработку исходного кода перед фактическим выполнением, и это включает удаление комментариев, чтобы они не имели никакого значения с этого момента.

В свое время, когда память была сильно ограничена (например, 64К общей адресуемой памяти и кассетные ленты для хранения данных), вы не могли принимать такие вещи как должное. Во времена Apple II, Commodore PET, TRS-80 и т.д. для программистов было вполне обычным делом явно удалять комментарии (и даже пробелы) для повышения скорости выполнения. Это был лишь один из многих хаков на уровне исходного кода, регулярно применявшихся в то время1.

Конечно, также помогло то, что те машины имели процессоры, которые могли выполнять только одну инструкцию за раз, имели тактовую частоту около 1 МГц и только 8-битные регистры процессора. Даже машина, которую сейчас можно найти только на помойке, настолько быстрее тех, что это даже не смешно...


1. Другой пример, в Applesoft вы могли получить или потерять немного скорости в зависимости от того, как вы нумеровали строки. Если мне не изменяет память, выигрыш в скорости был, когда цель оператора goto была кратна 16.

4
ответ дан 24 November 2019 в 14:58
поделиться

Мое ограниченное понимание интерпретатора заключается в том, что он считывает программные выражения в виде строк и преобразует эти строки в код.

Большинство интерпретаторов читают текст (код) и создают структуру данных Abstract Syntax Tree.
Эта структура не содержит никакого кода в текстовом виде и, конечно, никаких комментариев. Для выполнения программ достаточно только этого дерева. Но интерпретаторы, из соображений эффективности, идут на шаг дальше и производят байт-код. И Python делает именно это.

Можно сказать, что код и комментарии в том виде, в котором вы их написали, просто отсутствуют,
когда программа запущена. Так что нет, комментарии не замедляют работу программ во время выполнения.

(*) Интерпретаторы, которые не используют какую-либо другую внутреннюю структуру для представления кода, кроме текста,
т.е. синтаксическое дерево, должны делать именно то, что вы упомянули. Интерпретировать снова и снова код во время выполнения.

1
ответ дан 24 November 2019 в 14:58
поделиться
Другие вопросы по тегам:

Похожие вопросы: