我試圖從timeval結構中拉出兩個組件,並將它們放入字符串中。timeval到字符串(在兩者之間轉換)
我對此沒有多少好運。我試圖先鑄造和轉換,然後再轉換成字符串。我需要最有效的方式來做到這一點。
任何想法?我不想先轉換爲其他數據結構(本地時間等)。我需要秒和微秒在他們的原始狀態。
編輯:我知道stringstream是一個選項在這裏 - 我只是不知道這是多高效。每微秒計數在這裏,所以我正在尋找最快的實施。
我試圖從timeval結構中拉出兩個組件,並將它們放入字符串中。timeval到字符串(在兩者之間轉換)
我對此沒有多少好運。我試圖先鑄造和轉換,然後再轉換成字符串。我需要最有效的方式來做到這一點。
任何想法?我不想先轉換爲其他數據結構(本地時間等)。我需要秒和微秒在他們的原始狀態。
編輯:我知道stringstream是一個選項在這裏 - 我只是不知道這是多高效。每微秒計數在這裏,所以我正在尋找最快的實施。
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();
}
除非我在這裏錯過了一些東西,你基本上想以最快的方式將整數轉換爲字符串。 如果真是這樣檢查馬修·威爾森的系列文章在DDJ,然後挑選:
Flexible C++ #1: Efficient Integer to String Conversions
Flexible C++ #2: Efficient Integer to String Conversions
'長'到'std :: string' – Gunslinger47 2010-06-24 02:11:34
除非你有從分析確鑿的證據,證明std::ostringstream
太慢了,我會用它,因爲它是最直接的方法。不要試圖過早地優化這類轉換。
這就是說,對於微秒,如果您願意放棄一大塊內存,您可以爲該字段的每個可能值創建一個1000000個字符串的數組,併爲您需要的字符串直接編制索引。
必須注意:'std :: endl'會觸發一個流刷新。這意味着系統調用,文件寫入,堆分配等。當不需要重複刷新時,在性能代碼中使用'\ n'。 – Gunslinger47 2010-06-24 04:51:48
實際問題是什麼? timeval結構已經爲你分離了兩個值。只需將它們按原樣分配給字符串,例如使用sprintf()或類似的函數。 – 2010-06-24 01:55:39
@Remy我會希望能夠工作,但是在長整型和字符串之間進行轉換失敗。這是爲什麼? – BSchlinker 2010-06-24 02:15:54
,因爲不像Perl這樣的語言,C++在非相似數據類型之間沒有內置轉換。在最壞的情況下,你必須使用庫(最好)或者自己推出。爲了安全,@Remy通常更喜歡'snprintf'。我建議'stringstream',除非分析表明'snprintf'方法的一個可測量的好處。 – 2010-06-24 13:20:24