C++输入性能

Win*_*ert 8 c++ performance profiling iostream stdio

我试图在InterviewStreet上解决问题.一段时间后,我确定我实际上花了大量时间阅读输入.这个特殊的问题有很多输入,所以这有点意义.没有意义的是为什么不同的输入方法具有如此不同的表现:

最初我有:

std::string command;
std::cin >> command;
Run Code Online (Sandbox Code Playgroud)

更换它使它明显更快:

char command[5];
cin.ignore();
cin.read(command, 5);
Run Code Online (Sandbox Code Playgroud)

重写使用scanf的所有内容使其更快

char command;
scanf("get_%c", &command);
Run Code Online (Sandbox Code Playgroud)

总而言之,我把读取输入的时间减少了大约1/3.

我想知道这些不同方法之间的性能存在这样的差异.另外,我想知道为什么使用gprof没有强调我在I/O上花费的时间,而是似乎指责我的算法.

Mar*_*ett 3

这些例程存在很大差异,因为控制台输入速度几乎从不重要。

在它的地方(Unix shell),代码是用 C 编写的,直接从标准输入设备读取,并且效率很高。

  • @satuon:我个人觉得 iostream 很可怕。各种级别的间接和不直观的界面简直令人难以置信。iostream 的问题在于它的存在可以追溯到 C++ 的早期,当时模板和异常仍在研究中。因此,您有某种半生不熟的解决方案,由于“向后兼容性”原因而被冻结。*叹*。 (4认同)
  • 我觉得特别有趣的是我在一本 C++ 书籍(是 C++ 圣经吗?)中读到的 iostream 理论上如何比 stdio 函数更快,因为它使用虚函数而不是解析像“%s %s %d”这样的文本”,但实际上速度要慢 10 倍到 20 倍。我将这一点与 Java 实际上比 C 更快的理论上的可能性进行了排序,因为虚拟机可以动态分析代码。 (3认同)
  • @WinstonEwert - 它可能是为了设计的灵活性和优雅而优化的。尽管在实践中它可能没有针对任何事情进行优化,因为没有人使用它! (2认同)