当前位置: 代码网 > it编程>App开发>苹果IOS > iostream库输入输出的效率问题

iostream库输入输出的效率问题

2024年07月28日 苹果IOS 我要评论
的与对比的和在速度上慢一个量级,产生这种情况的原因是实现上就效率低下吗?答案是否定的,iostream的效率低主要归结于

iostream的输入输出为什么这么慢

  • 提问:iostreamcoutcin对比stdioprintfscanf在速度上慢一个量级,产生这种情况的原因是实现上iostream就效率低下吗?

  • 回答:并不是这样的,iostream的效率低主要归结于业务逻辑上的两处实现细节。一是iostream会与stdio进行同步;二是iostream会提供flush操作,供用户进行缓冲区刷新。这两点为了提升用户体验而牺牲了效率,以下我们具体探讨这两点优化的内容,以及如何关闭这两处优化,从而提升效率。

1. 与stdio输入输出的同步

  1. std::ios::sync_with_stdio(bool) 控制iostreamstdio是否同步,iostreamstdio输入输出系统都实现了缓冲区的优化,这个开关控制两个缓冲区在输入时的同步检测,默认情况下打开。
  2. 两个缓冲区之间的同步是iostreamstdio进行的,也就是同步的开销全部产生在iostreamcoutcin上,这会极大的降低coutcin的效率,在使用上iostream会比stdio慢一个量级。因此如果在编写小型项目,或确定项目中不会同时使用iostreamstdio的输出输出接口时,可以用 std::ios::sync_with_stdio(false) 关闭两个库的同步操作,提升coutcin的效率。

2. 避免频繁的flush操作

  1. iostream的缓冲区默认会在存满的时候自动清空,因此如果缓冲区还没满我们就不能看到内容,这对用户来说当然很痛苦。iostream提供了 std::flush 进行手动的缓冲区清空操作,这样用户就美滋滋的看到自己的输出了。
  2. 但是flush是有时间上的代价的,开放flush的权限给用户,就可能导致用户过于频繁的进行flush操作,从而毁灭iostream的效率。尤其是用户不经意间的flush
    众所周知 << std::endl; == << '\n' << std::flush;,当用户频繁地在循环中输出单个字符并endl的时候,他并不知道自己给cpu带来了多大的麻烦。因此在追求效率的时候请慎用endl,改为在需要的时候手动flush
  3. 在请求用户输入的时候,程序员通常会展示输入提示语。然而如果你写的 “请输入您的姓名” 停留在缓冲区,你可能会收获一名从茫然慢慢到愤怒的用户。为了避免这种悲剧的发生,iostream聪明的为cin操作加上了前置的flush,每当你使用cin时库函数会自动的帮你清空缓冲区,从而使客户满意。这种操作当然也会有效率上的悲剧,我们希望避免。如果你不需要使用前置flush功能只需要调用 std::cin.tie(0) 即可解除这种操作,提升cin的效率。

总结

关闭这两处后再进行测试iostream的输入输出效率已经和stdio不相上下了,甚至在某些较大的测试集上效率超过了stdio,因此请不要再说iostream慢,他只是比较体贴。

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com