6
votes

Qu'est-ce qui est plus rapide en C: structs ou tableaux?

Je veux mettre en œuvre (ce qui représente de manière abstraite) une matrice 4x4 dimensionnelle. Tout le code que j'écris pour matrix multiplication et cetera sera entièrement "déroulé", c'est-à-dire que, c'est-à-dire que je n'utiliserai pas des boucles pour accéder à l'accès et écrire des entrées de données dans la matrice.

Ma question est la suivante: C, serait-il plus rapide d'utiliser une structure comme telle: xxx

ou serait-ce plus rapide: xxx

donné que j'aurai accéder à chaque élément matriciel individuellement en tant que tel: xxx

ou xxx

ou sont-ils exactement la même vitesse ?


0 commentaires

4 Réponses :


2
votes

Je suppose que les deux sont la même vitesse. La différence entre une structure et une matrice n'est que sa signification (en termes humains.) Les deux seront compilés comme adresses de mémoire.


0 commentaires

1
votes

Je dirais que le meilleur moyen est de créer un test pour l'essayer vous-même. Les résultats peuvent varier en fonction des environnements système et des compilateurs.


1 commentaires

C'est en fait la réponse de Sanest.



12
votes

Les éléments de structure (champs) ne peuvent être accédés que par leurs noms explicitement spécifiés dans la source du programme, ce qui signifie que chaque fois que vous accédez à un champ, le champ réel doit être sélectionné et codé dur au moment de la compilation. Si vous vouliez mettre en œuvre la même chose avec des tableaux, cela signifierait que vous utiliseriez des indices de tableau de compilation constants explicites (comme dans votre exemple). Dans ce cas, la performance des deux sera exactement la même et le code généré sera exactement le même (à l'exclusion des compilateurs "malveillants").

Toutefois, notez que les tableaux vous fournissent un degré de liberté supplémentaire: si nécessaire, vous pouvez sélectionner des éléments de tableau par un index de temps d'exécution. C'est quelque chose qui n'est pas possible avec les structures. Seulement vous savez si cela compte pour vous.

D'autre part, note également que les tableaux en C ne sont pas copieux, ce qui signifie que vous serez obligé d'utiliser memcpy pour copier votre mon4x4matrix . Avec la version à base de structure, la copie de niveau de langue normale fonctionnera. Avec des tableaux, ce problème peut être travaillé en enveloppant le tableau réel dans une structure.


2 commentaires

Vous pouvez mettre le tableau à l'intérieur d'une structure, puis il est correctement copieux, mais présente également tous les avantages d'un tableau.


Le deuxième paragraphe est une différence très importante! bon point!



17
votes

Tout compilateur décent générera exactement le même code, octet-for-octet. Cependant, l'utilisation de tableaux vous permet beaucoup plus de flexibilité; Lors de l'accès aux éléments matriciels, vous pouvez choisir si vous souhaitez accéder à des emplacements fixes ou à des positions d'adresse avec des variables.

Je suis également très question de votre choix à "dérouler" (dérouler?) Toutes les opérations à la main. Tout bon compilateur peut être entièrement déroulant des boucles avec un nombre constant d'itérations pour vous et peut peut-être même générer un code SIMD et / ou planifier de manière optimale l'ordre des instructions. Vous aurez du mal à faire mieux à la main et vous vous retrouverez avec du code qui est hideux à lire. Le fait que vous ayez posé cette question me suggère que vous n'êtes probablement pas suffisamment expérimenté pour faire mieux que même un compilateur d'optimisation naïf.


4 commentaires

Probablement juste à propos de mon expérience. Néanmoins, je pense que je vais essayer de rouler et déroulé pour voir pour moi ce qui fonctionne mieux. Je pourrais utiliser l'expérience.


@Collin, vous devriez lire gcc.gnu.org/onlinedocs /gcc-3.4.6/gcc/OPTIMize-OptionS.html . Bien qu'il y ait d'autres compilateurs, de nombreuses technologies sont les mêmes. Notez que la boucle déroulante peut rendre le temps d'exécution plus lentement.


Ceci est probablement plus utile (comme dans plus de courant), mais merci pour votre lien. GCC.GNU.ORG/ONLINDOCS/GCC-4.4. 5 / GCC / OPTIMISE-OPTIONS.HTML


Laisser sortir le numéro de version dans le lien est encore meilleur; Ensuite, vous obtiendrez toujours les derniers documents du GCC: GCC.GNU.ORG/ONLINDOCS /gcc/optimize-opptions.html