2010-06-24 5 views
0

나는 timeval 구조체에서 두 개의 구성 요소를 꺼내 문자열에 배치하려고합니다.문자열에 timeval (두 사이의 변환)

난별로 행운이 없다. 저는 먼저 캐스팅하고 긴 것으로 변환 한 다음 문자열로 변환하려고 시도했습니다. 가장 효율적인 방법이 필요합니다.

아이디어가 있으십니까? 나는 다른 데이터 구조 (localtime, 등)로 먼저 변환하고 싶지 않다. 초와 마이크로 초를 원래 상태로 유지해야합니다.

편집 : 나는 stringstream이 옵션이라는 것을 알고 있습니다 - 나는 그것이 얼마나 효율적인지 모르겠습니다. 매 초마다 1 초가 소요되므로 가장 빠른 구현을 찾고 있습니다.

+0

실제 문제는 무엇입니까? timeval 구조체는 이미 두 값을 분리합니다. sprintf() 또는 이와 유사한 함수를 사용하여 문자열을 그대로 문자열에 할당하면됩니다. –

+0

@Remy 작동을 기대했지만, long int와 string 사이의 변환에 실패합니다. 왜 그런가요? – BSchlinker

+0

Perl과 같은 언어와 달리 C++에는 유사하지 않은 데이터 유형 간의 기본 제공 변환이 없으므로 최악의 경우 라이브러리 (선호)를 사용하거나 자신의 라이브러리를 사용해야합니다. @Remy는 일반적으로 안전을 위해 snprintf를 선호합니다. 프로파일 링이'snprintf' 메소드의 측정 가능한 이점을 나타내지 않는 한'stringstream'을 제안합니다. –

답변

1

부스트의 lexical_cast은 비교적 빠릅니다.

편집 :
자세히 설명해 드리겠습니다. 다음은 그 사용의 예 : 더 복잡한 문자열 형식에 대한

std::string strSeconds = lexical_cast<std::string>(time.tv_sec); 
std::string strMicroSec = lexical_cast<std::string>(time.tv_usec); 

, 부스트 문서는 기본 std::stringstream을 권장합니다. 예 :

std::stringstream ss; 
ss << time.tv_sec << " seconds, " << (time.tv_usec/1000L) << " milliseconds"; 
return ss.str(); 

비교적 빠르고 읽기 쉽고 안전하며 표준입니다. cstdio 헤더의 sprintf을 사용하면 속도를 조금 더 높일 수 있습니다. printf와의 long 변수에 대한 명시 적 지원이 없다 (사용 가능한 경우 바람직 sprintf_s),하지만 당신이 그들을 처리 할 %d 지정자를 사용할 수 있도록 32 비트 + 기계에 요즘 그들은 일반적으로 같은 크기 위치 :

std::string tvtostr(timeval time) { 
    // unless corrupted, the number of microseconds is always less than 1 second 
    assert(time.tv_sec >= 0 && time.tv_usec >= 0 && time.tv_usec < 1000000000L); 
    static_assert(sizeof(long)==4 && sizeof(int)==sizeof(long), 
     "assuming 32 bit ints and longs"); 

    // space for one unbounded positive long, one long from 0 to 999, 
    // the string literal below, and a '\0' string terminator 
    boost::array<CHAR, 10+3+23+1> buffer; 

    sprintf_s(buffer.data(), buffer.size(), "%d seconds, %d milliseconds", 
     time.tv_sec, (time.tv_usec/1000L)); 

    return buffer.data(); 
} 
0

않는 한 여기서 가장 빠 른 방법으로 문자열을 정수로 변환하기를 원한다. 그건 경우 그래서 당신의 선택 DDJ에 기사의 매튜 윌슨의 시리즈를 확인하고 가지고 : 당신이 프로파일에서 결정적인 증거가없는 한

Flexible C++ #1: Efficient Integer to String Conversions

Flexible C++ #2: Efficient Integer to String Conversions

Flexible C++ #3: Efficient Integer to String Conversions

Flexible C++ #4: Efficient Integer to String Conversions

+0

'long'을'std :: string'으로 바꾼다. – Gunslinger47

0

을 그 std::ostringstream이 너무 느립니다. 가장 직접적인 접근 방식이므로 사용하겠습니다. 이런 종류의 전환을 조기에 최적화하려고하지 마십시오.

마이크로 초 동안 메모리 덩어리를 기꺼이 포기하려는 경우 해당 필드의 가능한 각 값에 대해 1000000 개의 문자열 배열을 만들고 필요한 문자열을 색인화 할 수 있습니다.

+0

주의 :'std :: endl'은 스트림 플러시를 트리거한다. 이것은 시스템 호출, 파일 쓰기, 힙 할당 등을 의미합니다. 반복되는 플러시가 필요없는 경우 성능 코드에서 '\ n'을 사용하십시오. – Gunslinger47