timeval to string (преобразование между двумя) - PullRequest
0 голосов
/ 24 июня 2010

Я пытаюсь извлечь два компонента из временной структуры и поместить их в строки.

Мне не очень повезло с этим.Я попытался привести и преобразовать сначала в long, а затем в строку.Мне нужен самый эффективный способ сделать это.

Есть идеи?Я НЕ хочу сначала преобразовывать в другую структуру данных (локальное время и т. Д.).Мне нужны секунды и микросекунды в их исходном состоянии.

РЕДАКТИРОВАТЬ: я знаю, что здесь есть вариант струнного потока - я просто не уверен, насколько это эффективно.Здесь учитывается каждая микросекунда, поэтому я ищу самую быструю реализацию.

Ответы [ 3 ]

1 голос
/ 24 июня 2010

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();
}
0 голосов
/ 24 июня 2010

Если у вас нет убедительных доказательств того, что std::ostringstream слишком медленный, я бы использовал его, так как это самый простой подход. Не пытайтесь преждевременно оптимизировать эти виды конверсий.

При этом за микросекунды, если вы готовы отказаться от порции памяти, вы можете создать массив из 1000000 строк для каждого возможного значения этого поля и напрямую проиндексировать нужную вам строку.

0 голосов
/ 24 июня 2010

Если я не пропустил что-то здесь, вы в основном хотите преобразовать целое число в строки как можно быстрее. Если это так, ознакомьтесь с серией статей Мэтью Уилсона в DDJ и выберите:

Гибкий C ++ # 1: эффективное преобразование целых чисел в строки

Гибкий C ++ # 2: эффективное преобразование целых чисел в строки

Гибкий C ++ # 3: Эффективное преобразование целых чисел в строки

Гибкий C ++ # 4: эффективное преобразование целых чисел в строки

...