高性能 malloc 實作通常實作隔離的空閑串列,即每個更常見(較小)的大小都有自己單獨的空閑串列。
對此的第一次嘗試可能會說,低于某個閾值,大小等級只是大小除以 8,四舍五入。但是實際的實作有更多的細微差別,將公認的大小類排列在指數曲線上(但比在每一步簡單地加倍更溫和),例如http://jemalloc.net/jemalloc.3.html
我試圖弄清楚如何在某些這樣的曲線上將尺寸轉換為尺寸等級。現在,原則上這并不困難;有幾種方法可以做到。但是要達到加速普通情況的預期目標,它確實需要很快,最好只有幾條指令。
進行這種轉換的最快方法是什么?
uj5u.com熱心網友回復:
在黑暗時代,當我過去常常擔心這些事情時,我只是從最小的尺寸開始迭代所有可能的尺寸。
這實際上很有意義,因為分配記憶體強烈暗示實際分配之外的作業——比如初始化和使用該記憶體——這與分配大小成正比。在所有分配中,除了最小的分配之外,這種開銷將淹沒您選擇大小類所花費的任何費用。
只有小的真的需要快。
uj5u.com熱心網友回復:
假設您要使用兩個大小的所有冪和大小的一半,即 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 位元組串列選擇的。
您的系統可能需要一些最小分配大小。
此外,如果您進行了大量分配,請考慮使用一些專用于您的程式的池分配器,并從系統分配器進行備份。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/344369.html
下一篇:提高python演算法的速度
