【问题标题】:cin or printf?cin 还是 printf?
【发布时间】:2010-08-23 20:16:02
【问题描述】:

在使用 c/c++ 时,

1.cin/cout 要么 2.scanf/printf,

两者中的哪一个将具有更少的执行或运行时间。 或者两者的运行时间相同。

我的目标是减少代码的运行时间。

【问题讨论】:

  • 我同意大家关于剖析的观点,然后再做决定。使用 C 库(如果您没有使用 any 的其余 C++ 标准库)的一个优点是您最终可能会得到更小的可执行文件。这有点像“C with classes”的习语。
  • @Merlyn Morgan-Graham:如果您没有使用 C++ 标准库的其余部分,那么您使用的是“C”,所以可以使用 scanf/printf,因为 cin/cout 不可用。
  • @Martin,@Merlyn,除了标准合规性和安全性(类型安全)的考虑之外,旧的 C-stdio 有一大优势。对于许多情况来说,它最实用。没有这个,在 2010 年没有人愿意使用它。在 iostream 中尝试 printf("%08d", i)。
  • @rubber:见Boost.Format
  • @mahidce:“我的目标是减少代码的运行时间。”为什么?是什么让你觉得它很慢?

标签: c++


【解决方案1】:

console IO 功能的相对时间是恕我直言,没有任何实际用途。这是完全不可预测的(取决于环境)。控制台输出完全取决于控制台的速度,通常取决于 printf/cout 的速度。尝试使用本地文件输出而不是控制台输出。

【讨论】:

  • 这是一个非常好的观点。当然,通过重定向 cincoutscanfprintf 中的任何一个都可以进行文件 I/O。
【解决方案2】:

性能规则 #1 - 衡量,然后优化

在您尝试确定 cin/coutscanf/printf 是否会更快之前,请确保您已测量并证明这确实是您的应用程序最大的性能问题。

【讨论】:

    【解决方案3】:

    由于还没有人提及,所以来个迟来的回复:
    C++ 的 IO 流是类型安全的。当您想要打印double 时,编译器会发现它是double,并在编译时插入对operator<<() 右侧重载的调用。使用 C IO 函数 OTOH,您必须手动指定类型,因此很容易产生仅在运行时捕获的错误。 (只需执行std::printf("%d", 47.11),您就会深入未定义的行为领域。)

    哦,是的,还有:这两者中的任何一个都可以轻松跟上控制台的步伐。因此,首先编写易于正确且易于理解的代码。然后测量。当你(有点惊讶地)发现这个代码确实是问题时,看看它是否可以通过改变来改进。但也只有那时。

    【讨论】:

      【解决方案4】:

      C++ iostream 的早期实现往往比 C 对应的版本慢得多。不过,这种情况已经有一段时间了。除非您使用的是相对较旧的编译器/库,否则它们的总体速度可能非常接近相同(尽管如果您进行测量,您可能会发现在某些特定情况下或其他情况下一个比另一个更快——我我当然见过一些这样的)。

      底线:如果你想大大提高性能,这个可能不是第一个看的地方。

      【讨论】:

      • 我的经验是,由于语言环境逻辑,iostream 会产生大量开销。当然,您应该分析一下热点是什么,但如果得知格式化的 I/O 会拖累性能,我一点也不感到惊讶。
      【解决方案5】:

      根据我的经验,问题不在于性能,而在于能力。 coutcin 的应用程序很难使用 fprintffscanf。但是,使用fprintf 进行格式化通常比使用cout 更容易。在分析之前专注于稳健性和正确性。

      就性能而言,块 I/O 比格式化 I/O 更快。例如:

      #include <iostream>
      #include <cstdio>
      
      using namespace std; // Because I'm lazy right now. :-)
      
      int main(void)
      {
        static const char  some_text[] = "This is kinda long, but anything will do.\n";
      
        // The "fast" method using block writes:
        cout.write(some_text,
                   sizeof(some_text) - sizeof('\0')); // Remove trailing nul from the length.
      
        // The slow method, using formatted write:
        cout << some_text;
      
        // Using the C language techniques:
        fwrite(some_text,
               sizeof(some_text) - sizeof('\0'),
               1,
               stdout);
      
        // Another fast method but slower than above:
        puts(some_text);
      
        // Finally, the slow method:
        fprintf(stdout, some_text);
      
        return 0;
      }
      

      在基于cout/cinprintf/scanf 调整程序的性能时,必须考虑到大部分时间或瓶颈不是与程序有关,而是与操作系统有关。操作系统在打印时需要管理很多开销,例如资源管理(是使用资源的另一个任务)、切换上下文等。因此,如果您希望程序运行得更快,请使用更少的 I/O 请求。如果可能,将几个小请求合并为一个大请求。

      【讨论】:

        【解决方案6】:

        分析是你的朋友;没有一个正确的答案,这取决于您的具体使用模式和平台。

        【讨论】:

          【解决方案7】:

          在您对代码进行概要分析之前,选择一个而不是另一个无异于猜测。这里最好的方法是首先选择更有用的功能。在后来的分析显示它是一个问题之后,然后切换到一个可证明更快的功能。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2011-12-08
            • 2017-06-02
            • 1970-01-01
            • 1970-01-01
            • 2013-11-06
            • 2011-02-17
            • 1970-01-01
            • 2020-07-17
            相关资源
            最近更新 更多