问题标签 [memory-pool]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c++ - 使用 boost singleton_pool 的自定义分配比默认值慢
我为 MyOrder 类编写了自定义运算符 new 和 operator delete。我正在使用 boost::singleton 池分配内存。这是测试性能的程序,
我使用 -O2 标志编译了上述程序,并在我的 Macbook 上运行 2.26 GHz Intel Core 2 Duo,耗时 0.16 秒。然后我注释掉我声明和定义自定义运算符 new 和 operator delete 的行,使用 -O2 标志重新编译并在同一台机器上运行,耗时 0.13 秒。
使用 singleton_pool 为相同大小的对象分配和释放内存应该会加快速度。为什么让它变慢?还是创建池的开销抵消了在这个小程序中获得的性能优势?
更新:
我用一个 int 和一个 double 替换了两个 std::string 变量,这次在 3.0 GHZ AMD Phenom(tm) II X4 945 处理器上运行了两个程序,每个程序进行了 100000000 次(即之前的 1000 次)迭代。使用自定义内存分配的一项需要 3.2 秒,而使用默认内存分配的一项需要 8.26 秒。所以这次自定义内存分配获胜。
c - 在 C 程序中处理大数据
我正在开发一个在数据库上运行查询的项目,结果大于内存大小。我听说过内存池库,但我不确定它是否是解决此问题的最佳方法。
内存池库是否支持从磁盘写入和读取(作为需要多次解析的查询的结果)。还有其他一些方法可以实现这一目标吗?
PS
我正在使用 MySQL 数据库及其 C API 来访问数据库。
编辑:这是一个例子:
假设我有五个表,每个表都有一百万行。我想找出一张表与另一张表的相似程度,因此我为每个表创建了一个布隆过滤器,然后根据其余四个表中的数据检查每个过滤器。
c++ - 如何在 cuda 上创建全局可访问的变量?
这是一个非常复杂的问题,而且我不是以英语为母语的人,所以如果您有足够的耐心阅读我的问题,我将不胜感激。
由于 Cuda 实际上是在两台计算机上运行,因此当您在设备上时,指向主机的内存是无效的,这意味着如果结构(或对象)具有指针成员,则无法将它们复制到设备。
我尝试制作以下系统来解决此问题:
- 使用整数而不是指针。整数是内存池中的偏移量。整数被包装在一个类中(重载“->”和“*”),使其看起来像一个指针。
- 内存池对象管理着一个连续的对象数组,可以很容易地转移到 Cuda 设备上。池的内容在主机和设备之间同步,因此整数偏移量在两侧具有相同的含义。
为了方便使用偏移量,它应该被包裹。在主机端,包装器如下所示:
我们可以看到,指针类需要全局访问内存池。这通常通过将内存池设置为单例来实现。但是,Cuda 不允许静态成员,并且它将 __device__ 变量限制为文件范围。如何解决这些限制?或者我应该试试 OpenCL?
c# - 具有不同大小的对象的内存池 - C#
您是否有一些解决方案,如何使用对象制作对象池(内存池)而不是可以包含不同大小的不同数据?因此,如果我在内存池中请求具有一定大小的对象,它会返回给我一些分配的内存块,其大小与我的请求最接近。它应该用C#编写。谢谢,因为我真的不完全知道,这个和最佳算法的最佳集合是什么。在 C++ 中有一些解决方案,但 C# 没有内存池。
c - 增长(和缩小)内存池
假设,出于问题的目的,我们有一个内存池,最初分配了n个块。但是,当达到容量时,池想要增长并变成原来的两倍(2n)。
现在这个调整大小操作可以realloc
在 C 中完成,但是函数本身可能会返回一个指向不同内存的指针(其中复制了旧数据)。
这意味着内存池分配器返回的指针可能不再有效(因为内存可能已被移动)。
什么是克服这个问题的好方法?或者甚至有可能吗?
c++ - 内存池删除问题
需要一些关于我的内存池的帮助。我已经准备好一切并正常工作,但是“删除”分配的内存会产生问题。基本上,即使我静态分配其动态对象被池化的类的对象,在销毁时它也会调用它的析构函数,它当然会尝试释放该内存,就好像它是从池中分配的一样,然后一切都死了。有什么办法可以解决这个问题,而不必在删除中放入糟糕的检查逻辑,从而减慢删除速度?
c++ - 我可以只使用固定数组而不是内存池吗?
我不能在应用程序开始时为每个对象分配巨大的数组并使用它们,而不是创建内存池系统,在极端情况下,某些对象确实需要比数组更多的实例,数组只会加倍或四倍大小,所以它永远不会再达到最大大小。我需要速度而不是内存,所以我认为这是一个公平的权衡?
memory-pool - 可变大小缓冲区的内存池使用情况(boost :: pool)?
我当前项目的瓶颈是堆分配......分析表明一个关键线程在new
操作员中花费的时间大约为 50%。
应用程序不能在这里使用堆栈内存,需要分配大量的一个中央作业结构——自定义作业/缓冲区实现:小而短,但大小可变。该对象本身就是堆内存std::shared_ptr
/std::weak_ptr
对象,并带有经典的 C-Array ( char*
) 有效负载。
根据不同部分的运行时配置和工作负载,可能会创建 300k-500k 对象并同时使用(但这通常不会发生)。由于它的 x64 应用程序内存碎片并不是什么大问题(但当它也针对 x86 时可能会出现)。
为了提高速度和数据包吞吐量,并在未来节省内存碎片,我正在考虑使用一些内存管理池,这导致我使用boost::pool
.
几乎所有示例都使用固定大小的对象......但我不确定如何处理可变长度的有效负载?可以使用 boost::pool 创建像这样的简化对象,但我不确定如何处理有效负载?它完全可以使用
/li>boost:pool
吗?通常,当对 shared_ptr 的所有引用都超出范围时,对象会被销毁,我不想将 shared-ptr 更改回 c-ptr。对象的延迟销毁也应该可以提高性能,并且从我读到的内容应该可以更好地使用 boost:pool。我还没有发现池是否支持与 smart_ptr 的交互?另一种但古怪的方法是在创建时将对 shared_ptr 的引用与池一起保存并以块的形式释放它们。
有没有人有这两者的经验?boost:pool 使用可变大小的对象和智能指针交互?
谢谢!
c++ - 待定 tbb::memory_pool> 如何正确使用?
我有疑问。
对于 tbb::memory_pool< tbb::scalable_allocator > shared_memory_pool_;
如果这是在主线程中实例化的。然后,我在工作线程中调用了 shared_memory_pool_.malloc(sizeof(my_class)) 。tbb 会从主堆中分配该大小的内存,还是会从线程“域”中分配它,以便仍然避免由正常 malloc() 引起的锁争用?
c++ - C++11内存池设计模式?
我有一个包含一个处理阶段的程序,该阶段需要使用来自多态类型树的一堆不同的对象实例(全部在堆上分配),所有这些最终都派生自一个公共基类。
由于实例可能周期性地相互引用,并且没有明确的所有者,我想分配它们new
,用原始指针处理它们,并将它们留在内存中以供阶段(即使它们变得未引用),然后在阶段之后在使用这些实例的程序中,我想一次将它们全部删除。
我认为如何构造它如下:
除了注意所有 B 实例都分配有新的,并且在内存池被清除后没有人使用指向它们的任何指针之外,这种实现是否存在问题?
具体来说,我担心在派生类构造函数完成之前,this
指针用于在基类构造函数中构造 a 。std::unique_ptr
这会导致未定义的行为吗?如果是这样,有解决方法吗?