某些对 "calloc" 的调用速度快得令人怀疑
Some calls to "calloc" are suspiciously fast
我正在使用“Perf”(Linux、gcc)进行基准测试。
分配内存时:
point_1 = calloc (100000000, 16); //this takes nearly 1 second and perf find 27M transfers from RAM->CACHE and 1M from CACHE->RAM
没关系。
但是当尝试分配两个数组时:
point_1 = calloc (100000000, 16);
point_2 = calloc (100000000, 16);
//again, program takes nearly 1 second, 27M transfers RAM-CACAHE, 1M CACHE->RAM
看起来,第二个“calloc”(以及所有后续)的行为类似于“malloc”。我正在使用“gcc 版本 4.9.2 (Ubuntu 4.9.2-0ubuntu1~12.04)
”。否则程序运行正常。
这样可以吗?
以下是更多测试和结果:
Time for allocating of data structure 1: 0.976468
Perf: R:27M, W:1M
Time for allocating of data structure 1: 0.975402
Time for initialization of data structure 1 to value of 7: 0.296787
Perf: R: 52M, W: 26M
Time for allocating of data structure 1: 0.976034
Time for initialization of data structure 1 to value of 7: 0.313554
Time for allocating of data structure 2: 0.000031 <-- misbehaving
Perf: R: 52M, W:26M
Time for allocating of data structure 1: 0.975403
Time for initialization of data structure 1 to value of 7: 0.313710
Time for allocating of data structure 2: 0.000031 <-- misbehaving
Time for initialization of data structure 2 to value of 7: 0.809855
Perf: R:79M, W: 53M
每个调用都尝试分配 1.6 GB 的内存。我怀疑第二个电话失败了,这可以解释这些症状。检查 calloc()
中的 return 值。
可以确认第二次调用所用的时间要短得多。 Linux 似乎决定推迟一些实际工作。
在我的系统上,第一个 calloc 大约需要 0.7 秒。
如果我随后遍历分配的内存区域,将其设置为非零值,则需要 0.2 秒。总共 0.9 秒。
第二个calloc需要0.0秒,但是设置第二个区域需要0.9秒。总时间相同,但正如 Karoly Horvath 在评论中所写,似乎第二次调用实际上并未创建内存页面,而是在访问内存时将其留给页面错误。
Karoly Horvath 的另一条与此相关问题相关的精彩评论:Why malloc+memset is slower than calloc?
在英特尔酷睿 i7-4790K 上 Ubuntu 14.04.1 LTS 运行 上测试,使用 -O2 和一个自称 "gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2" 的 GCC。 Glibc 版本是 Ubuntu EGLIBC 2.19-0ubuntu6.4.
我正在使用“Perf”(Linux、gcc)进行基准测试。
分配内存时:
point_1 = calloc (100000000, 16); //this takes nearly 1 second and perf find 27M transfers from RAM->CACHE and 1M from CACHE->RAM
没关系。
但是当尝试分配两个数组时:
point_1 = calloc (100000000, 16);
point_2 = calloc (100000000, 16);
//again, program takes nearly 1 second, 27M transfers RAM-CACAHE, 1M CACHE->RAM
看起来,第二个“calloc”(以及所有后续)的行为类似于“malloc”。我正在使用“gcc 版本 4.9.2 (Ubuntu 4.9.2-0ubuntu1~12.04) ”。否则程序运行正常。
这样可以吗?
以下是更多测试和结果:
Time for allocating of data structure 1: 0.976468
Perf: R:27M, W:1M
Time for allocating of data structure 1: 0.975402
Time for initialization of data structure 1 to value of 7: 0.296787
Perf: R: 52M, W: 26M
Time for allocating of data structure 1: 0.976034
Time for initialization of data structure 1 to value of 7: 0.313554
Time for allocating of data structure 2: 0.000031 <-- misbehaving
Perf: R: 52M, W:26M
Time for allocating of data structure 1: 0.975403
Time for initialization of data structure 1 to value of 7: 0.313710
Time for allocating of data structure 2: 0.000031 <-- misbehaving
Time for initialization of data structure 2 to value of 7: 0.809855
Perf: R:79M, W: 53M
每个调用都尝试分配 1.6 GB 的内存。我怀疑第二个电话失败了,这可以解释这些症状。检查 calloc()
中的 return 值。
可以确认第二次调用所用的时间要短得多。 Linux 似乎决定推迟一些实际工作。
在我的系统上,第一个 calloc 大约需要 0.7 秒。 如果我随后遍历分配的内存区域,将其设置为非零值,则需要 0.2 秒。总共 0.9 秒。
第二个calloc需要0.0秒,但是设置第二个区域需要0.9秒。总时间相同,但正如 Karoly Horvath 在评论中所写,似乎第二次调用实际上并未创建内存页面,而是在访问内存时将其留给页面错误。
Karoly Horvath 的另一条与此相关问题相关的精彩评论:Why malloc+memset is slower than calloc?
在英特尔酷睿 i7-4790K 上 Ubuntu 14.04.1 LTS 运行 上测试,使用 -O2 和一个自称 "gcc (Ubuntu 4.8.2-19ubuntu1) 4.8.2" 的 GCC。 Glibc 版本是 Ubuntu EGLIBC 2.19-0ubuntu6.4.