3

次のコードは、をに変換しstd::stringますboost::posix_time::ptime

プロファイリング後、その関数で費やされた時間のほとんど(約90%)が、のメモリの割り当てで無駄になっていることがわかりましたtime_input_facet。私は次のコードを完全には理解していないことを認めなければなりません。特に、なぜそれtime_input_facetを空きメモリに割り当てなければならないのかを理解していません。

using boost::posix_time;

const ptime StringToPtime(const string &zeitstempel, const string &formatstring)
{
    stringstream ss;
    time_input_facet* input_facet = new time_input_facet();
    ss.imbue(locale(ss.getloc(), input_facet));
    input_facet->format(formatstring.c_str());

    ss.str(zeitstempel);
    ptime timestamp;

    ss >> timestamp;
    return timestamp;
}

割り当てを取り除く方法はありますか?

4

1 に答える 1

2

関数内でinput_facetを静的にします。

static time_input_facet *input_facet = new time_input_facet();

これにより、最初の関数呼び出しでのみファセットが構築され、ファセットが再利用されます。ファセットは、同じオブジェクトに対して複数の結果として生じる呼び出しを許可すると思います。

更新:文字列ストリームとロケールの両方を作成する必要もありません。別の関数またはここで静的初期化のいずれかで1回実行するだけで、結果としてストリームを使用できます。

更新2:

const ptime StringToPtime(const string &zeitstempel, const string &formatstring)
{
  static stringstream ss;
  static time_input_facet *input_facet = NULL;
  if (!input_facet)
  {
    input_facet = new time_input_facet(1);
    ss.imbue(locale(locale(), input_facet));
  }

  input_facet->format(formatstring.c_str());

  ss.str(zeitstempel);
  ptime timestamp;

  ss >> timestamp;
  ss.clear();
  return timestamp;
}
于 2012-05-24T07:09:43.197 に答える