1

我试图将这两个组件从 timeval 结构中拉出来并将它们放入字符串中。

我对此不太走运。我尝试先转换并转换为长字符串,然后再转换为字符串。我需要最有效的方法来做到这一点。

有任何想法吗?我不想先转换为另一个数据结构(本地时间等)。我需要原始状态的秒和微秒。

编辑:我知道 stringstream 是这里的一个选项——我只是不确定它的效率如何。这里的每一微秒都很重要,所以我正在寻找最快的实现。

4

3 回答 3

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();

相当快速、可读、安全和标准。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();
}
于 2010-06-24T02:06:56.040 回答
0

除非我在这里遗漏了一些东西,否则你基本上想以最快的方式将整数转换为字符串。如果是这样,请查看 Matthew Wilson 在 DDJ 中的系列文章,然后选择:

灵活的 C++ #1:高效的整数到字符串的转换

灵活的 C++ #2:高效的整数到字符串的转换

灵活的 C++ #3:高效的整数到字符串的转换

灵活的 C++ #4:高效的整数到字符串的转换

于 2010-06-24T02:09:50.190 回答
0

除非你从分析中得到确凿的证据,否则std::ostringstream我会使用它,因为它是最直接的方法。不要试图过早地优化这些类型的转化。

话虽如此,对于微秒,如果您愿意放弃一块内存,您可以为该字段的每个可能值创建一个包含 1000000 个字符串的数组,并直接索引您需要的字符串。

于 2010-06-24T03:45:11.740 回答