1

2つのコンポーネントをtimeval構造体から引き出して、文字列に配置しようとしています。

私はこれであまり運がありません。私は最初に長いものに、次に文字列にキャストして変換しようとしました。これを行うための最も効率的な方法が必要です。

何か案は?最初に別のデータ構造(現地時間など)に変換したくありません。元の状態の秒とマイクロ秒が必要です。

編集:私はstringstreamがここでのオプションであることを知っています-それがどれほど効率的かはわかりません。ここではマイクロ秒ごとが重要なので、最速の実装を探しています。

4

3 に答える 3

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();

適度に速く、読みやすく、安全で標準的です。sprintfcstdioヘッダーからを使用すると、もう少し速度を上げることができる場合があります。(可能な場合はsprintf_sが望ましい)longprintfの変数は明示的にサポートされていませんが、最近の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();
}
于 2010-06-24T02:06:56.040 に答える
0

ここで何かが足りない場合を除いて、基本的には可能な限り最速の方法で整数を文字列に変換する必要があります。もしそうなら、DDJのマシューウィルソンの一連の記事をチェックして、あなたの選択をしてください:

柔軟なC++#1:効率的な整数から文字列への変換

柔軟なC++#2:効率的な整数から文字列への変換

柔軟なC++#3:効率的な整数から文字列への変換

柔軟なC++#4:効率的な整数から文字列への変換

于 2010-06-24T02:09:50.190 に答える
0

遅すぎるプロファイリングからの決定的な証拠がない限りstd::ostringstream、それが最も簡単なアプローチであるため、私はそれを使用します。これらの種類の変換を時期尚早に最適化しようとしないでください。

そうは言っても、マイクロ秒の間、メモリのチャンクを放棄する場合は、そのフィールドの可能な値ごとに1000000文字列の配列を作成し、必要な文字列に直接インデックスを付けることができます。

于 2010-06-24T03:45:11.740 に答える