如何重载new/stl以使未知对象更快

How do i overload new/stl to make unknown objects faster?

本文关键字:未知 对象 stl 何重载 重载 new      更新时间:2023-10-16

在我的问题分析中:deque占我运行时的23%,我有一个问题,"new"占我运行时间的很大一部分。问题是

我不得不在许多不同的类/结构上大量使用新关键字(我有超过200个类/结构,而且是经过设计的(。我使用了很多stl对象、迭代器和字符串。我使用strdup和其他分配(或空闲(函数。

我有一个函数被调用了超过200万次。它所做的只是创建stl迭代器,它占用了超过20%的时间(然而,据我所知,stl优化得很好,调试使它慢了很多(。

但请记住,我需要分配和释放这些迭代器>2m次,以及经常调用的其他函数。如何优化new和malloc关键字/函数?特别是对于所有这些类/结构和我没有写的类/结构(stl和其他(

尽管评测显示我(和stl?(使用新关键字的次数比其他任何关键字都多。

通过添加自己的管理层来回收已经分配的内存和对象,或者修改它们的分配器,寻找避免分配/释放的机会。有很多关于STL分配器的文章:

  • http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079
  • http://bmagic.sourceforge.net/memalloc.html
  • http://www.codeproject.com/KB/stl/blockallocator.aspx

我看到过大型多映射代码通过替换默认分配器从不可用的慢变为非常快。

您无法使malloc更快。你也许可以让new更快,但我敢打赌,你可以找到不那么频繁地调用它们的方法。

找到对任何东西的过度调用的一种方法是仔细阅读代码寻找它们,但这很慢,而且容易出错,而且它们并不总是可见的。

找到它们的一个简单而简单的方法是暂停程序几次并查看堆栈。请注意,您实际上不需要测量任何东西。如果发生的事情需要很长一段时间,那就是你在每次暂停时看到它的概率,目标是找到它。你确实得到了一个粗略的测量,但这只是发现问题的副产品。

这里有一个例子,在这个例子中,这是在一系列阶段中完成的,产生了很大的加速因子。