Я работаю с некоторым существующим кодом, который десериализует объекты, хранящиеся в текстовых файлах (мне потенциально нужно прочитать десятки миллионов из них). Содержимое файла сначала считывается в wstring
, а затем из него получается wistringstream
. Запуск профилировщика 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 */
Теперь я знаю, что никогда не будет другого потока, пытающегося получить доступ к этому буферу, но мне кажется, что нет никакой возможности обойти эту блокировку при использовании стандартных iostreams, которые кажутся как странными, так и разочаровывающими. Я что-то пропустил? Есть ли обходной путь для этого?