在我的工作中,我们正在讨论清理大量托管的~50-100MB内存的不同方法.桌面上有两种方法(阅读:两位资深开发人员不能同意)并没有经验其余的团队不确定哪种方法更可取,性能或可维护性.
收集的数据是许多小项目,约30000,其中包含其他项目,所有对象都被管理.这些对象之间有很多引用,包括事件处理程序,但不包括外部对象.我们将这一大组对象和引用称为一个名为blob的实体.
方法#1:确保切断对blob中对象的所有引用,并让GC处理blob和所有连接.
方法#2:在这些对象上实现IDisposable,然后对这些对象调用dispose并设置对Nothing的引用并删除处理程序.
第二种方法背后的理论是因为较长寿命的对象需要更长的时间来清理GC.因此,通过将大型物体切割成更小的一口大小,垃圾收集器将更快地处理它们,从而提高性能.
所以我认为基本的问题是:拆分大量互连对象是否优化了垃圾收集数据,或者最好将它们保持在一起并依靠垃圾收集算法为您处理数据?
我觉得这是一个预优化的案例,但我不知道GC是否足以知道它有什么帮助或阻碍它.
编辑:要强调内存的"blob"不是单个大对象,它是分开分配的许多小对象.
更多背景,以防有用.我们有'泄漏',因为对象没有得到GCed.这两种方法都解决了泄漏问题,但在这一点上,这是一个更合适的辩论.
我和一些同行正在研究游戏(Rigs of Rods)并且正在尝试将OpenCL集成到物理计算中.与此同时,我们正在尝试对数据结构进行一些急需的清理工作.我想我应该说我们正在尝试清理我们的数据结构并注意OpenCL的要求.
使用开放CL的一个问题是由于内存空间不同而无法使用指针.从我对OpenCL的了解很少,将所有数据复制到GPU上然后执行计算,指针值将被复制,但地址不会与预期的地址相对应.
有问题的数据集中在一个数组中,当对象需要该数据时,它们使用指向所需对象的指针,或存储数组索引.
解决OpenCL的一个解决方案是使用数组索引而不是指针.这导致硬耦合,可能导致后来的头痛.作为一种解决方案,我有想法根据起始地址和当前地址计算数组索引.这当然只适用于连续数组.
我写了一个示例应用程序来测试它,它工作得很好,有些人也在不同的平台上验证它.
#include <iostream>
typedef struct beam_t
{
unsigned int item;
} beam_t;
#define GLOBAL_STATIC_ASSERT(expr, msg) \
extern char STATIC_ASSERTION__##msg[1]; \
extern char STATIC_ASSERTION__##msg[(expr)?1:2]
#ifdef __amd64
typedef unsigned long pointer_int;
#else
typedef unsigned int pointer_int;
#endif
GLOBAL_STATIC_ASSERT(sizeof(pointer_int) == sizeof(pointer_int*), integer_size);
#define MAX_BEAM 5
int main ()
{
beam_t beams[MAX_BEAM];
beam_t* beam_start = &beams[0];
beam_t* beam_ptr = NULL;
std::cout << "beams: " << &beams << "\n";
for( pointer_int i = 0; i < MAX_BEAM; ++i ) …Run Code Online (Sandbox Code Playgroud)