注释消耗内存和/或使用周期吗?

时间:2014-01-14 19:02:07

标签: c node.js bash optimization

我正在使用bash脚本,node.js和C的组合为ARM系统开发几个应用程序。我在开发时使用注释来跟踪代码中发生的事情或停用实际代码。

我的经验是每个额外的内存指针和处理器周期都会降低系统速度。

我是否应该为了优化而删除生产代码中的所有注释,还是不值得担心?

4 个答案:

答案 0 :(得分:4)

没有必要删除评论。编译器运行时,会删除额外的内容,包括注释。即使你使用的是解释型语言,注释也不会使用CPU周期,因为它们不是可执行代码,尽管它们可能会增加极少量的解析时间。

关键是,不要担心。您必须拥有绝对荒谬的评论量才能在编译或执行时间方面产生可靠的可衡量的差异。

答案 1 :(得分:3)

正如其他答案所提到的,(或任何其他已编译的)代码没有区别。

这可以证明如下:

$ touch 0comments.c
$ time gcc -c -o 0comments.o 0comments.c 

real    0m0.022s
user    0m0.009s
sys 0m0.009s
$ seq -f '/* This is comment %g */' 1000000 > 1000000comments.c
$ time gcc -c -o 1000000comments.o 1000000comments.c 

real    0m0.163s
user    0m0.135s
sys 0m0.021s
$ cmp 0comments.o 1000000comments.o
$ 

生成两个.c文件 - 一个为空,另一个有1000000个注释,然后编译。比较结果对象,不会出现任何差异。

请注意编译时间 会增加,但每条评论的编制时间非常微不足道,所以除非在最极端的情况下,否则不应成为问题。


使用,我无法衡量循环中评论的任何显着差异:

$ time for i in {0..1000000}; do
> :
> done

real    0m4.054s
user    0m4.006s
sys 0m0.049s
$ time for i in {0..1000000}; do
> :
> # This is a comment
> done

real    0m4.047s
user    0m3.999s
sys 0m0.048s
$ 

......虽然可能有更严格的测试用例。

每当必须解析任何类型的循环时,它需要在执行之前解析整个循环(因此它知道重定向输出的位置等)。我怀疑在解析期间会删除注释,因此在每次循环迭代期间都不会重新解析。

然而,如果注释不在任何类型的循环(或可能是函数)中,那么解析时间很短,但可以测量:

$ seq -f "# This is comment %g" 1000000 > 1000000comments
$ chmod +x 1000000comments 
$ time ./1000000comments 

real    0m1.675s
user    0m1.468s
sys 0m0.207s
$ touch 0comments
$ chmod +x 0comments 
$ time ./0comments 

real    0m0.001s
user    0m0.000s
sys 0m0.001s
$ 

不知道,虽然与任何解释性语言类似,但除非在最极端的情况下,它可能会产生很小的差别。


底线是 - 请不要删除您的评论 - 他们在那里是有充分理由的。如果你删除它们,你的代码的未来维护者(可能包括你)将永远诅咒你的名字。 ; - )

答案 2 :(得分:2)

C 预处理过程中,每个评论都会被空格字符替换,我们可以通过转到draft C99 standard部分5.1.1.2 翻译阶段来看到这一点/ em>段落 3 ,其中说:

  

[...]每个评论都被一个空格字符替换。保留换行符。是否保留或替换为新行以外的每个非空白字符序列是由实现定义的。

所以评论不应该对 C 产生影响。

答案 3 :(得分:1)

在C的情况下,注释作为预处理阶段的一部分被剥离,并且在可执行文件中不占用空间;它们对运行时性能没有任何影响。

不确定bash或node.js;我希望差异可以忽略不计,但是唯一可以确定的方法是运行自己的基准测试,比较评论代码和未评论代码的性能。但是,如果注释代码未达到硬性能要求,则应该只执行此操作。

修改

不要使用注释来停用代码;这种做法导致维护头痛(在那里,做到了,得到了多种尺寸和颜色的T恤)。对于C,您可以使用预处理器来控制代码的包含:

#if defined(SOME_MACRO)
/**
 * code that may or may not be active
 */
#endif

否则,如果代码不再处于活动状态,将其删除,并使用版本控制工具(CVS,git,无论如何)来跟踪这些更改。