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

C++ 如何重载new/stl以使未知对象更快?,c++,optimization,memory,profiling,new-operator,C++,Optimization,Memory,Profiling,New Operator,在我的问题中,我有一个问题,就是“new”占我运行时的很大一部分。问题是 我不得不在许多不同的类/结构上大量使用new关键字(我有超过200个这样的类/结构及其设计)。我使用了很多stl对象、迭代器和字符串。我使用strdup和其他分配(或免费)函数 我有一个函数调用次数超过200万次。它所做的只是创建stl迭代器,它占用了超过20%的时间(然而,据我记忆,stl优化得非常好,调试使其速度变慢) 但请记住,我需要分配和释放这些迭代器>200万次,以及其他经常调用的函数。如何优化新的和malloc

在我的问题中,我有一个问题,就是“new”占我运行时的很大一部分。问题是

我不得不在许多不同的类/结构上大量使用new关键字(我有超过200个这样的类/结构及其设计)。我使用了很多stl对象、迭代器和字符串。我使用strdup和其他分配(或免费)函数

我有一个函数调用次数超过200万次。它所做的只是创建stl迭代器,它占用了超过20%的时间(然而,据我记忆,stl优化得非常好,调试使其速度变慢)

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


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

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


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

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


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

您无法使
malloc
更快。您可能可以更快地创建
新的
,但我敢打赌,您可以找到一些方法,不必过多地调用它们

找到任何多余调用的一种方法是仔细阅读代码寻找它们,但这样做速度慢且容易出错,而且它们并不总是可见的

找到它们的一个简单而简单的方法是。 注意,您实际上不需要测量任何东西。如果发生的事情占用了大部分时间,这就是你在每次暂停时看到它的概率,目标是找到它。 你确实得到了一个粗略的测量,但这只是发现问题的副产品


这是在一系列阶段中完成的,导致了较大的加速系数。

您无法使
malloc
更快。您可能可以更快地创建
新的
,但我敢打赌,您可以找到一些方法,不必过多地调用它们

找到任何多余调用的一种方法是仔细阅读代码寻找它们,但这样做速度慢且容易出错,而且它们并不总是可见的

找到它们的一个简单而简单的方法是。 注意,您实际上不需要测量任何东西。如果发生的事情占用了大部分时间,这就是你在每次暂停时看到它的概率,目标是找到它。 你确实得到了一个粗略的测量,但这只是发现问题的副产品


这是在一系列阶段中完成的,导致了较大的加速系数。

您使用的编译器是什么版本?“做某事的最快方法是根本不做”。为什么要分配200万个项目?其中一些问题可以避免吗?如果您对一种类型的对象有特定的瓶颈,池分配器可能会有所帮助。尝试编写一个比编译器提供的更快的通用分配器是非常乐观的。您使用的编译器的版本是什么?“做某事的最快方法是根本不做”。为什么要分配200万个项目?其中一些问题可以避免吗?如果您对一种类型的对象有特定的瓶颈,池分配器可能会有所帮助。尝试编写一个比编译器提供的分配器更快的通用分配器是非常乐观的。Boost具有标准兼容的池分配器,可以直接插入STL容器:+1,
new
,在STL中,这只意味着它将委托给用户指定的分配器。我有一个程序,在这个程序中,检查分配器的结果是否为零实际上会产生可测量的影响!Boost具有标准兼容的池分配器,可以直接插入STL容器:+1,
new
在STL中仅表示它将委托给用户指定的分配器。我有一个程序,在这个程序中,检查分配器的结果是否为零实际上会产生可测量的影响!实际上,我正在解析生成的文本文件。里面的每把钥匙我都需要新的。它有8mb的文本。。。我认为有超过100万个键,更不用说值了。有很多电话。然而事实证明,我只调用了malloc 3次(这是一个lib,不是我自己的代码),我的新代码是>1Mill,而strdup几乎是一个malloc。我通过一次分配一个大数据块并删除簿记(因为除非我删除所有内容,否则我不需要删除任何内容)-编辑-我这样做的速度提高了20%以上。但是我的strdup不返回char*而是我自己的有效字符串obj@acidzombie24当前位置我只是在猜测,因为我不知道你想做什么,但每一条信息都有一个生命周期,从获得到需要,在这段时间之间只需要存储。文件是如何生成的?您需要存储钥匙多长时间?听起来大阿洛克很聪明。什么使字符串obj更有效?这些都是我会遇到的设计问题,但随机暂停会确定问题的位置,所以你不会优化不需要的东西。实际上我也做了随机暂停。这是我用过的一个重载库,新的和标准的。现在它只去了那个图书馆。好。。。我的字符串obj是
struct MyString{int len;char sz[0]}
并确保将ptr与4字节对齐(我可以将len更改为2,但4是f)