Boost's lexical_cast должно быть достаточно быстрым.
Edit:
Позвольте мне уточнить. Вот пример его использования:
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();
}