2011-04-07 42 views
0

对于序列化系统,我需要分配缓冲区来写入数据。所需的大小并不是预先知道的,所以基本模式是mallocN字节,如果需要更多,则使用reallocN的大小将足够容纳大多数物体,使重新分配变得非常罕见。什么是适合中型内存分配的大小?

这让我觉得有可能是一个最佳的初始字节数,malloc可以比其他人更容易满足。我猜在接近pagesize的地方,虽然不一定完全如果malloc需要一些家务管理的空间。

现在,我确定这是一个无用的优化,如果它真的很重要,我可以使用一个池,但我很好奇;我不能成为第一个认为给我的程序员,不管是哪一个字节块都是最容易分配的,作为开始。有没有办法确定这一点?

接受任何专门适用于现代GCC/G ++和/或Linux的答案。

+0

优化本身并不是无用的,但也许你应该等待优化,直到有一个具体的需求呢?或者你的手上有太多时间? :-) – 2011-04-07 01:16:59

+0

@Anders:如果我花几个小时来研究这个,那可能是在浪费时间。看到我是否好奇可以在SO上得到答案似乎对我来说时间有效:) – porgarmingduod 2011-04-07 01:23:04

+1

@Anders K:根据我的经验,大多数有关优化问题的海报需要关于该做什么而不是不该做什么的输入。 – 2011-04-25 15:29:32

回答

-1

它在类似情况下完成的方式是为第一个malloc分配一些重要但不是太大的块,这将适用于大多数情况(如您所述),并且每个后续调用将请求大小加倍。

所以,如果一开始你分配100,下次你会realloc 200,然后400,800等等。通过这种方式,每次执行后,重新分配的机会就会降低。

如果内存为我服务,那么这就是std::vector的行为。

编辑

最佳初始分配的大小将是一个将覆盖大部分的情况下在一边,但不会对对方太浪费之后。如果你的平均情况是50,但可以达到500,那么你需要先分配50,然后每隔一个realloc分配两倍或三倍(或倍数10),这样你可以在1-3 realloc s中分配500,但任何进一步的realloc将是不太可能和罕见的。所以它基本上取决于您的使用模式。

+0

我非常了解这种方法。它根本没有解决这个问题,这完全与确定__initial size__有关。 – porgarmingduod 2011-04-07 01:15:24

+0

是的,为此增加了两分钱,但你没有提到你为什么要寻找优化,所以我猜这是因为你不想浪费记忆。还有什么你想要优化? – littleadv 2011-04-07 01:19:52

+0

问题是关于能否最有效地处理__malloc可以最有效地处理__。使用模式,即我实际需要的大小,不是问题的一部分,除了我提示'pagesize'可能会很好。 – porgarmingduod 2011-04-07 01:21:20

2

从阅读this维基页面看来,你的答案会有很大的不同,取决于你使用的malloc和操作系统的实现。在OpenBSD的malloc上读取一点特别有趣。这听起来像你也想看看mmap,但是我猜想我会说分配默认的pagesize(4096?)会被优化。

+0

其实,我很想知道在这个上做的实验的结果。也许尝试分配4095字节x次,看看你的时间平均值是什么样子,然后用4096字节,然后4097字节做同样的实验。您希望确保您的页面大小确实设置为4kb,并且可能希望在每次测试之前重新启动计算机。任何接受者? :-) – Adam 2011-04-07 02:45:37

1

我对你的建议是找到一个合适的malloc/realloc/free源代码,这样你就可以在同一个源模块(并使用相同的内存结构)中实现你自己的“malloc_first”并返回大于或等于传递的minimum_bytes参数的第一个可用块。如果0通过,你会得到第一个阻塞期。

适当的声明可能是

void *malloc_first (size_t minimum_bytes, size_t *actual_bytes); 

如何可行的这样的承诺是,我不知道。我建议你在所有源代码都可用的情况下尝试使用Linux。

+0

是的,我想。但在这一点上,我可能会更好,只需使用内存池(专业实现已经可用)和一个简单的分配策略就可以了。但是你的“控制自己”的一般建议可能是现实。 – porgarmingduod 2011-05-04 14:33:59

相关问题