首页 » 算法技术手册 » 算法技术手册全文在线阅读

《算法技术手册》花絮

关灯直达底部

已知使用红黑树的效率,原生malloc的实现可能会使用这个结构吗?毕竟,内存分配在某种程序上必须维护分配的区域集合,以使得这些区域将来能够被安全地释放。同样,注意到上述程序每次请求32字节的内存分配,那么每次请求的内存大小是否会影响malloc和free请求的性能?为了研究一下malloc的行为,我们又进行了一系列的试验。首先,我们记下分配4096个内存块的时间,内存块的大小n从1字节取到2048字节。然后我们看看释放相同大小的内存需要多久,不过将才需三种策略来释放。

freeUp

按照分配的顺序释放,和程序C类似。

freeDown

按照分配的顺序逆序释放。

freeScattered

一次性释放所有内存。

对于每个n的值,我们进行100次试验,并且去掉最好的和最坏的成绩。图1-3显示了剩下98次试验的平均结果。正如我们所预料的,分配操作的开销与n的增长呈线性关系。令人惊讶的是,释放内存的方式在性能上有比较大的差异。freeUp的性能最好,freeDown比freeUp慢4倍左右。

图 1-3 malloc/free请求的性能分析

经验表明,现在还不能回答是否原生malloc以及free使用了二叉树(无论是否平衡!)来记录信息。为什么内存释放的顺序会引起性能的差异,如果不查看free的源代码,这个问题没有一个简单的解释。

我们给出这个例子是有两个目的。第一,内存分配以及释放背后的算法是惊人的复杂,这些算法也高度依赖于操作系统(也就是复杂的计算机)的特性。我们在整本书中将会看到,不同的算法都有他们自己最佳使用的情况。开发者能够根据问题的特殊信息使用相应的算法来改善性能。第二,我们在整本书中描述了不同的算法,并且解释了为什么一个算法会比另外一个算法表现更好。我们还是坚持使用数学来解释这一切。