【问题标题】:Is there a way to read a string faster than getchar() (C/C++)?有没有办法比 getchar() (C/C++) 更快地读取字符串?
【发布时间】:2012-01-21 10:48:53
【问题描述】:

我正在参加一些编程比赛,在许多问题上都需要从输入文件中读取字符串。显然,性能在这些比赛中是一个大问题,而且字符串可能很大,所以我试图了解读取这些字符串的最有效方法。

我的猜测是,使用 getchar() 逐个字符地读取字符串是最快的。这是因为即使您使用其他函数,例如 fgets() 或 getline(),这些函数仍然需要读取每个字符。

更新:我知道 I/O 不会成为大多数算法问题的瓶颈。话虽如此,如果这成为未来任何问题的问题,我仍然非常想知道您可以用来读取字符串的最快方法是什么。

【问题讨论】:

  • 使用好的旧 c++ 流怎么样?
  • 编程竞赛题的设计方式,I/O 不会成为瓶颈。如果你超时,那是因为你的实际工作算法不够聪明。
  • @Kari Knechtel,我同意这一点。话虽如此,因为无论如何我都需要读取输入,所以我宁愿以最有效的方式来做,而不用担心我以后是否可以改进它。
  • 你错过了一些东西。 getchar() 意味着您为每个字符支付函数调用的代价。正如其他人所说,I/O 可能不会成为瓶颈,但如果您使用getchar() 逐个字符地读取输入字符,它可能只是在您的程序中。
  • @DanielS:如果你使用std::ostream::read(),那么它会更快。

标签: c++ c input


【解决方案1】:

您可以使用std::istream::read() 函数读取一大块未格式化的数据。正是因为数据是未格式化的,所以它相对更快。 operator>> 的所有重载都读取 格式化 数据,这使得从流中读取比 read() 更慢。

同样,您可以使用std::ostream::write() 函数一次将一大块数据写入输出流。

【讨论】:

  • 我认为这就是我所需要的。谢谢!
【解决方案2】:

反之亦然,一次将较大的数据块读取到内存中比一次读取一个字符要快得多。在任何情况下,操作系统和/或硬盘驱动器都会缓存数据,但是对于大型数据集而言,仅重复循环通过标准库、操作系统、文件系统和设备驱动程序的函数调用开销就非常重要。

在处理字符串时,您可能会考虑一些更重要的性能问题:Back to Basics by Joel Spolsky

无论哪种方式,为自己回答问题的最有说服力的方法是编写测试代码来调查不同 I/O 方法之间的差异。

【讨论】:

  • 此外,在某些平台上,每个 stdio 调用都需要一个锁,这进一步增加了逐字节 IO 的成本。
猜你喜欢
  • 2020-07-16
  • 2020-03-01
  • 1970-01-01
  • 2019-04-04
  • 2022-01-14
  • 2023-04-01
  • 1970-01-01
  • 2017-01-15
  • 2020-11-30
相关资源
最近更新 更多