calloc v / s malloc和时间效率

时间:2010-04-09 06:26:37

标签: c optimization malloc calloc

我感兴趣地阅读了帖子C difference between malloc and calloc。我在我的代码中使用malloc,想知道我将使用calloc有什么区别。

我现在的(伪)代码与malloc:

情景1

int main()
{  
   allocate large arrays with malloc

   INITIALIZE ALL ARRAY ELEMENTS TO ZERO

   for loop //say 1000 times
    do something and write results to arrays
   end for loop

   FREE ARRAYS with free command

} //end main

如果我使用calloc而不是malloc,那么我将:

Scenario2

int main()
{  

   for loop //say 1000 times
    ALLOCATION OF ARRAYS WITH CALLOC 

    do something and write results to arrays

    FREE ARRAYS with free command

   end for loop


} //end main

我有三个问题:

  1. 如果阵列非常大,哪个场景会更有效?

  2. 如果阵列非常大,哪个场景会更有时间效率?

  3. 在这两种情况下,我只是写入数组,因为对于for循环中的任何给定迭代,我都是从第一个元素到最后一个元素顺序编写每个数组。重要的问题:如果我在场景1中使用malloc,那么我是否有必要将元素初始化为零?用malloc说我有数组z = [garbage1,garbage2,garbage 3]。对于每次迭代,我按顺序编写元素,即在第一次迭代中我得到z = [some_result,garbage2,garbage3],在第二次迭代中我得到第一次迭代我得到z = [some_result,another_result,garbage3]等等on,然后我需要专门在malloc后初始化我的数组吗?

7 个答案:

答案 0 :(得分:11)

假设在两个示例中初始化的内存总量相同,则使用calloc()分配内存可能比使用malloc()分配内存然后在单独的步骤中将其归零更快,尤其是在malloc()情况下,通过在循环中迭代它们来单独归零元素。后跟malloc()的{​​{1}}可能与memset()一样快。

如果在将实际存储计算结果之前不关心数组元素是垃圾,则无需在calloc()之后实际初始化数组。

答案 1 :(得分:1)

对于1和2,两者都做同样的事情:allocate和zero,然后使用数组。

对于3,如果你不需要先将数组归零,那么就不需要归零,而不是更快。

calloc的归零有可能比你编写的代码更有效,但与程序的其他工作相比,这种差异会很小。 calloc的真正节省不需要自己编写代码。

答案 2 :(得分:0)

callocmemset方法应该大致相同,并且可能比自己归零更快。

无论如何,这都与您在主循环中所做的相关,这可能会大一些数量级。

答案 3 :(得分:0)

你在3.中陈述的观点似乎表明案件或不必要的初始化。这是非常糟糕的速度,不仅耗费时间浪费,而且因为它而发生了大量的缓存驱逐。

执行memset()bzero()(无论如何都由calloc()调用)是使大部分缓存无效的好方法。不要这样做,除非您确定不会覆盖所有内容,但可以读取未写入的缓冲区部分(如果0是可接受的默认值)。如果你无论如何你都写了所有意思,不要不必要地初始化你的记忆。

不必要的内存写入不仅会破坏您的应用程序性能,还会破坏与之共享相同CPU的所有应用程序的性能。

答案 4 :(得分:0)

我不知道Linux。但是在Windows上,有一个称为零页面线程的东西... calloc使用那些已经初始化为零的页面。 malloc和calloc的速度没有差别。

答案 5 :(得分:-1)

malloc比Calloc更快,因为malloc返回内存,因为它来自操作系统。但是当你调用Calloc时,它会从内核或操作系统获取内存,并使用零进行初始化,然后返回给你。 所以,初始化需要时间。这就是为什么malloc比Calloc更快的原因

答案 6 :(得分:-8)

malloccalloc而有所不同

  1. malloc接受一个参数,而calloc接受两个参数

  2. malloc比calloc更快的原因是malloc将单维数组处理为指针格式,而calloc采用双维数组,在处理之前,它转换为单维数组,然后转换为指针格式。

  3. 我认为,这就是为什么malloc处理速度比calloc

    更快的原因