2010-06-24 21 views
0

我試圖從timeval結構中拉出兩個組件,並將它們放入字符串中。timeval到字符串(在兩者之間轉換)

我對此沒有多少好運。我試圖先鑄造和轉換,然後再轉換成字符串。我需要最有效的方式來做到這一點。

任何想法?我不想先轉換爲其他數據結構(本地時間等)。我需要秒和微秒在他們的原始狀態。

編輯:我知道stringstream是一個選項在這裏 - 我只是不知道這是多高效。每微秒計數在這裏,所以我正在尋找最快的實施。

+0

實際問題是什麼? timeval結構已經爲你分離了兩個值。只需將它們按原樣分配給字符串,例如使用sprintf()或類似的函數。 – 2010-06-24 01:55:39

+0

@Remy我會希望能夠工作,但是在長整型和字符串之間進行轉換失敗。這是爲什麼? – BSchlinker 2010-06-24 02:15:54

+0

,因爲不像Perl這樣的語言,C++在非相似數據類型之間沒有內置轉換。在最壞的情況下,你必須使用庫(最好)或者自己推出。爲了安全,@Remy通常更喜歡'snprintf'。我建議'stringstream',除非分析表明'snprintf'方法的一個可測量的好處。 – 2010-06-24 13:20:24

回答

1

Boost的lexical_cast應該相當快。

編輯:
讓我詳細說明。下面是它的用法的例子:

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

對於更復雜的字符串格式化,Boost文檔建議的基本std::stringstream。例如:

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

合理快速,可讀,安全和標準。您可以通過使用cstdio標頭中的sprintf來獲得更多的速度。 (最好是如果有sprintf_s)有在printf的long變量沒有明確的支持,但是這些天在32位+機,他們通常是相同的大小,這樣就可以使用%d符來處理它們:

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

'長'到'std :: string' – Gunslinger47 2010-06-24 02:11:34

0

除非你有從分析確鑿的證據,證明std::ostringstream太慢了,我會用它,因爲它是最直接的方法。不要試圖過早地優化這類轉換。

這就是說,對於微秒,如果您願意放棄一大塊內存,您可以爲該字段的每個可能值創建一個1000000個字符串的數組,併爲您需要的字符串直接編制索引。

+0

必須注意:'std :: endl'會觸發一個流刷新。這意味着系統調用,文件寫入,堆分配等。當不需要重複刷新時,在性能代碼中使用'\ n'。 – Gunslinger47 2010-06-24 04:51:48

相關問題