【问题标题】:How should I compare a c++ metaprogram with an C code ? (runtime )我应该如何将 C++ 元程序与 C 代码进行比较? (运行 )
【发布时间】:2009-08-19 15:07:25
【问题描述】:

我已将 C 程序移植到 C++ 模板元程序。现在我想比较运行时。 由于 C++ 程序中几乎没有运行时,我应该如何比较这两个程序。
我可以将 C 运行时与 C++ 编译时间进行比较吗?还是没有可比性?

【问题讨论】:

  • 你的问题毫无意义。请走开,想一想,然后再提出一个改写的问题。首先,“运行时”是什么意思?
  • 仍然没有解释“运行时”是什么意思。
  • @Neil:该运行程序了吗?
  • 你如何添加一些关于这个程序正在做什么以及它的用途的信息。这可能会澄清你需要做什么。我认为你的很多批评者不明白你想要完成什么。
  • @A.Levy 我们不是批评者。就我自己而言,我讨厌猜谜游戏。

标签: c++ c templates metaprogramming


【解决方案1】:

你可以比较任何你想比较的东西。对于应该比较的内容,没有一个真正的规则。

您可以比较每个版本的执行时间,也可以比较每个版本的编译时间。

或者你可以比较程序的长度,或者源文件中'r'字符的数量。 您可以比较每个文件的时间戳。

你应该如何比较这两个节目取决于你想展示什么!

如果你想显示一个执行速度比另一个快,那么运行两个,计算它们执行所需的时间,并比较 那些 数字。

如果你想证明一个编译速度比另一个快,那么计算编译它们所花费的时间。

如果你认为 C++ 程序的编译时间和 C 程序的运行时间之间的关系是相关的,那就比较一下。

决定你想展示什么。然后你就会知道要比较什么。

【讨论】:

    【解决方案2】:

    如果我理解正确,您已经用完全基于模板的 C 程序重写了一个 C 程序?因此,您将运行 C 程序所需的时间与运行几乎不花费时间但只需将结果写出的 C++ 程序进行比较。

    在这种情况下,我不认为它具有可比性——最终用户会看到 C 程序需要 x 秒才能运行,而 C++ 程序会立即完成。然而,开发者将看到 C 程序在 x 秒内编译,而 C++ 编译在更多秒内。

    您可以将 C++ 编译时间与 C 运行时间进行比较,如果应用程序设计为产生结果并且从不运行两次,那么是的,您可以通过这种方式比较时间。如果程序设计为多次运行,那么运行时间就是你需要比较的。

    我只是希望你在你的 C++ 模板代码中加入很多 cmets :)

    PS。我很好奇 - 与两者的编译时间相比,C 需要多长时间运行?

    【讨论】:

      【解决方案3】:

      既然 C++ 程序总是会产生相同的结果,为什么还要费心呢?使用任一程序计算一次结果,然后将两者替换为:

      int main()
      {
         printf("<insert correct output here>\n");
         return 0;
      }
      

      【讨论】:

        【解决方案4】:

        我认为比较两个程序的编译时间是有意义的,然后是运行时间,然后你可以计算在多少次运行后你已经摊销了额外的编译时间。

        【讨论】:

          【解决方案5】:

          这就是我认为你正在尝试做的事情:

          您还没有说明您的 c 程序是做什么的,所以可以说它以某种指定的准确度计算余弦数。您已将此程序转换为基于 c++ 模板的等效程序,它执行相同的操作,但在编译时生成编译时常量值。这是一个合理的做法,因为您可能有一个使用“硬编码”余弦值的算法,并且您不希望有一个随机数字表。请参阅 this article 以了解实际使用的示例(或搜索 Blitz 和/或 Todd Veldhuizen 以获取更多示例)。

          在这种情况下,您需要将 C++ 正弦计算器的编译时性能与原始 C 版本的运行时性能进行比较。

          将编译 C++ 源文件的时间与运行 C 版本的时间进行直接比较几乎肯定会显示编译时间明显变慢。但这并不是一个公平的比较,因为编译器所做的不仅仅是“执行”模板代码。

          编辑:您可以通过创建一个 c++ 程序的副本来补偿编译器开销,该副本具有一些与模板化代码将生成的内容等效的简单代码 - 即您必须手动编译您的模板化代码如果这是有道理的。如果您随后对该源代码的编译进行计时,那么该时间与编译您的原始 C++ 模板化程序的时间之间的差异可能只是执行模板所需的时间。

          【讨论】:

          • 编译器除了执行还有什么作用?
          • 编译 :-) 读取源文件、预处理、解析、生成机器码并写出目标文件。我想你可以弥补这一点 - 让我在上面编辑我的回放。
          【解决方案6】:

          当今的 C 和 C++ 编译器共享相同的后端,因此很可能生成相同的汇编代码。

          C++ 只是一个注释较多的 C,你仍然可以在 Cplusplusing 的同时做好 C ;)

          C 只是 C++ 老哥。

          【讨论】:

          • 您可能想在回答之前尝试阅读问题。
          • 我敢打赌,他试图阅读它,只是像我们其他人一样感到困惑。
          猜你喜欢
          • 1970-01-01
          • 2017-02-17
          • 2011-07-11
          • 2023-03-12
          • 1970-01-01
          • 2020-07-01
          • 2013-12-21
          • 2011-06-22
          • 2012-12-20
          相关资源
          最近更新 更多