Linux分配指针值和性能
我对linux上的分配(Redhat5和6,在intel/amd cpu上运行是相同的)及其相关性能感到有点困惑。 下面是分配和释放双数组的简单代码,只需查看地址值。按1 Kb的块从0分配到256MbLinux分配指针值和性能,linux,performance,pointers,memory-management,malloc,Linux,Performance,Pointers,Memory Management,Malloc,我对linux上的分配(Redhat5和6,在intel/amd cpu上运行是相同的)及其相关性能感到有点困惑。 下面是分配和释放双数组的简单代码,只需查看地址值。按1 Kb的块从0分配到256Mb #include <stdio.h> #include <stdlib.h> int main( int argc , char ** argv ) { #define ASZ 33661057 size_t len ; double * ptr ;
#include <stdio.h>
#include <stdlib.h>
int main( int argc , char ** argv )
{
#define ASZ 33661057
size_t len ;
double * ptr ;
for ( len = 128 ; len < ASZ ; len += 128 )
{
ptr = malloc( len ) ;
printf( "ptr addr : %p len %12ld %8.1f Kb\n" , ptr , len , ( (double ) len ) * 8. / 1024. ) ;
free( ptr ) ;
}
return( 0 ) ;
}
我不明白以下几点:
- 为什么在某些尺寸下,地址值会发生变化,并且更大
- 为什么在分配大小超过256MB时,总是出现大地址
- 为什么具有较小地址的阵列能够更快地访问其数据? 快20%
提前感谢您的帮助。请阅读有关虚拟内存和延迟分配的内容。
ptr addr : 0xadb010 len 128 1.0 Kb
ptr addr : 0xadb010 len 256 2.0 Kb
ptr addr : 0xadb010 len 135040 1055.0 Kb
ptr addr : 0x2ab1eef4c010 len 135168 1056.0 Kb
ptr addr : 0xadb010 len 135296 1057.0 Kb
ptr addr : 0xadb010 len 270208 2111.0 Kb
ptr addr : 0x2ab1eef4c010 len 270336 2112.0 Kb
ptr addr : 0xadb010 len 270464 2113.0 Kb
ptr addr : 0xadb010 len 405376 3167.0 Kb
ptr addr : 0x2ab1eef4c010 len 405504 3168.0 Kb
ptr addr : 0xadb010 len 405632 3169.0 Kb
ptr addr : 0xadb010 len 33656576 262942.0 Kb
ptr addr : 0xadb010 len 33656704 262943.0 Kb
ptr addr : 0x2ab1eef4c010 len 33656832 262944.0 Kb
ptr addr : 0x2ab1eef4c010 len 33656960 262945.0 Kb