timeval to string (преобразование между двумя)
Я пытаюсь извлечь два компонента из временной структуры и поместить их в строки.
Мне не очень повезло с этим. Я попытался привести и преобразовать сначала в long, а затем в строку. Мне нужен самый эффективный способ сделать это.
Есть идеи? Я НЕ хочу сначала преобразовывать в другую структуру данных (локальное время и т. Д.). Мне нужны секунды и микросекунды в их первоначальном состоянии.
РЕДАКТИРОВАТЬ: Я знаю, что струнный поток здесь вариант - я просто не уверен, насколько это эффективно. Здесь учитывается каждая микросекунда, поэтому я ищу самую быструю реализацию.
3 ответа
Boox 's 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, если доступно) Нет явной поддержки long
переменные в printf, но в наши дни на 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();
}
Если у вас нет убедительных доказательств того, что std::ostringstream
слишком медленный, я бы использовал его, так как это самый простой подход. Не пытайтесь преждевременно оптимизировать такие конверсии.
При этом за микросекунды, если вы готовы отказаться от порции памяти, вы можете создать массив из 1000000 строк для каждого возможного значения этого поля и напрямую проиндексировать нужную вам строку.
Если я не пропустил что-то здесь, вы в основном хотите преобразовать целое число в строки самым быстрым способом. Если это так, ознакомьтесь с серией статей Мэтью Уилсона в DDJ и сделайте свой выбор:
Гибкая C++ #1: эффективное преобразование целых чисел в строки
Гибкий C++ #2: эффективное преобразование целых чисел в строки
Гибкий C++ #3: эффективное преобразование целых чисел в строки
Гибкий C++ #4: эффективное преобразование целых чисел в строки