我正试图找到一种将大量字符串映射到int的方法。我使用数组进行了尝试,发现了一种我不理解的行为。当我按字符串索引数组(数组('someStirng'=>1))时,它消耗的内存比字符串(数组(1=>'someString'))消耗的内存少。这是否意味着,最好通过字符串对数组进行索引,并将int作为大量字符串int对的值,或者问题是什么?为什么内存分配差异这么大?
function gen() {
static $characters = '0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
$randomString = '';
for ($i = 0; $i < 8; $i++) {
$randomString .= $characters[rand(0, strlen($characters) - 1)];
}
return $randomString;
}
按字符串索引-返回490 KB
$a = array();
for($x = 0;$x < 100000;$x++){
$a[gen()] = $x;
}
echo (memory_get_usage() / 1024) . ' KB';
按int索引-返回10790.2890625 KB(大约是第一种情况的22倍,但存储的信息数量相同!)
$a = array();
for($x = 0;$x < 100000;$x++){
$a[$x] = gen();
}
echo (memory_get_usage() / 1024) . ' KB';
当我使用您的代码重复您的实验时,整数索引得到18 072 000字节,字符串索引得到16 471 960字节。差异不大,这可归因于对数组键及其值的不同内存管理。
相反,使用memory_get_peak_usage(true)
会产生非常相似的结果。在计算for循环前后的内存使用量差异时,我得到了带整数索引的18 087 936个字节和带字符串索引的16 515 072个字节。
这是一个很小的差异,可以通过数组键和数组值的不同内部内存管理来解释。也许由于数组键仅限于标量,而数组值不限于标量,PHP可以在某个地方进行优化。
在任何情况下,就像@ed heal所说的,无论你想做什么,都要使用最好的数据结构。内存使用可能不是重要的,如果是,PHP可能不是这项工作的工具。
此循环
for ($i = 0; $i < 8; $i++) {
有8次做它的业务
作为这个循环
for($x = 0;$x < 100000;$x++){
多做一点!
现在让我想想问题出在哪里。。。
编辑
只是注意到沙子变了。
使用适合手头任务的任何数据结构。