std::stringstream
에 로그 메시지를 버퍼링하고 (std::ofstream
) 파일을 플러시 () 할 때마다 IO 대기 시간). std::stringstream
이후 .size()
방법이없는, 내가 사용 seekg
및 tellg
:std :: stringstream에서 현재 위치를 추적하는 방법
template <typename T>
MyClass & operator<< (const T& val)
{
boost::unique_lock<boost::mutex> lock(mutexOutput);
output << val; //std::stringstream output;
output.seekg(0, std::ios::end);
if(output.tellg() > 1048576/*1MB*/){
flushLog();
}
return *this;
}
문제 : 내가이 메소드를 호출 할 때마다, 그것은 처음 모두에서 바이트를 계산 시작 seekg
을 사용하여, 나에게 보인다 길을 끝내고 tellg
을 사용하여 크기를 얻으십시오. 첫 번째 장소에서 약간의 입출력 시간을 절약하기 위해이 디자인을 생각해 냈습니다. 그러나이 연속 계산이 더 많은 비용을 부과하는 것은 아닙니다 (이 방법에 대한 호출 수가 많고 대부분의 경우처럼 로그 메시지가 작 으면)?
더 좋은 방법은이 방법이 있습니까?
그리고 옆 질문 : 1MB
은 요즘의 일반 컴퓨터에서 버퍼 크기에 좋은 숫자입니까?
fstream 이미 버퍼링을 제공합니다. stringstream을 사용하면 실제로 속도가 빨라진다는 것을 테스트 했습니까? 더 큰 것을 원한다면 fstream 버퍼의 크기를 커스터마이징하려고하지 않겠습니까? 또한, endl과 fstream을 사용하지 말고 강제로 플러시하지 않기 때문에 "\ n"을 사용하십시오. –
'stringstream'의'tellg()'에는 일종의 간단한 포인터 연산이 포함되어 있다고 생각합니다. 너무 비싸지 않아야합니다. 그러나 Neil Kirk이 지적했듯이,'fstream'의 버퍼링에만 의존해야합니다. 성과에 관해 이야기 할 때마다 항상 측정하십시오. –