2014-07-17 7 views
2

std::stringstream에 로그 메시지를 버퍼링하고 (std::ofstream) 파일을 플러시 () 할 때마다 IO 대기 시간). std::stringstream 이후 .size() 방법이없는, 내가 사용 seekgtellg :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은 요즘의 일반 컴퓨터에서 버퍼 크기에 좋은 숫자입니까?

+4

fstream 이미 버퍼링을 제공합니다. stringstream을 사용하면 실제로 속도가 빨라진다는 것을 테스트 했습니까? 더 큰 것을 원한다면 fstream 버퍼의 크기를 커스터마이징하려고하지 않겠습니까? 또한, endl과 fstream을 사용하지 말고 강제로 플러시하지 않기 때문에 "\ n"을 사용하십시오. –

+0

'stringstream'의'tellg()'에는 일종의 간단한 포인터 연산이 포함되어 있다고 생각합니다. 너무 비싸지 않아야합니다. 그러나 Neil Kirk이 지적했듯이,'fstream'의 버퍼링에만 의존해야합니다. 성과에 관해 이야기 할 때마다 항상 측정하십시오. –

답변

1

당신은 단지 문자열의 길이를 얻을 수 ostringstream::tellp()을 사용할 수 있습니다 감사합니다. http://en.cppreference.com/w/cpp/io/basic_ostream/tellp에서 해제 한 예입니다.

#include <iostream> 
#include <sstream> 
int main() 
{ 
    std::ostringstream s; 
    std::cout << s.tellp() << '\n'; 
    s << 'h'; 
    std::cout << s.tellp() << '\n'; 
    s << "ello, world "; 
    std::cout << s.tellp() << '\n'; 
    s << 3.14 << '\n'; 
    std::cout << s.tellp() << '\n' << s.str(); 
} 

출력 :

 
0 
1 
13 
18 
hello, world 3.14