隐式new和delete运算符查杀性能

时间:2012-05-02 15:22:08

标签: c++ optimization new-operator profiler delete-operator

我正在运行非常困难来分析我的应用程序,它向我显示我的功能花费的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;
  }
}

very sleepy results

我请求原谅static使用它们将在以后删除并放入struct

4 个答案:

答案 0 :(得分:3)

一个注意事项:正在复制 lot 字符串。每个字符串都会调用new来获取内存,delete来释放内存。

如果性能非常高并且您能够保留str的副本,则可能需要使用索引。也就是说,令牌是成对的索引(开始,结束)而不是完整的字符串。这显然更容易出错。

此外,tokenMap在地图中为每个条目分配一个节点,如果您有大量条目,则会有很多节点(因此new创建它们)。您可能希望使用deque,并在完成后对项目进行排序,除非您确实需要map提供的内容(自动重复数据删除)。


Bikesheded版本,删除大多数静态变量(无法帮助自己):

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;
  }
}

答案 1 :(得分:2)

确保您正在测试Release版本,而不是Debug版本。调试版本使用不同版本的newdelete来帮助以牺牲速度为代价来检测内存泄漏,而Debug版本不会进行太多优化(如果有的话)。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

静力学可能是问题所在。你有多少时间调用函数FixParser

每当你调用它时,token_delimtoken_equal对象就会分配调用的方法,如果它们像向量赋值一样实现,那么支持序列的内存将被销毁,然后每次分配调用FixParser函数来分配新条目。