字符串的timeval(在两者之间转换)

时间:2010-06-24 01:45:46

标签: c++ string time casting timeval

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

我没有太多运气。我已经尝试将第一个转换为long,然后转换为字符串。我需要最有效的方法来做到这一点。

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

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

3 个答案:

答案 0 :(得分: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();
}

答案 1 :(得分: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

答案 2 :(得分:0)

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

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