注釋會影響解釋型語言的效率嗎?

編譯型語言編譯後就沒有注釋了,所以完全不影響執行效率,這個很好理解。那解釋型語言呢?理論上解釋器必須要一步一步查看代碼並解釋,這樣就算是注釋,也需要讀取以後才知道這是沒用的,這豈不是說,假如我在10w行注釋後面寫一行print,這print會隔很久才被讀取並執行到?

我補充一下,我這裡不是討論優化,也就是不是想知道說該不該寫注釋,或者影響大不大,只是想知道理論上是不是這樣,編譯成位元組碼這個我知道,那像js這種語言呢?


至少開發時好好寫注釋節約的讀代碼時間遠比編譯器省下的多得多。

你就算把全套哈利波特當注釋扔進去最多就幾秒鐘而已嘛。

***

測試結果如下。woc.py 沒有額外注釋,wc1.py 加了 1e6 行,wc2.py 加了 1e7 行,wc3.py 加了 1e8 行。

% cat woc.py
#!/bin/python

print("Hello, World!")

% time ./woc.py
Hello, World!
./woc.py 0.06s user 0.00s system 97% cpu 0.070 total

% time ./wc1.py
Hello World!
./wc1.py 0.20s user 0.01s system 99% cpu 0.207 total

% time ./wc2.py
Hello World!
./wc2.py 1.20s user 0.02s system 99% cpu 1.225 total

% time ./wc3.py
Hello World!
./wc3.py 11.30s user 0.16s system 99% cpu 11.493 total

順帶一提 wc3.py 有 954M。

更新:pyc 方面。

之前的代碼用完就刪了所以重新寫了一份。用 python -m compileall 生成。

文件名即額外的注釋行數。

% python 1.cpython-33.pyc
Hello, World!

% time python 1.cpython-33.pyc
Hello, World!
python 1.cpython-33.pyc 0.05s user 0.01s system 96% cpu 0.056 total

% time python 10.cpython-33.pyc
Hello, World!
python 10.cpython-33.pyc 0.05s user 0.01s system 97% cpu 0.059 total

% time python 100.cpython-33.pyc
Hello, World!
python 100.cpython-33.pyc 0.04s user 0.01s system 97% cpu 0.056 total

% time python 100000000.cpython-33.pyc
Hello, World!
python 100000000.cpython-33.pyc 0.05s user 0.00s system 97% cpu 0.057 total

本來還想搞幾個更長的結果生成文件花得時間太長了……

@余天升


注釋最多隻影響編譯的效率,編譯之後注釋是不會產生目標代碼的,所以不會影響執行效率。

現在的大部分編程語言,都需要完成這樣的兩個步驟。而對於現在大部分解釋型的語言來說,編譯的目標代碼則是位元組碼,而編譯發生在剛剛開始運行的時候,編譯完了以後直接執行生成的目標代碼。所以編譯的速度會減慢,但是執行的速度不會。

如果你是在Shell裡面反覆的執行一個腳本文件,那麼每一次執行之前代碼都會被編譯,因此效率會收到影響。而如果是被Web Server調用的,一般編譯結果會被server緩存,執行不受影響,編譯所帶來的延遲不會因為反覆執行而被放大,因此是沒有負面影響的。

補充:@yukirock 對實驗結果也說明了這一點。如果先編譯為pyc的話,應該沒有差別。


對 JavaScript 肯定有影響,會增加內存佔用,因為 JS 的 Function::toString 要記錄源碼……


你舉的例子太誇張了,我想10w個程序員里也找不出一個在代碼之前加10w行注釋的。

實際上像Python或者Perl這種腳本語言,它們的程序在執行之前會被"編譯成"位元組碼,執行的時候是位元組碼被解釋執行,所以多加註釋對對執行性能沒有影響。

即使是」純「解釋型的語言,我覺得加幾行注釋對程序解析速度的影響微乎其微。


注釋對於javascript等解釋型語言是有性能影響的,不過正常來說這些注釋影響對於當前的CPU等來說,影響不會太大. 按照現在的做法, javascript等在正式發布前會用工具移除注釋並進行壓縮等操作.


在剛開始應該是會有影響的 應為注釋越多 文件就越大 IO就越多 所以就會越卡


那像js這種語言呢?

Js 發展到今天,在正式發布之前不用 r.js optimizer / YUI compressor / ClosureCompiler 處理過再發送已經是缺乏職業素養的表現了吧。

另外 Js 的 V8 引擎 JIT 能力應該是腳本里最強的之一。


推薦閱讀:

如何實現一個關係資料庫?
如何學習Zynq?
為什麼國內創造不出很棒的編程語言?
一般編程語言都是英文的,大家對中文編程有什麼樣的看法,中文編程有哪些優劣勢?
為什麼目前流行的編程語言都是很早以前就發明的?

TAG:編程語言 | 注釋編程 |