我试图将这两个组件从 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();
相当快速、可读、安全和标准。sprintf
通过使用cstdio 标头,您可能会获得更快的速度。(如果可用,最好是 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();
}
除非我在这里遗漏了一些东西,否则你基本上想以最快的方式将整数转换为字符串。如果是这样,请查看 Matthew Wilson 在 DDJ 中的系列文章,然后选择:
除非你从分析中得到确凿的证据,否则std::ostringstream
我会使用它,因为它是最直接的方法。不要试图过早地优化这些类型的转化。
话虽如此,对于微秒,如果您愿意放弃一块内存,您可以为该字段的每个可能值创建一个包含 1000000 个字符串的数组,并直接索引您需要的字符串。