calloc v / s malloc和时间效率

我饶有兴趣地阅读了malloc和calloc之间C后差异 。 我在我的代码中使用了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. 如果arrays非常大,哪个场景更有效?

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

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

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

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

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

对于3,如果您不需要首先将数组归零,那么归零是不必要的,而不是更快。

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

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

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

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

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

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

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

malloccalloc的不同而有两个原因

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

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

我认为,这就是为什么malloc处理速度比calloc更快的原因