计算尺寸等级

Posted

技术标签:

【中文标题】计算尺寸等级【英文标题】:Calculating size class 【发布时间】:2021-12-14 23:41:32 【问题描述】:

高性能 malloc 实现通常会实现分离的空闲列表,也就是说,每个更常见(较小)的大小都有自己单独的空闲列表。

第一次尝试可能会说,低于某个阈值,大小等级只是大小除以 8,四舍五入。但是实际的实现有更多的细微差别,将识别的大小类安排在类似指数曲线的东西上(但比简单地在每一步加倍更温和),例如http://jemalloc.net/jemalloc.3.html

我正在尝试弄清楚如何在某些此类曲线上将尺寸转换为尺寸等级。现在,原则上这并不难;有几种方法可以做到这一点。但是要达到加速普通案例的预期目标,它确实需要快速,最好只有几条指令。

进行这种转换的最快方法是什么?

【问题讨论】:

【参考方案1】:

假设您要使用两种尺寸和一半尺寸的所有力量,即 8、12、16、24、32、48、64 等...... 4096。

检查该值是否小于或等于 4096,我已任意选择该值作为此示例可分配的最高值。

获取结构的大小,然后使用最高设置位乘以 2,如果还设置了下一位并且您在大小列表中获得索引,则加 1 如果值高于两位会给。应该是5-6条ASM指令

所以 26 是 16+8+2 位是 4,3,1 4*2 + 1 + 1 所以选择第 10 个索引用于 32 字节列表。

您的系统可能需要一些最小分配大小。

此外,如果您进行大量分配,请考虑使用一些专用于您的程序的池分配器,并从系统分配器中备份。

【讨论】:

【参考方案2】:

在黑暗时代,当我曾经担心这些事情时,我只是从最小的开始迭代所有可能的尺寸。

这实际上很有意义,因为分配内存强烈意味着实际分配之外的工作——比如初始化和使用该内存——这与分配大小成正比。除了最小的分配之外,这种开销将淹没您选择大小类别所花费的任何费用。

只有小的真正需要快速。

【讨论】:

以上是关于计算尺寸等级的主要内容,如果未能解决你的问题,请参考以下文章

根据尺寸等级更改约束的乘数

iOS:尺寸等级不会因不同尺寸而改变

机加尺寸精度等级有多少级?车床加工能达到啥精度等级?怎样确定一个零件的加工工时?

手机屏幕密度等级和屏幕逻辑尺寸

UITableViewCell 动态高度不适用于尺寸类

如何覆盖尺寸等级?