我正在尝试将这两个组件从timeval结构中拉出来并将它们放入字符串中。
我没有太多运气。我已经尝试将第一个转换为long,然后转换为字符串。我需要最有效的方法来做到这一点。
有什么想法吗?我不想先转换到另一个数据结构(本地时间等)。我需要处于原始状态的秒和微秒。
编辑:我知道stringstream是一个选项 - 我只是不确定它的效率如何。每微秒都算在这里,所以我正在寻找最快的实现。
答案 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
答案 2 :(得分:0)
除非您从std::ostringstream
太慢的分析中得到确凿的证据,否则我会使用它,因为这是最直接的方法。不要试图过早地优化这些类型的转换。
话虽如此,如果你愿意放弃一块内存,你可以为该字段的每个可能值创建一个1000000字符串的数组,并直接索引你需要的字符串。