2012-09-15 3 views
2

여러 스트림에 동일한 문자열 (예 : 로그 메시지)을 보내야합니다.
다음 중 가장 효율적인 솔루션은 무엇입니까?여러 스트림에 같은 문자열이 있습니다.

  1. 각 스트림에 대해 동일한 문자열을 다시 작성하고 스트림 자체로 보냅니다.

    outstr1 << "abc" << 123 << 1.23 << "def" << endl; 
    outstr2 << "abc" << 123 << 1.23 << "def" << endl; 
    outstr3 << "abc" << 123 << 1.23 << "def" << endl; 
    
  2. 문자열을 문자열 연산자로 한 번 작성하고 모든 스트림으로 보냅니다.

    std::string str = "abc" + std::to_string(123) + std::to_string(1.23) + "def"; 
    outstr1 << str; 
    outstr2 << str; 
    outstr3 << str; 
    
  3. 는 스트림에 한 번 문자열을 구축, 모든 스트림에 보내

    std::stringstream sstm; 
    sstm << "abc" << 123 << 1.23 << "def" << endl; 
    std::string str = sstm.str(); 
    outstr1 << str; 
    outstr2 << str; 
    outstr3 << str; 
    

일부 또는 이러한 출력 스트림을 모두 RAM 디스크에있을 수 있습니다.

다른 방법으로 동일한 작업을 수행 할 수 있습니까?

답변

2

에도 일을 할 수있는 "적절한"방법을 답변을 참조하십시오. 이렇게하면 코드는 마치 한 번만 쓰지만 문자는 여러 번 전송되는 것처럼 보입니다. "teebuf Dietmar"를 검색하면 동일한 주제에 대한 몇 가지 변형을 찾을 수 있습니다. 당신이 정확한 표현에 따라 세 가지 대안 중 하나가 빠른 어느 : 침범 된 표현을 평가하기

  1. 요구하고 변환을 세 번 수행

    또한 귀하의 질문에 대해 언급합니다. 실제로 어떤 일을 하느냐에 따라 여전히 상당히 빠를 수 있습니다.

  2. 은 실제로 여러 스트림을 만들고 파괴하며 std::string에 대해 여러 할당을 수행합니다. 나는 이것이 가장 느릴 것이라고 기대한다.
  3. 은 여전히 ​​스트림 (실제로는 std::ostringstream이어야 함)을 만들고 일부 메모리를 할당합니다. 당신의 선택에서 나는 그것이 가장 빠를 것이라고 기대합니다.

teebuf을 사용하면 적어도 버퍼링을 수행하지만 버퍼 및 스트림 버퍼 포인터의 배열 모두에 대해 고정 된 Suze 배열 만 사용하는 경우가 가장 빠릅니다. 버퍼를 적시에 처리하려면 sync()을 무시해야합니다.

실제 성능을 측정하려면 측정해야합니다!

3

당신이 큰 차이를 어느 쪽이든 1, 옵션 # 3 참조 할 가능성은 있지만 소리 가장 그럴듯한 : 첫 번째 옵션과 달리,이 string의 여러 번에 int의 변환하지 않습니다; 두 번째 옵션과 달리, 중간 결과에 대해 복수 string 개체를 할당하고 삭제하지 않습니다. . 또한 가독성 측면에서 가장 깨끗해 보입니다. 코드가 복제되지 않고 출력이 연결과 유사하지 않은 것처럼 보입니다.


1

은 프로파일 여기 악되기 전에 최적화에 대한 필수 면책 조항을 삽입합니다.

2Small String Optimization이 (감사, Prætorian)를 지원되지만 중간 개체의 생성자와 소멸자 호출을 멀리하지 않을 경우 시스템에 도움이 될 수 있습니다.

+0

답변에 동의하지만 두 번째 옵션에 대해 작성하고 추가하는 문자열이 실제로 작을 경우 대부분의 구현에서 SSO로 인한 할당이 없습니다. – Praetorian

+0

@ Prætorian 좋은 메모를 보내 주셔서 감사합니다. SSO 지점을 반영한 답변을 편집했습니다. – dasblinkenlight

+0

예제의 문자열은 실제로는 훨씬 길 수 있습니다. – Pietro

4

티 출력 스트림을 사용합니다.

allstreams = tee(outstr1, outstr2, outstr3); 
allstreams << "abc" << 123 << 1.23 << "def" << endl; 

이 작업을 수행하는 ++ 라이브러리 표준 C에서 아무것도하지만, Boost has one 것 같다되지 않습니다 (의사) 같은 것을 마십시오. 이 여러 대상에 대한 스트림 버퍼 기록이 있고 std::ostream를 통해이 스트림 버퍼를 사용하는 것처럼

How can I compose output streams, so output goes multiple places at once?

관련 문제