我正在处理一些现有代码,这些代码正在反序列化存储在文本文件中的对象(我可能需要阅读数千万个这些对象)。文件的内容首先被读入 a wstring
,然后它wistringstream
从中生成 a 。在程序上运行 Very Sleepy 分析器表明它在以下调用堆栈中花费了大约 20% 的时间:
Mtxlock or RtlEnterCritialSection
std::_Mutex::_Lock
std::flush
std::basic_istream<wchar_t, std::char_traits<wchar_t> >::get
<rest of my program>
和类似的std::_Mutex::_Unlock
。我正在使用 Visual C++ 2008。
往里istream
看,我看到它构造了一个在底层调用和方法的sentry
对象。这反过来只是调用和与该缓冲区关联的一个。然后定义如下:_Lock
_Unlock
basic_streambuf
_Lock
_Unlock
_Mutex
#if _MULTI_THREAD
// actually defines non-empty _Lock() and _Unlock() methods
#else /* _MULTI_THREAD */
void _Lock()
{ // do nothing
}
void _Unlock()
{ // do nothing
}
#endif /* _MULTI_THREAD */
看起来 _MULTI_THREAD 设置yvals.h
为
#define _MULTI_THREAD 1 /* nontrivial locks if multithreaded */
现在,我知道永远不会有另一个线程尝试访问此缓冲区,但在我看来,在使用标准 iostream 时无法绕过此锁定,这看起来既奇怪又令人沮丧。我错过了什么吗?有解决方法吗?