2

我非常困倦地分析我的应用程序,它告诉我,我的函数花费的时间分别有 25% 和 23% 用于新建和删除。我不明白这是在哪里发生的。所以有人可以告诉我这在我的代码中发生在哪里。

inline FixParser(fixmessage& tokenMap, const std::string& str) {
  static seperator sep_delim("\x01");
  static seperator sep_equal("=");
  static std::string error("ERROR: ");
  static FixKey fix_Key;
  static tokenizer token_equal(error);
  static tokenizer token_delim(error);
  static tokenizer::iterator itr;
  token_delim.assign(str, sep_delim);
  int key;
  try {
    for(tokenizer::iterator it = token_delim.begin(); 
        it != token_delim.end(); ++it) {
      token_equal.assign(*it, sep_equal);
      itr = token_equal.begin();
      key = boost::lexical_cast<int>(*itr);
      if(fix_Key.keys.find(key) == fix_Key.keys.end()) continue;
      ++itr;
      const std::string& value(*itr);
      tokenMap.insert(std::pair<int, std::string>(key, value));
    }
  } catch(boost::bad_lexical_cast &) {
    std::cerr << error << str << std::endl;
    return;
  }
}

非常困的结果

我请求原谅static它们的使用,稍后将被删除并放置在struct.

4

4 回答 4

3

注意:有很多字符串被复制。每个字符串都会导致调用来new获取内存并delete释放它。

如果性能很重要,并且您有能力保留副本str,那么您可能希望使用索引。也就是说,让标记成为索引对(开始、结束)而不是完整的字符串。这显然更容易出错。

此外,tokenMap在映射中为每个条目分配一个节点,如果您有很多条目,则会有很多节点(因此new要创建它们)。您可能希望使用 adeque代替,并在完成后对项目进行排序,除非您真的需要map提供什么(自动重复数据删除)。


Bikeshed 版本,删除了大多数静态变量(我忍不住):

inline FixParser(fixmessage& tokenMap, const std::string& str) {
  static seperator sep_delim("\x01");
  static seperator sep_equal("=");
  static FixKey const fix_Key;

  try {
    tokenizer token_delim(str, sep_delim);

    // avoid computing token_delim.end() at each iteration
    for(tokenizer::iterator it = token_delim.begin(), end = token_delim.end(); 
        it != end; ++it)
    {
      tokenizer token_equal(*it, sep_equal);

      tokenizer::iterator itr = token_equal.begin();
      int const key = boost::lexical_cast<int>(*itr);
      if(fix_Key.keys.find(key) == fix_Key.keys.end()) continue;

      ++itr;
      tokenMap.insert(std::make_pair(key, *itr));
    }
  } catch(boost::bad_lexical_cast &) {
    std::cerr << error << str << std::endl;
    return;
  }
}
于 2012-05-02T15:41:09.637 回答
2

确保您正在测试 Release 版本,而不是 Debug 版本。Debug 构建使用不同版本的newanddelete来帮助检测内存泄漏,但会牺牲速度,而 Debug 构建并没有进行太多优化(如果有的话)。

于 2012-05-02T17:45:24.963 回答
0

静力学可能是问题所在。您调用该函数多少次FixParser

每次调用它时token_delimtoken_equal对象都会调用分配方法,如果这些方法像向量分配一样实现,那么支持序列的内存将被销毁,然后在每次FixParser调用函数以分配新条目时分配。

于 2012-05-02T16:09:53.127 回答
0

我会看看boost::lexical_cast。它最简单的形式只是使用流。它可能做了很多分配。

于 2012-05-02T15:40:48.690 回答