malloc vs mmap性能

时间:2015-01-22 20:06:14

标签: c memory-management malloc mmap

我使用mmap对写入了12800万个内存到使用malloc分配的内存和映射的内存文件(由磁盘上的文件支持)进行了性能测试...我原本预计结果会有点类似于它'我的理解是,当写入映射的内存文件时,数据最初写入内存,pdflush在后台写入磁盘(可以配置的频率)。使用malloc,写入128M整数需要0.55秒; mmap花了1.9秒。

所以我的问题是:为什么不同。我的首字母缩写是pdflush挤满了总线,或者当pdflush正在访问内存时,它阻止了写入...但是,第二次运行mmap版本会产生.52秒的结果(由于缓存)导致我相信mmap背后的每个页面都没有被分配,直到它被写入(尽管通过调用mmap保留它)...我也理解,malloc生成的内存直到第一次写入才真正分配。 .could最初的区别是因为在malloc初始写入内存后,整个块被分配并使用mmap,每次写入新页面时,os必须先分配它?

更新:

os :CentOS Linux 7.0.1406版(核心版)内核:3.10.0-123.el7.x86_64 gcc :4.8.2

CODE:

int* pint = malloc(128000000 * sizeof(int));
int* pint_copy = pint;

clock_t start = clock();

int i;
for(i = 0; i < 128000000; ++i)
{
    *pint++ = i;
}   

clock_t end = clock();

double cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("%f\n", cpu_time_used);

free(pint_copy);

VS

int fd = open("db", O_RDWR | O_CREAT, 0666);
const size_t region_size = ((512000000 / sysconf(_SC_PAGE_SIZE)) + 1) * sysconf(_SC_PAGE_SIZE); 

int return_code = ftruncate(fd, region_size);

if (return_code < 0)
    printf("mapped memory file could not be truncated: %u\n", return_code);

int* pint = mmap(NULL, region_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, 0);
int* pint_copy = pint;
close(fd);  

clock_t start = clock();

int i;
for(i = 0; i < 128000000; ++i)
{
    *pint++ = i;
}   

clock_t end = clock();

double cpu_time_used = ((double) (end - start)) / CLOCKS_PER_SEC;
printf("%f\n", cpu_time_used);

fgetc(stdin);

munmap(pint_copy, region_size);

中加入:

int z = 512;
while(z < 128000000)
{
    pint[z] = 0;

    z += 1024;
}

在:

  clock_t start = clock();     

两次试验产生0.37秒,让我相信&#34;触摸&#34;每个页面都会导致操作系统分配物理内存(对于mmap和malloc)...也可能部分是因为&#34;触摸&#34;页面将一些内存移动到缓存...有没有人知道如果在重写内存期间(长时间),pdflush会阻止或减慢内存写入?

2 个答案:

答案 0 :(得分:1)

是的,你是对的。使用mmap获取的网页在您尝试访问之前不会填写。您无法保证这一点,但通常操作系统使用write-back(此增益不会受到惩罚)和demand-paging(您必须支付第一次访问权限)。

答案 1 :(得分:1)

我不知道答案,但这对我来说就像你在比较苹果和橘子一样。

也就是说,一方面你正在写(malloc&#39; d)记忆,另一方面你要写入记忆到(mmap&#39; d)光盘。我希望第二个会导致设备I / O活动,比第一个慢一个数量级,不会产生任何I / O.