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

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

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

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

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

这可以performance如下:

$ 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个注释,然后编译。 结果对象进行比较,没有差异。

请注意,编译时间确实增加了,但是对于每条评论来说,编译时间是非常小的,所以不应该成为一个问题,除非是在极端的情况下。


用bash ,我无法测量循环中的注释的任何重大差异:

 $ 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 $ 

…虽然可能有更严格的testing案例。

每当bash必须parsing任何types的循环时,它需要在执行之前parsing整个循环(因此它知道在哪里redirect输出等)。 我怀疑这个parsing过程中删除了注释,所以在每个循环迭代过程中它们都不会被重新parsing。

但是 ,如果注释不是任何types的循环(或可能是函数),那么parsing时间很短,但是可以衡量:

 $ 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 $ 

没有node.js的意思 ,尽pipe类似于任何解释性语言,除了最极端的情况之外,它可能几乎没有区别。


底线是 – 请不要删除您的意见 – 他们在那里有一个很好的理由。 如果你删除它们,你的代码的未来维护者(包括可能你)将永远诅咒你的名字。 😉

没有必要删除评论。 编译器运行时,会删除额外的东西,包括注释。 即使您使用的是解释型语言,注释也不会使用CPU周期,因为它们不是可执行代码,尽pipe它们可能会添加极其微不足道的parsing时间。

关键是, 不要担心 。 你必须有一个绝对荒谬的评论数量,以便在编译或执行时间上做出可靠的可测量的差异。

C预处理过程中,每个注释都将被一个空格字符replace,我们可以通过去起草C99标准部分来看这个5.1.1.2 翻译阶段的3段说:

每个评论被一个空格字符取代。 换行符保留。 是否保留每个非空白字符序列(除了新行之外的空白字符)还是由一个空格字符replace是实现定义的。

所以评论不应该为C有所作为。

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

不知道bash或node.js; 我认为这种差异在无关紧要的时候可以忽略不计,但唯一确定的方法是运行自己的基准testing,比较注释代码和未注释代码的性能。 但是,如果注释代码不符合硬性能要求,则只能这样做。

编辑

不要使用注释去激活代码; 这种做法导致维修令人头疼的问题(在那里,这样做,得到了多种尺寸和颜色的T恤)。 在C的情况下,可以使用预处理器来控制代码的包含:

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

否则,如果代码不再被激活, 请将其删除 ,然后使用版本控制工具(CVS,git,whatever)来跟踪这些更改。