java缓冲区的刷新方法_endl并刷新缓冲区

这里的“冲洗缓冲区”是什么意思?

std::endl 导致流的内部分段存储器(其"buffer")中的数据被"flushed"(传送)到操作系统 . 后续行为取决于流映射到的设备类型,但通常,刷新将提供数据已物理传输到关联设备的外观 . 然而,突然失去力量可能会打败这种错觉 .

这种冲洗涉及一些(浪费的时间),因此当执行速度是一个重要问题时应该最小化 . 最大限度地减少这种开销的总体影响是data buffering的根本目的,但这个目标可以通过过度冲洗来消除 .

背景资料

计算系统的I / O通常非常复杂并且由多个抽象层组成 . 每个这样的层可能引入一定量的开销 . 数据缓冲是一种通过最小化在系统的两个层之间执行的单个事务的数量来减少此开销的方法 .

CPU/memory system-level buffering (caching) :对于非常高的活动,即使计算机的随机存取存储器系统也可能成为瓶颈 . 为了解决这个问题,CPU通过提供多层隐藏缓存(其各个缓冲区称为缓存线)来虚拟化内存访问 . 这些处理器高速缓存缓冲算法的内存写入(根据writing policy),以最大限度地减少内存总线上的冗余访问 .

Application-level buffering :虽然并不总是必要,但应用程序分配内存块以在将输出数据传递给I / O库之前累积输出数据的情况并不少见 . 这提供了允许随机访问(如果需要)的基本好处,但是这样做的一个重要原因是它最小化了与进行库调用相关的开销 - 这可能比简单地写入存储器阵列更耗时 . .

I/O library buffering :C++ IO stream library可选择为每个打开的流管理缓冲区 . 特别是,此缓冲区用于限制操作系统内核的数量,因为此类调用往往会产生一些非常重要的开销 . 这是缓冲区使用 std::endl 时刷新 .

operating system kernel and device drivers :操作系统根据流附加到哪个输出设备将数据路由到特定设备驱动程序(或子系统) . 此时,实际行为可能会有很大差异,具体取决于该类型设备的性质和特征 . 例如,当设备是硬盘时,设备驱动程序可能不会立即启动向设备的传输,而是维护自己的缓冲区以进一步减少冗余操作(因为磁盘也可以最有效地写入块中) ) . 为了显式刷新内核级缓冲区,可能需要调用系统级函数,例如fsync() on Linux - 甚至closing关联的流,不一定强制进行此类刷新 .

示例输出设备可能包括......

本地计算机上的终端

远程计算机上的终端(通过SSH或类似设备)

大量存储设备和相关文件系统的许多变体,可以(再次)通过网络本地连接或分发

hardware buffers :特定硬件可能包含自己的内存缓冲区 . 例如,硬盘驱动器通常包含disk buffer,以便(除其他外)允许进行物理写入而不需要系统的CPU参与整个过程 .

在许多情况下,这些不同的缓冲层往往(在某种程度上)是多余的 - 因此基本上是过度的 . 然而,如果其他层由于某种原因未能提供关于与每层相关的开销的最佳缓冲,则每层的缓冲可以提供吞吐量的巨大增益 .

简而言之, std::endl 仅解决了由该特定流的C IO流库管理的缓冲区 . 在调用 std::endl 之后,数据将被移动到内核级管理,接下来发生的数据取决于很多因素 .

如何避免std :: endl的开销

方法1:不要使用 std::endl - 请改用 '\n' .

inline std::ostream & endl( std::ostream & os )

{

os.put( os.widen('\n') ); // http://en.cppreference.com/w/cpp/io/manip/endl

if ( debug_mode ) os.flush(); // supply 'debug_mode' however you want

return os;

}

在此示例中,您提供了一个自定义 endl ,可以调用或不调用对flush()的内部调用(这是强制传输到操作系统的内容) . 启用刷新(使用 debug_mode 变量)对于调试在程序终止之前能够检查输出(例如磁盘文件)的情况非常有用,然后才能完全关闭关联的流(这将导致最终冲洗缓冲区) .

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值