2

プログラム全体の時間の大きな部分 (~20%) を占めるコードのセクションがあるとします。これは、指定された型 (オプション: string、char、short、int、float、unsigneds など) からの変換で構成されます。 ) 文字列に。これを行う簡単な方法は次のようになります。

template<class T>
string toString(T sAttrvalue) {
    stringstream ss;
    ss << T;

    string res=ss.str();

    if(res=="x" || res=="y")
        return "k";

    return res;
}

しかし、パフォーマンスが低すぎます (静的な文字列ストリームを使用し、関数の先頭で ss.str("") を実行することで改善されたとしても)。

それをより速くする方法に関する他のアイデアはありますか?(時間を指定する別の関数引数を使用し、そこから sprintf を使用することについてどう思いますか?)

4

2 に答える 2

3

あなたが与えたコードに加えて、最も一般的なケースを最適化するために使用してみることができtemplate specializationます (これは、たとえば、vector<bool>よりスペース効率の良い方法です)。

例えば:

template<>
string toString<char>(char sAttrValue) {
    ...
}

template<>
string toString<int>(int sAttrValue) {
    ...
}

他の型についても同様で、それぞれがその型に固有の最適化された変換方法を使用します。これらの特殊なテンプレートのいずれにも一致しない型は、既定のstringstream方法にフォールバックします。

于 2013-07-24T15:06:19.560 に答える
3

いくつかのポイント:

  • 正確に測定するには、時間のスナップショットを取得し、関数をループで X 回 (X = 10000 とします) 呼び出してから、再度時間を取得します (「 」を参照clock())。最終時間から初期時間を引き、X で割ります。

    これにより、正確な測定値が得られます。

  • ostringstream はパフォーマンスのために作成されたものではありません。均一で拡張可能なバッファリングされた出力 (バッファリング = 低速) のために作成されています。

    テンプレートをタイプ別に特定し、より高速な代替手段を使用する必要があります。可能であれば、sprintf に切り替えるのではなく、他の代替手段 (itoa、文字列を直接割り当てるなど) を使用してください。

    sprintf を使用する場合は、偏執的に考えてください (戻り値、コーナー ケースなどを確認してください)。

于 2013-07-24T15:35:17.707 に答える