标签: objectpool

BlockingCollection(T)性能

在我公司工作了一段时间,我们使用了一个自行开发的ObjectPool<T>实现,它提供对其内容的阻止访问.它非常简单:a Queue<T>,a ,object锁定,以及在AutoResetEvent添加项目时向"借用"线程发出信号.

该类的肉真的是这两种方法:

public T Borrow() {
    lock (_queueLock) {
        if (_queue.Count > 0)
            return _queue.Dequeue();
    }

    _objectAvailableEvent.WaitOne();

    return Borrow();
}

public void Return(T obj) {
    lock (_queueLock) {
        _queue.Enqueue(obj);
    }

    _objectAvailableEvent.Set();
}
Run Code Online (Sandbox Code Playgroud)

我们一直在使用这个和其他一些集合类而不是那些System.Collections.Concurrent因为我们使用的是.NET 3.5而不是4.0.但最近我们发现,由于我们使用无扩展,我们实际上Concurrent提供给我们的命名空间(在System.Threading.dll).

当然,我认为既然BlockingCollection<T>Concurrent命名空间中的核心类之一,它可能会提供比我或我的队友写的更好的性能.

所以我尝试编写一个非常简单的新实现:

public T Borrow() {
    return _blockingCollection.Take();
}

public void Return(T obj) {
    _blockingCollection.Add(obj);
}
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,根据一些简单的测试(从多个线程借用/返回池几千次),我们的原始实现在性能方面显着优势BlockingCollection<T>.他们似乎都工作正常 ; 只是我们原来的实现似乎要快得多.

我的问题: …

.net collections thread-safety blocking objectpool

22
推荐指数
2
解决办法
1万
查看次数

Flyweight vs对象池模式:什么时候有用?

据我所知,对象池是一个创造性的模式,而flyweight是一种结构模式,但实际上我看不出两者之间有很大差异.有人可以向我解释一下这些差异,以及每种方法在实施中有用吗?

design-patterns objectpool flyweight-pattern

21
推荐指数
2
解决办法
4769
查看次数

如何使Java应用程序内存高效?

如何优化具有大量(数百万)长寿命对象的应用程序的堆大小使用?(大缓存,从数据库加载大量记录)

  • 使用正确的数据类型
    • 避免使用java.lang.String来表示其他数据类型
  • 避免重复的对象
    • 如果预先知道值,请使用枚举
    • 使用对象池
    • String.intern()(好主意?)
  • 加载/保留您需要的对象

我正在寻找通用编程或Java特定的答案.没有时髦的编译器开关.

编辑:

优化POJO的内存表示,它可以在堆中出现数百万次.

用例

  • 在内存中加载一个巨大的csv文件(转换为POJO)
  • 使用hibernate从数据库中检索数百万条记录

简历回复:

  • 使用flyweight模式
  • 复制写
  • 而不是加载具有3个属性的10M对象,拥有3个大小为10M的数组(或其他数据结构)是否更有效?(操作数据可能会很痛苦,但如果你的内存真的很短......)

java memory heap caching objectpool

17
推荐指数
3
解决办法
1万
查看次数

如何避免iOS中的堆碎片

我们的应用程序在运行时会创建大量小对象.它主要归结为Autoreleased NSString和NSNumber对象.由于应用程序被设计为在后台堆运行"24/7",因此碎片化成为一个大问题.

如果没有完整的程序重组,有哪些技术可以避免这种情况.

我在想: - 在最终版本发布后将对象返回池的对象池,但是objets需要是可变的.(NSMuttableString会导致堆碎片吗?)

其他人如何处理这个问题?

编辑:这就是我对内存碎片的怀疑.看看rpages和[vm-pageshortage]

    eIncident Identifier: 81E87769-8E16-4439-AFFA-6D077E01E5ED
CrashReporter Key:   96235931c31c6b92a16f5c1b1e4cb363a3d18a67
Hardware Model:      iPhone4,1
OS Version:          iPhone OS 7.0.4 (11B554a)
Kernel Version:      Darwin Kernel Version 14.0.0: Fri Sep 27 23:00:48 PDT 2013; root:xnu-2423.3.12~1/RELEASE_ARM_S5L8940X
Date:                2013-12-13 22:43:36 -0800
Time since snapshot: 1582 ms

Free pages:                              1105
Active pages:                            3668
Inactive pages:                          2035
Speculative pages:                       46
Throttled pages:                         100120
Purgeable pages:                         0
Wired pages:                             22159
File-backed pages:                       5400
Anonymous pages:                         349
Compressions:                            0
Decompressions:                          0
Compressor Size:                         0
Uncompressed …
Run Code Online (Sandbox Code Playgroud)

