テキストファイルに保存されているオブジェクトを逆シリアル化する既存のコードを使用しています(これらの数千万を読み取る必要がある可能性があります)。ファイルの内容は最初にに読み込まれ、wstring
次にそこから作成wistringstream
されます。プログラムでVerySleepyプロファイラーを実行すると、その時間の約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を使用している間は、このロックを回避する方法がないように見えます。これは奇妙でイライラするようです。私は何かが足りないのですか?これに対する回避策はありますか?