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

13
задан Community 23 May 2017 в 12:17
поделиться

4 ответа

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

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

11
ответ дан 2 December 2019 в 02:18
поделиться

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

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

0
ответ дан 2 December 2019 в 02:18
поделиться

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

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

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

1
ответ дан 2 December 2019 в 02:18
поделиться

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

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

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

0
ответ дан 2 December 2019 в 02:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: