سؤال

أنا أسأل هذا لأنني استخدام بيثون ، ولكن يمكن أن تنطبق على البعض تفسيرها اللغات وكذلك (روبي, PHP, JavaScript).

أنا تباطؤ مترجم كلما ترك تعليق في مدونة ؟ حسب فهمي المحدود مترجم يقرأ البرنامج التعبيرات في سلاسل ثم تحويل تلك السلاسل إلى رمز.يبدو أن في كل مرة يوزع تعليق ، أن يضيع الوقت.

هو هذا الحال ؟ هل هناك اتفاقية التعليقات في تفسير اللغات ، أو هو تأثير يذكر?

هل كانت مفيدة؟

المحلول

حالة من بيثون ، المصدر يتم تجميع الملفات قبل إعدامه (إن .pyc الملفات) التعليقات جردت في هذه العملية.حتى تعليقات يمكن أن تبطئ تجميع وقت إذا كان لديك الكثير منهم لكنهم لن تؤثر على وقت التنفيذ.

نصائح أخرى

لقد كتبت قصيرة الثعبان برنامج مثل هذا:

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 ثانية لتشغيل.

وبالتالي فإن الجواب هو نعم.4MB من التعليقات في حلقة كفيلة بإحداث تغيير ملموس.

التعليقات هي عادة جردت في أو قبل تحليل مرحلة تحليل سريع جدا ، لذلك بفعالية التعليقات لن تبطئ الوقت التهيئة.

