calloc v/s malloc et l'efficacité dans le temps
J'ai lu avec intérêt le post C de différence entre les malloc et calloc. Je suis à l'aide de malloc dans mon code et je voudrais savoir quelle différence je vais devoir utiliser calloc à la place.
Mon cadeau (pseudo -) code avec malloc:
Scénario 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
Si j'utilise calloc à la place de malloc, puis je vais avoir:
Scénario 2
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
J'ai trois questions:
-
Lequel de ces scénarios est plus efficace si les tableaux sont très grandes?
-
Lequel des scénarios sera plus efficace si les tableaux sont très grandes?
-
Dans les deux scénarios,je suis en train d'écrire des tableaux dans le sens que pour chaque itération de la boucle for, je suis en train d'écrire chaque matrice de façon séquentielle à partir du premier élément au dernier élément. La question importante: Si je suis en utilisant malloc comme dans le scénario 1, alors est-il nécessaire que j'initialise les éléments à zéro? Dire avec malloc j'ai matrice z = [garbage1, garbage2, les ordures 3]. Pour chaque itération, je suis en train d'écrire les éléments de manière séquentielle c'est à dire dans la première itération-je obtenir z =[some_result, garbage2, garbage3], dans la deuxième itération I au cours de la première itération-je obtenir z =[some_result, another_result, garbage3] et ainsi de suite, alors j'ai besoin spécifiquement pour initialiser mes tableaux après malloc?
Oui, c'est pourquoi j'ai mentionné que j'ai lu l'autre post. Je voulais être un peu plus précis ici.
Avez-vous mesuré? Quels ont été les résultats sur votre machine?
Pas encore de. Je serai de retour à écrire si il y a des différences.
Voici un lien (plus tard) la question qui obtient pourquoi calloc peut être beaucoup plus rapide (10x) que malloc+memset. stackoverflow.com/questions/2688466
OriginalL'auteur yCalleecharan | 2010-04-09
Vous devez vous connecter pour publier un commentaire.
En supposant que la quantité totale de mémoire en cours d'initialisation dans vos deux exemples est le même, l'allocation de la mémoire avec
calloc()
pourrait être plus rapide que l'allocation de la mémoire avecmalloc()
et puis réduction à zéro dans une étape distincte, surtout si dans lamalloc()
le cas où vous zéro les éléments individuellement par l'itération de plus dans une boucle. Unmalloc()
suivie par unmemset()
sera probablement à peu près aussi rapide quecalloc()
.Si vous n'avez pas de soins que les éléments du tableau sont des ordures avant de stocker les résultats de calcul en eux, il n'est pas nécessaire d'initialiser vos tableaux après
malloc()
.Je suis l'aide de C. je pense que memset() est pour le C++ et n'est pas disponible dans C.
memset est disponible en C++ et C. la valeur NULL est une constante conçu pour être utilisé pour initialiser les pointeurs, et de l'utiliser pour d'autres choses (comme lorsqu'une valeur int est souhaité) est faux, même si cela pourrait fonctionner.
Je n'oserai pas affirmer qu'un malloc/memset séquence est aussi rapide que calloc. Cela dépend de la libc mise en œuvre. Que faire si la mémoire fournie par le système d'exploitation est déjà initialisé à zéro? Le calloc de mise en œuvre peuvent savoir à ce sujet et donc sauter d'une réinitialisation de la mémoire. Le memset dans un malloc/memset séquence serait redondante, et certainement pas aussi vite que calloc. Par exemple sous Linux, le mmap() de l'appel système est utilisé lorsque de grands segments de mémoire sont demandées et de la mémoire est déjà remis à zéro par Linux.
La mémoire n'est pas "déjà remis à zéro" au moment de la
mmap
. Au lieu de cela c'est de la pure intacte de copie sur écriture des références à l'universel zéro page. Il sera instancié que la mémoire physique rempli avec des zéros sur la première écriture. Donc, en utilisantcalloc
reporte le coût de l'initialisation à zéro de la mémoire de l'allocation de temps à écrire le temps. Cela peut être très utile dans des applications temps-réel où un seulmemset
pourrait entraîner trop de latence, mais le coût est étalé sur de nombreuses accès locaux est acceptable.OriginalL'auteur RarrRarrRarr
Pour 1 et 2, les deux font la même chose: d'allouer et de zéro, puis utilisez les tableaux.
Pour 3, si vous n'avez pas besoin à zéro les tableaux premier, puis réduction à zéro est inutile et ne pas le faire est plus rapide.
Il y a une possibilité que calloc réduction à zéro est plus efficace que le code que vous écrivez, mais cette différence sera minime par rapport au reste du travail que fait le programme. Les économies réelles de calloc est de ne pas avoir à écrire ce code vous-même.
OriginalL'auteur
La
calloc
etmemset
approches doit être la même, et peut-être légèrement plus rapide que la réinitialisation de vous-même.Peu importe, tout est relatif à ce que vous faites à l'intérieur de ta boucle principale, qui pourraient être des ordres de grandeur de plus.
OriginalL'auteur Mike Dunlavey
Votre point indiqué dans le 3. semble indiquer un cas ou inutile d'initialisation. C'est assez mauvais vitesse sage, non seulement le temps passé à faire, il est perdu, mais tout un tas de cache d'expulsion qui s'est passé à cause de cela.
Faire un
memset()
oubzero()
(qui sont appelés parcalloc()
de toute façon) est un bon moyen d'invalider énorme partie de votre cache. Ne pas le faire, sauf si vous êtes sûr que vous ne pas écraser tout ce qui peut encore lire des parties de la mémoire tampon qui n'auront pas été écrit (comme si 0 est une valeur par défaut acceptables). Si vous écrivez sur tout de toute façon par tous signifie ne pas initialiser votre inutilement de la mémoire.Inutiles de la mémoire de l'écriture ne sera pas seulement ruiner votre les performances de l'application, mais aussi les performances de toutes les applications de partage le même PROCESSEUR avec elle.
OriginalL'auteur Bruno Rohée
malloc est plus rapide que Calloc, parce que la raison est que malloc retour de mémoire que c'est à partir d'un système d'exploitation. Mais, quand vous allez appeler Calloc il obtient de la mémoire du noyau ou système d'exploitation et ses initialise à zéro, puis son retour à vous.
ainsi, l'initialisation prend du temps. c'est pourquoi malloc plus vite que Calloc
OriginalL'auteur Gunjan Rockstar
malloc
diffèrent parcalloc
par deux raisonmalloc prend un argument alors que calloc prend deux argument
malloc est plus rapide que calloc raison en est que malloc traitées unique dimensions tableau de pointeur de format alors que calloc prend une double dimension tableau et traitées avant qu'il convertit à la seule dimension tableau puis de pointeur format.
Je pense que, c'est pourquoi malloc traitement plus rapide par rapport à calloc
OriginalL'auteur xyz