防止在调用“ get”和“ peek”时

时间:2018-09-06 21:19:15

标签: c++ performance locking istream

我目前正在使用istream读取c ++中的文本文件,我注意到每次读取(特别是istream get和peek方法)后,istream锁定文件都会产生大量开销。

如果我理解正确,则会出于线程安全的考虑而进行此锁定,但我仅打算使用单个线程,因此感觉没有必要。

从istream读取数据时,有什么方法可以防止此线程锁定吗?

谢谢!

P.S .:我附加了VTune结果图像,其中包含花费时间的概述。

VTune image of all the lock_file sections

1 个答案:

答案 0 :(得分:0)

虽然不受支持,但似乎有一些黑客方式:

对于char = in.get()或in.get(char&),请使用std::sbumpc

对于char = in.peek(),请使用std::sgetc

所以:

// Old:
char c = in.get();
char p = in.peek();

// New:
char c = in.rdbuf()->sbumpc();
char p = in.rdbuf()->sgetc();

请注意,这些方法将不是线程安全的,并且不会自动检测eof。仅在性能至关重要的时候使用,并要自己检查一下。