لم يصل السيناريو الغنية مع بعض التعليقات (فقط حوالي 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

تأثير negligable للاستخدام اليومي.فإنه من السهل أن الاختبار, ولكن إذا كنت تنظر في حلقة بسيطة مثل:

For N = 1 To 100000: Next

جهاز الكمبيوتر الخاص بك يمكن أن عملية (العد إلى 100 ، 000) أسرع من طرفة العين..تجاهل سطر من النص الذي يبدأ مع شخصية معينة سوف تكون أكثر من 10 ، 000 مرات أسرع.

لا تقلق بشأن ذلك.

ذلك يعتمد على كيفية مترجم تنفيذها.معظم معقول الحديثة المترجمين تفعل على الأقل قليلا من ما قبل المعالجة على شفرة المصدر من قبل أي التنفيذ الفعلي ، والتي من شأنها أن تشمل تجريد من التعليقات لذا لا فرق من هذه النقطة فصاعدا.

في وقت واحد عندما كان الذاكرة مقيدة بشدة (على سبيل المثال ، 64 كيلو بايت إجمالي الذاكرة عنونة و أشرطة كاسيت التخزين) أنت لا يمكن أن تأخذ مثل هذه الأشياء أمرا مفروغا منه.مرة أخرى في اليوم الثاني أبل ، العميد الحيوانات الأليفة, TRS-80 ، وما إلى ذلك ، كان إلى حد ما روتين للمبرمجين صراحة إزالة التعليقات (وحتى white-space) لتحسين سرعة التنفيذ.هذا هو أيضا واحد فقط من العديد من التعليمات البرمجية المصدر على مستوى الخارقة بشكل روتيني المستخدمة في ذلك الوقت1.

بالطبع, وساعد في ذلك أيضا تلك الآلات قد وحدات المعالجة المركزية التي يمكن فقط تنفيذ تعليمة واحدة في كل مرة ، كان على مدار الساعة من سرعة 1 ميجا هرتز, و كان فقط 8-بت المعالج السجلات.حتى آلة أنك تجد الآن فقط في القمامة هي أسرع بكثير من تلك التي ليس مضحكا...


1.على سبيل المثال آخر في Applesoft يمكن أن تكسب أو تخسر القليل من السرعة اعتمادا على كيفية ترقيم خطوط.إذا أسعفتني الذاكرة, سرعة اكتساب عندما هدفا غوتو البيان متعددة من 16.

وجود تعليقات سوف تبطئ وقت بدء التشغيل ، مثل البرامج النصية سوف تحصل على تحليل قابل للتنفيذ شكل.ومع ذلك, في معظم الحالات التعليقات لا تبطئ وقت التشغيل.

بالإضافة إلى ذلك في بيثون ، يمكنك تجميع .py الملفات في .بيك ، والتي لن تحتوي على تعليقات (آمل) - وهذا يعني أنك لن تحصل على بدء ضرب إما إذا كان البرنامج النصي جمعت بالفعل.

فهمي المحدود وهو المترجم أن يقرأ البرنامج التعبيرات في سلاسل يحول تلك السلاسل إلى رمز.

معظم المترجمين قراءة النص (رمز) تنتج جملة مجردة شجرة بنية البيانات.
أن هيكل لا يحتوي على التعليمات البرمجية في شكل نص, و بالطبع لا يوجد تعليقات سواء.فقط تلك الشجرة كافية لتنفيذ البرامج.ولكن والمترجمين الفوريين كفاءة الأسباب ، يذهب خطوة أبعد وإنتاج رمز بايت.و الثعبان يفعل ذلك بالضبط.

يمكننا القول أن رمز التعليقات في شكل كتب لهم ، هي ببساطة غير موجودة,
عند تشغيل البرنامج.حتى لا تعليقات لا تبطئ البرامج في وقت التشغيل.

(*) مترجمين التي لا تستخدم بعض الهيكل الداخلي تمثل رمز آخر من النص ،
أي شجرة جملة ، يجب أن تفعل بالضبط ما ذكرت.تفسير وتكرارا رمز في وقت التشغيل.

كما إجابات أخرى ذكرت حديث تفسير اللغة مثل الثعبان الأول يوزع ويجمع المصدر إلى بايت كود و محلل ببساطة يتجاهل التعليقات.وهذا يعني بوضوح أن أي خسارة في السرعة يمكن أن تحدث فقط عند بدء التشغيل عندما يكون المصدر هو في الحقيقة تحليل.

لأن محلل يتجاهل التعليقات تجميع المرحلة هو الأساس تتأثر بأي تعليقات كنت وضعت في.ولكن بايت في التعليقات أنفسهم يجري في الواقع قراءة ثم تخطي أكثر من خلال تحليل.وهذا يعني إذا كان لديك كمية كبيرة من التعليقات (مثلا ، العديد من مئات ميغابايت) ، وهذا من شأنه أن يبطئ مترجم.ولكن بعد ذلك مرة أخرى هذا من شأنه أن بطء أي مترجم أيضا.

أنا أتساءل عما إذا كان من المسائل على كيفية استخدام الملاحظات الختامية.على سبيل المثال, الثلاثي الأقوال هو docstring.إذا كنت تستخدم لهم ، والمحتوى هو التحقق من صحتها.أنا واجهت مشكلة منذ فترة حيث تم استيراد مكتبة في بيثون 3 رمز...حصلت على هذا الخطأ فيما يتعلق الجملة على .نظرت إلى رقم السطر و كان محتوى ضمن الثلاثي اقتبس التعليق.فوجئت بعض الشيء.جديد الثعبان, لم اعتقد ابدا كتلة التعليق تفسر على أخطاء في بناء الجملة.

ببساطة إذا كنت نوع:

'''
(i.e. \Device\NPF_..)
'''

بيثون 2 لا رمي خطأ ، ولكن بيثون 3 تقارير:SyntaxError:(unicode خطأ) 'unicodeescape' لا يمكن فك ترميز بايت في موقف 14-15:تالف حرف الهروب

حتى بيثون 3 من الواضح تفسير الثلاثي اقتباس التأكد من انها صالحة في بناء الجملة.

ومع ذلك ، إذا تحولت إلى خط واحد التعليق:# (أي\Device PF_..)
لا خطأ في النتائج.

أنا أتساءل عما إذا كان الثلاثي اقتباس تعليقات ور استبدال خطوط واحدة ، إذا كان الأداء التغير.

هذا السؤال قديم جدا ، ولكن بعد قراءة الإجابة المقبولة التي تدعي أنها لن تؤثر على وقت التنفيذ, وهذا خطأ, أنا أعطيك مثال بسيط حيث يمكنك أن ترى والتحقق من المبلغ الذي يؤثر على وقت التنفيذ بالفعل.
لدي ملف يسمى constants.py.أنه يحتوي على جميع إجراءات مختلفة من الشطرنج في قائمة:

LABELS = [ "a1b1"
    "a1c1", 
    "a1d1", 
    "a1e1", 
    "a1f1",....]

قائمة LABELS يحتوي على 2272 العناصر.في ملف آخر أسميه:

import constants
np.array(constants.LABELS)

لا تقاس عشر مرات و تنفيذ التعليمات البرمجية يستغرق حوالي 0.597 ms.الآن لقد غيرت الملف المدرج بجانب كل عنصر (2272 مرات) تعليق:

LABELS = [ "a1b1",  # 0 
            "a1c1", # 1
            "a1d1", # 2
            "a1e1", # 3
            "a1f1", # 4
             ...,
            "Q@h8", # 2271]

الآن بعد قياس وقت تنفيذ np.array(constants.LABELS) عشر مرات ، لدي متوسط وقت تنفيذ 4.28 ms, وهكذا, حول 7 مرات أبطأ.
لذا, نعم, آثار ذلك وقت التنفيذ إذا كان لديك الكثير من التعليقات.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top