Dans votre deuxième extrait, la modification de l'élément j
dans chaque itération produit un modèle avec une faible localité spatiale. Rappelez-vous que dans les coulisses, une référence de tableau calcule :
( ((y) * (row->width)) + (x) )
Considérons un cache L1 simplifié qui a suffisamment d'espace pour seulement 50 rangées de notre tableau. Pour les 50 premières itérations, vous paierez le coût inévitable de 50 manques de cache, mais que se passera-t-il ensuite ? Pour chaque itération de 50 à 99, vous manquerez encore de mémoire cache et devrez aller chercher dans la L2 (et/ou la RAM, etc.). Ensuite, x
passe à 1 et y
recommence, conduisant à un autre manquement au cache parce que la première ligne de votre tableau a été évincée du cache, et ainsi de suite.
Le premier extrait ne présente pas ce problème. Il accède au tableau dans ordre de rang-majeur Vous n'avez à payer qu'une seule fois pour les erreurs de cache (si une ligne de votre tableau n'est pas présente dans le cache au moment où la boucle commence) par ligne.
Ceci étant dit, cette question dépend beaucoup de l'architecture, il faut donc prendre en compte les spécificités (taille du cache L1, taille des lignes de cache, etc.) pour tirer une conclusion. ) pour tirer une conclusion. Vous devriez également mesurer dans les deux sens et suivre les événements matériels pour disposer de données concrètes permettant de tirer des conclusions.
0 votes
Il doit y avoir une différence lors du stockage du tableau
1 votes
Vous les avez écrites. Maintenant, vous pouvez augmenter les chiffres et les tester par vous-même. Je parie qu'il n'y aura aucune différence due aux optimisations du compilateur, ou dans le pire des cas, la première sera plus rapide, car elle itère sur la zone contiguë de la mémoire.
6 votes
Petite note : utilisez "++i" au lieu de "i++". C'est plus rapide (bien que pour les nombres la différence avec "i++" soit très faible, pas comme pour les itérateurs STL).
11 votes
@Raxillan - ce n'est plus vrai avec les processeurs et compilateurs modernes, dans tous les cas, en fonction de la langue réelle.
31 votes
@Raxillan c'est tout simplement faux. Ils seront aussi efficaces l'un que l'autre, sauf si vous utilisez un compilateur des années 70.
0 votes
@LuchianGrigore Donc, "i++" ne fait pas une copie de "i" ?
9 votes
@Raxillan dans ce cas, non. L'optimiseur est suffisamment intelligent pour savoir qu'il n'a pas besoin d'une copie.
5 votes
@Raxillan Pourquoi le devrait-elle ? Ni la nouvelle ni l'ancienne valeur ne sont utilisées dans la même expression, et le compilateur le sait. Alors pourquoi cela devrait-il faire une différence ?
0 votes
Fermeture du dossier en tant que doublon, conformément à meta.stackoverflow.com/questions/380911/