objective-c heap-fragmentation objectpool ios

8
推荐指数
1
解决办法
3438
查看次数

用于管理对象池的scala-way

scala管理对象池的首选方法是什么?

我需要创建和删除单线程的大规模对象(不需要同步).在c ++中,我使用了静态对象数组.

什么是在scala中应对它的惯用和有效方法?

scala objectpool

7
推荐指数
1
解决办法
1324
查看次数

要求提升游泳池体验.作为具有预分配的分配器有用吗?

最近我一直在寻找一个池/分配器机制.Boost Pool似乎提供了解决方案,但仍有一些东西,它无法从文档中推断出来.

什么需要分配

  1. 几个小班(约30个字符)
  2. std :: map(我想确保它不会自己执行动态分配器)
  3. 在pugi :: xml中分配
  4. 的std ::字符串

如何控制地址空间以进行分配(或仅限金额)

object_pool似乎提供了分配需求的好方法1)但是它想为分配器设置一个固定的大小来使用.默认情况下它会抓住内存.如果可能的话,我想给它一个可以在其中播放的地址空间.

char * mem_for_class[1024*1024];
boost::object_pool<my_class,mem_for_class> q;
Run Code Online (Sandbox Code Playgroud)

要么:

const int max_no_objs=1024;
boost::object_pool<my_class,max_no_objs> q;
Run Code Online (Sandbox Code Playgroud)

虽然UserAllocator在Boost :: Pool中可用; 它似乎打败了这一点.我担心所需的控制会使它效率太低......而且从头开始会更好.

可以为pool_allocator设置固定区域吗?

问题有点类似于第一个问题.在将boost :: pool_allocator提供给std-type-class(例如map)时,boost pool是否提供了限制分配内存的位置的方法

我的情景

嵌入式linux编程.系统必须继续运行.所以我们不能冒任何内存分段的风险.目前我主要是静态分配(堆栈),还有一些原始的"新".我想要一个分配方案,确保每次程序循环时我使用相同的内存区域.速度/空间很重要,但安全仍然是首要任务.

我希望StackOverflow是值得一提的地方.我试图联系Boost :: Pool"Stephen"的作者,但没有运气.我还没有找到任何特定于Boost的论坛.

c++ boost memory-management allocation objectpool

6
推荐指数
1
解决办法
2254
查看次数

C++ Lock-Free模板化ObjectPool

他们存在吗?

*添加澄清:

是否有任何可用的库实现无(这是线程安全的,可能是实现自旋锁或其他轻量级同步)ObjectPool(http://en.wikipedia.org/wiki/Object_pool_pattern)使用模板用C++语言编写

c++ memory templates lock-free objectpool

5
推荐指数
1
解决办法
5282
查看次数

apache通用对象池有泛型版本吗?

当使用apache common pool时,它可以为我提供Java对象池的良好实现。然而,它们的KeyedPoolableObjectFactory接口不是类型安全的。Java中有没有对象池库可以提供泛型接口供我们创建类型安全的对象池?

java apache-commons objectpool apache-commons-pool

4
推荐指数
1
解决办法
1038
查看次数

澄清"对象池"模式?

我的印象是,a object pool是一种设计模式,用于管理客户端可以请求的一组预分配对象,并返回其中一个对象.然而,似乎boost.poolobject_pool类更多的是用较低级存储器管理不是目标管理.他们为什么选择这个名字,而不是像memory_pool?我是否认为boost的对象池实际上是一个内存池方案?或者它们基本上是一回事?另外,为什么还没有更高级别的对象池模式的标准实现?

c++ objectpool boost-pool

4
推荐指数
1
解决办法
2532
查看次数

何时将对象返回其池

我想在我的C#应用​​程序中使用一个对象池,我知道C#中没有任何引用计数.如果同一个对象可以传递给多个线程,我怎么知道什么时候没有更多对该对象的引用,以便我可以将它返回到对象池?

我想在dispose方法中做到这一点,但是为时已晚,并且由于它被丢弃,所以它无法返回到池中.

c# multithreading garbage-collection objectpool

3
推荐指数
1
解决办法
1470
查看次数

Objectpool与不可变对象

假设您正在使用一个简单的类,并且对象创建并不重:

class Simple {
  public final int data1;
  public final float data2;
  ...
}
Run Code Online (Sandbox Code Playgroud)

您必须不断将简单对象放入队列:

queue.add(new Simple(123,123f,...));
Run Code Online (Sandbox Code Playgroud)

使用Object-Pool并更改Simple-Class可修改类更快吗?我希望不是.

java objectpool

1
推荐指数
1
解决办法
395
查看次数