【问题标题】:Do comments slow down a compiled language?注释会减慢编译语言的速度吗?
【发布时间】:2016-10-08 12:17:43
【问题描述】:

关于解释语言或 R 的问题已在此处多次询问,但我没有找到任何关于编译语言的信息,特别是 C#。

根据我读到的内容,它似乎可以忽略不计,但它仍然会导致解释语言的速度非常慢: Do comments slow down an interpreted language?

编译语言呢?!它们是否只减慢编译过程而不减慢执行速度?

【问题讨论】:

  • 注释从编译的代码中被剥离,它们不会减慢你编译的程序。
  • cmets 所能做的就是减慢编译器的速度(它应该解析源代码并切断 cmets)。
  • 考虑到这一点意味着考虑使用最少或没有 cmets 进行编码 - 因此不值得考虑!
  • 听起来像是有人在寻找论据来回答“你为什么不评论你的代码”这个问题:)
  • @Gar 详细信息:不是剥离而是替换:“每条评论都被一个空格字符替换。”

标签: c# c


【解决方案1】:

当你编译程序时,编译器实际上是这样做的:

  • 词法分析(标记化)
  • 语法分析(解析)
  • 语义分析(检查语言规则)
  • [中级]代码生成
  • 代码优化(可选)

至于 cmets,它们应该在词法分析阶段作为标记提取,在语法分析(解析)阶段退出。所以你可以减慢编译器,但不能减慢生成的代码

许多解释性语言通常会先执行两到三个阶段,然后才执行,因此 cmets 即使是解释性语言也不一定会减慢速度 .

【讨论】:

  • 值得注意的是,几乎所有现代解释语言都是如此。因此,即使是解释型语言也不会从 cmets 中看到减速(除了在解析的第一阶段,无论代码流如何,它只发生一次)。
  • 我不会说代码优化是可选的。每个现代编译器都有代码优化。这是编译的非常重要的阶段。
  • 这是一个值得怀疑的主要原因之一,您是否可以为某些关键部分编写更快的汇编代码,然后编译器会优化您的常规代码。
  • @Aleksandar Makragić:通常你可以打开一种调试模式:让编译器完全执行你所设置的,无论如何都没有尝试优化它。
  • @Aleksandar Makragić:想象你的代码中有一个隐藏的错误,所以你想调试它。如果代码被优化,这很可能是一项艰巨的任务:许多变量/方法/函数将被重新排序,删除,以其他(通常非常特殊)的方式重写。所以你说:我准备好了,比如说,慢 30% 的代码,但是,请完全按照我说的去做;只有当我发现错误时,才优化我的 final 解决方案。先正确,后快:不要过早优化!
【解决方案2】:

编译器有这些阶段:

  • 词法分析
  • 语法分析
  • 语义分析
  • 生成与机器无关的代码
  • 代码优化
  • 生成最终代码

词法分析中,cmets被跳过了,基本上就像你什么都没写一样。

所以不,它们不会以任何方式影响性能。

【讨论】:

  • 评论不会被跳过。每条评论都被一个空格字符替换。
  • 这不是真的。当找到用于注释的正则表达式时,Lexer 将有空规则。所以你不要用一个空格字符替换它,那根本没有意义。评论会被忽略。
  • 也许 C 规范是错误的? “每条评论都被一个空格字符替换。” C11dr §5.1.1.2 3. 至于你的“不要用一个空格字符替换它,那根本没有意义”,你有什么支持的参考? -/*abc*/-a- -a 相同,而不是 --a
  • 您说的是 C 预处理器,而不是编译器/解释器。
【解决方案3】:

评论将被排除在词法分析阶段

但如果在 词法分析 阶段解析带有 cmets 的代码,与不带 cmets 的代码相比可能需要更多时间,但 cmets 不会影响执行时间

你为什么不自己尝试,看看下面的例子并运行它。

class Program
{
    static void Main(string[] args)
    {
        DateTime StartTime;
        DateTime EndTime;
        TimeSpan ExecutionTime;

        StartTime = DateTime.Now;
        for (int i = 0; i < 10000;)
        {
            i++;
            for (int j = 0; j < 100000;)
            {
                j++;
            }
        }
        EndTime = DateTime.Now;
        ExecutionTime = (EndTime - StartTime);

        Console.WriteLine("Phase 1 without comment done.");
        Console.WriteLine("Phase 1 start time : " + StartTime.ToString());
        Console.WriteLine("Phase 1 end time : " + EndTime.ToString());
        Console.WriteLine("Phase 1 Execution Seconds : " + ExecutionTime.TotalSeconds);

        Console.WriteLine("\r\n---------------------------------------------\r\n");

        StartTime = DateTime.Now;
        for (int i = 0; i < 10000;)
        {
            i++;
            for (int j = 0; j < 100000;)
            {
                j++;
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
                // SOME COMMENT.
            }
        }
        EndTime = DateTime.Now;
        ExecutionTime = (EndTime - StartTime);

        Console.WriteLine("Phase 2 with comment done.");
        Console.WriteLine("Phase 2 start time : " + StartTime.ToString());
        Console.WriteLine("Phase 2 end time : " + EndTime.ToString());
        Console.WriteLine("Phase 2 Execution Seconds : " + ExecutionTime.TotalSeconds);

        Console.ReadKey();
    }
}

【讨论】:

    【解决方案4】:

    不,编译器不会减慢程序的速度,它会忽略所有 cmets 并获取原始代码。

    【讨论】:

      【解决方案5】:

      如果语言使用编译器,则处理不会受到影响,但如果解释器在那里工作,则处理可能会因 cmets 而变慢。

      【讨论】:

      • 您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center
      猜你喜欢
      • 2011-02-13
      • 2015-12-28
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-04-24
      • 2016-10-16
      相关资源
      最近更新 更多