calloc v / S malloc и эффективность времени

Я прочитал с интересом сообщение C разница между malloc и 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 я пишу каждый массив последовательно от первого элемента до последнего элемента. Важный вопрос: если я использую malloc, как в сценарии 1 Необходимо ли инициализировать элементы до нуля? Скажем, с malloc у меня есть массив z = [garbage1, garbage2, garbage 3]. Для каждой итерации я пишу элементы последовательно, т. е. на первой итерации я получаю z =[some_result, garbage2, garbage3], на второй итерации я получаю на первой итерации я получаю z =[some_result, another_result, garbage3] и так далее, то мне нужно специально инициализировать мои массивы после malloc?

6 ответов


предполагая, что общий объем памяти, инициализируемой в ваших двух примерах, одинаков, выделяя память с calloc() может быть быстрее, чем выделение памяти с помощью malloc() а затем обнуление их на отдельном шаге, особенно если в malloc() Если вы обнуляете элементы по отдельности, повторяя их в цикле. А malloc() затем memset() скорее всего, будет примерно так же быстро, как calloc().

Если вам все равно, что элементы массива являются мусором раньше вы фактически храните результаты вычислений в них, нет необходимости фактически инициализировать ваши массивы после malloc().


для 1 и 2 оба делают одно и то же: выделяют и нуль, затем используют массивы.

для 3, Если вам не нужно сначала обнулить массивы, то обнуление не нужно и не делать это быстрее.

существует вероятность того, что обнуление calloc более эффективно, чем код, который вы пишете, но эта разница будет небольшой по сравнению с остальной частью работы программы. Реальная экономия calloc не нужно писать этот код самостоятельно.


на calloc и memset подходы должны быть примерно одинаковыми и, возможно, немного быстрее, чем обнуление его самостоятельно.

независимо от того, все это относительно того, что вы делаете внутри своего основного цикла, который может быть на порядки больше.


ваша точка зрения изложена в 3. кажется, указывает на случай или ненужную инициализацию. Это довольно плохая скорость, не только время, потраченное на это, тратится впустую, но из-за этого произошло много выселения кэша.

делать memset() или bzero() (которые называются calloc() в любом случае) - хороший способ аннулировать огромную часть вашего кэша. Не делайте этого, если вы не уверены, что не будете перезаписывать все, что еще может читать части буфера, которые не будут записаны (как если бы 0 допустимое значение по умолчанию). Если вы все равно все записываете, не инициализируйте свою память без необходимости.

ненужная запись памяти не только испортит производительность вашего приложения, но и производительность всех приложений, использующих один и тот же процессор.


malloc быстрее, чем Calloc, потому что причина в том, что malloc возвращает память, как это из операционной системы. Но когда вы вызываете Calloc, он получает память от ядра или операционной системы и инициализирует ее нулем, а затем возвращается к вам. таким образом, инициализация занимает время. вот почему malloc быстрее, чем Calloc


malloc отличаются calloc по двум причинам

  1. malloc принимает один аргумент, тогда как calloc принимает два аргумента

  2. malloc быстрее, чем calloc причина в том, что malloc обработал одномерный массив в формате указателя, тогда как calloc принимает двухмерный массив и перед обработкой преобразуется в одномерный массив, а затем в формат указателя.

Я думаю, что, вот почему malloc обработки быстрее по сравнению с памятью