12
votes

Le modèle est-il métaprogrammant plus rapidement que le code C équivalent?

est un modèle métaprogrammant plus rapidement que le code C équivalent? (Je parle des performances d'exécution) :)


6 commentaires

Cela a été évité? Sérieusement? Cela me semble parfaitement bonne question. (Bien que le titre et le corps de la question semblent poser deux questions différentes, cela pourrait être une bonne idée de clarifier lequel d'entre eux qui vous intéresse)


Voulez-vous dire "est plus rapide de programmer?" ou voulez-vous dire "exécute-t-il plus vite?" Votre question est ambiguë et nous semblons obtenir des réponses aux deux questions, ce qui est un peu déroutant.


Vous devez montrer les deux codes, puis nous pourrons en mustion à leur sujet. Vous ne pouvez tout simplement pas poser cette question comme cela se tient, cela n'a aucun sens.


Je n'ai pas d'exemples, mais je le veut dire en général.So est Quicksort plus rapide que Quicksort dans C. ou: Construire un arbre est plus rapide que dans C ... et ainsi de suite.


Je pense que cela a du sens tel quel. Bien sûr, les réponses doivent être beaucoup plus générales que s'il avait posé une question sur deux implémentations spécifiques d'un algorithme donné, mais s'il l'avait fait, nous pourrions simplement le mesurer quand même. Pour un programmeur C Curieux de savoir pourquoi les personnes C ++ continuent à faire face à des métacrogrammes de modèle, je pense que c'est une bonne question. Il existe des caractéristiques générales de performance pour la programmation générique et la métaprogrammation de modèle qui les rendent utiles


@ N00KI3: Je pense que vous avez mal compris ce que TMP est à propos. Le tri n'est généralement pas effectué à l'aide de TMP, bien que TMP obtiennent des écarts (supplémentaires) à partir des mêmes fonctionnalités C ++ qui accélèrent le tri (comme déjà expliqué par deux autres).


8 Réponses :


11
votes

Modèle MetaProGramming (TMP) est "RUN" à l'heure de la compilation, de sorte que cela ne comparait donc pas vraiment des pommes aux pommes lors de la comparaison du code C / C ++ normal.

Mais, si vous avez quelque chose d'évalué par TMP, il n'y a pas de coût d'exécution du tout.


0 commentaires

1
votes

La réponse est-ce que cela dépend.

Modèle MetaProgrammation peut être utilisé pour écrire facilement des analyseurs de la langue de descente récursive et ceux-ci peuvent être inefficaces par rapport à un programme C soigneusement conçu ou à une implémentation basée sur une table (par exemple Flex / Bison / YACC).

D'autre part, vous pouvez écrire des métaprogrammes qui génèrent des boucles déroulées qui peuvent être plus efficaces qu'une implémentation C conventionnelle C conventionnelle qui utilise des boucles.

L'avantage principal est que les métaprogrammes permettent au programmeur de faire plus avec moins de code.

L'inconvénient est que cela vous donne également un pistolet gatling pour vous tirer au pied avec.


0 commentaires

1
votes

Modèle de métaprogrammation peut être considéré comme une exécution de la compilation.

Le temps de compilation va prendre plus de temps pour compiler votre code puisqu'il doit compiler, puis exécuter les modèles, générer du code, puis compiler à nouveau.

Les frais généraux de temps d'exécution dont je ne suis pas sûr, cela ne devrait pas être beaucoup plus que si vous l'avez écrit vous-même en code C, j'imagine.


0 commentaires

1
votes

J'ai travaillé sur un projet où un autre programmeur avait essayé des métaprogrammations. C'était terrible. C'était un mal de tête complet. Je suis un programmeur moyen avec beaucoup d'expérience C ++ et j'essaie de concevoir ce que l'enfer qu'ils essayaient de faire avaient beaucoup plus de temps que s'ils l'avaient écrit tout de suite pour commencer.

Je suis bloqué contre la métaprogramming C ++ en raison de cette expérience.

Je suis un croyant ferme que le meilleur code est le plus facilement lisible par un développeur moyen. C'est la lisibilité du logiciel qui est la priorité n ° 1. Je peux faire quelque chose de travail en utilisant n'importe quelle langue ... mais l'habileté est de le rendre lisible et facilement réalisable pour la prochaine personne du projet. La métaprogrammation C ++ ne parvient pas à réussir.


5 commentaires

Peut-être que le problème était que votre associé n'ait pas suffisamment documenté ce que fait son code de métaprogramming? Ou peut-être qu'il n'était tout simplement pas très bon pour écrire un code compréhensible. En tout cas, je ne suis pas sûr qu'il soit juste de condamner la technique entière basée sur une expérience avec une base de code.


Je suis d'accord avec Jeremy. Peut-être que votre collègue n'était pas bon pour écrire le code ou le faire si proprement, mais je ne pense pas que vous ne soyez pas à lire, cela le rend mauvais. Peut-être que était écrit bien et que vous aviez besoin de plus d'expérience avec des modèles?


Peut-être que le code à lui-même ne vous a pas prêté seul pour être métaprogrammé!


Meh, c'est la nature de la bête avec C ++: chaque fois qu'une nouvelle fonctionnalité est ajoutée à la langue, les Weenies l'abusent jusqu'à ce que quelque chose de Shinier arrive pour attirer leur attention. Comme lorsque la langue est sortie d'abord et qu'ils ont surchargé des opérateurs à gauche et à droite.


Parce que c'est clairement "abus" d'utiliser une fonction de tri générique et efficace, au lieu de devoir utiliser une utilisation inefficace, ou un code de manuel pour chaque type que vous souhaitez trier. Oui, je peux voir comment c'est "abus" et rend le code plus difficile à lire ... Bien sûr, il peut être abusé et bien sûr, il peut produire un code illisible. Mais cela peut également simplifier beaucoup de code qui aurait autrement être un gâchis à regarder.



0
votes

Je ne pense pas qu'il n'y ait aucun battage médiatique, mais une réponse claire et simple sur les modèles est donnée par C ++ FAQ: https://isocpp.org/wiki/faq/templates#overview-Templates

À propos de la question initiale: on ne peut pas répondre, car ces choses ne sont pas comparables.


0 commentaires

28
votes

Premier, un avertissement de non-responsabilité: Ce que je pense que vous demandiez que ce n'est pas que des modèles métaprogrammants, mais aussi une programmation générique. Les deux concepts sont étroitement liés et il n'y a pas de définition exacte de ce qui englobe. Mais en bref, le métaprogramming de modèle écrit essentiellement un programme à l'aide de modèles, qui est évalué à la compilation. (ce qui le rend entièrement libre au moment de l'exécution. Rien ne se passe. La valeur (ou le type (plus couramment) a déjà été calculée par le compilateur et est disponible comme une constante (une variable constante ou une énumération), ou enum imbriquée dans une classe (si vous l'avez utilisée pour "calculer" un type).

La programmation générique utilise des modèles et le cas échéant, métaprogrammation de modèle, pour créer un code générique qui fonctionne de la même manière (et sans perte de performance) , avec tout et n'importe quel type. Je vais utiliser des exemples de la fois dans ce qui suit.

Un usage courant pour le métaprogrammation de modèle est d'activer les types à utiliser dans la programmation générique, même si elles n'ont pas été conçues pour cela.

Depuis que le modèle métaprogrammant techniquement se déroule entièrement au moment de la compilation, votre question est un peu plus pertinente pour la programmation générique, qui a toujours lieu au moment de l'exécution, mais est efficace car elle peut être spécialisée pour le types précis, il est utilisé avec la compilée.

Quoi qu'il en soit ...


dépend de la façon dont vous définis E "Le code C équivalent".

L'astuce sur le métaprogrammation de modèle (ou la programmation générique en général) est qu'elle permet de déplacer beaucoup de calcul pour compiler le temps et permet de mettre en place un code flexible et paramétré. C'est tout aussi efficace que les valeurs codées.

Le code affiché ici par exemple calcule un numéro dans la séquence Fibonacci au moment de la compilée.

le code C ++ ' non signé long fib11 = fibonacci <11l> :: valeur ', repose sur le métaprogramme de modèle défini dans ce lien et est aussi efficace que le code C non signé long FIB11 = 89UL '. Les modèles sont évalués au moment de la compilation, cédant une constante pouvant être attribuée à une variable. Donc, au moment de l'exécution, le code est réellement identique à une simple affectation.

Donc, si c'est le "code C équivalent", la performance est la même. Si le code C équivalent est "un programme capable de calculer des numéros de fibonacci arbitraires, appliqué pour trouver le 11ème numéro de la séquence", la version C sera beaucoup plus lente, car elle doit être mise en oeuvre en fonction de la valeur, qui calcule la valeur à l'exécution. Mais il s'agit du "Code C équivalent" en ce sens que c'est un programme C qui présente la même flexibilité (ce n'est pas seulement une constante codée codée, mais une fonction réelle pouvant retourner tout numéro dans le Séquence Fibonacci).

Bien sûr, ce n'est pas souvent utile. Mais c'est à peu près l'exemple canonique de métaprogrammation de modèle.

Un exemple plus réaliste de programmation générique est le tri.

in c, vous avez le qsort standard Fonction de bibliothèque prenant un tableau et un pointeur de fonction comparateur. L'appel à ce pointeur de la fonction ne peut pas être inliné (sauf dans des cas triviaux), car au moment de la compilation, on ne sait pas quelle fonction sera appelée.

Bien sûr, l'alternative est une main Fonction de tri écrite conçue pour votre type de données spécifique.

en C ++, l'équivalent est le modèle de fonction std :: Trier . Il faut aussi un comparateur, mais au lieu d'être un pointeur de fonction, il s'agit d'un objet de fonction, en ressemblant à ceci: xxx

et cela peut être inlincé. La fonction std :: tri est transmise un argument de modèle. Il connaît donc le type exact du comparateur, et il sait donc que la fonction de comparateur n'est pas simplement un pointeur de fonction inconnu, mais myComp :: opérateur () .

Le résultat final est que la fonction C ++ std :: tri est exactement aussi efficace que votre main Mise en œuvre codée en C du même algorithme de tri.

à nouveau, si c'est "le code C équivalent", la performance est la même. Mais si le "Code C équivalent" est "une fonction de tri généralisée qui peut être appliquée à tout type , et permet des comparateurs définis par l'utilisateur", la version générique-programmation en C ++ est considérablement plus efficace.

C'est vraiment le tour. La programmation générique et le métaprogrammation de modèle ne sont pas "plus rapides que c". Ce sont des méthodes pour atteindre Général, code réutilisable qui est aussi rapide que code à base de code à base de codes à base de codes à base de codes manuels et en corde C

C'est un moyen de tirer le meilleur parti des deux mondes. La performance des algorithmes codés et la flexibilité et la réutilisabilité des paramètres généralisés.


3 commentaires

Jalf j'ai utilisé l'exemple de tri dans ma réponse, donc +1 pour le guerrier C ++: D


Euh, je pense qu'il y a une énorme différence entre la programmation générique et le TMP, mais je comprends que vous avez apporté l'exemple de GP pour faire votre point de vue. Encore, je manquerais une indication que le comparateur n'est pas TMP.


point équitable. J'ai ajouté un peu d'explication au début de ce que GP et TMP sont et ont mentionné que l'exemple de tri serait généralement considéré comme GP, mais je pense que je vais le laisser à cela.



4
votes

Si vous voulez dire Code réutilisable fort>, alors oui sans aucun doute. Le métaprogramming est un moyen supérieur de produire des bibliothèques et non du code client. Le code de la clientèle n'est pas générique, il est écrit de faire des choses spécifiques.

Par exemple, regardez la bibliothèque standard QSort STORT> de C, et C ++ Standard Sort Strong>. Voici comment QSort STRT> WORKS: P>

unsigned long greatestCommonDivisor = boost::math::static_gcd<25657, 54887524>::value;


8 commentaires

Eh bien, cela calculer le type au moment de la compilation :) Il n'est pas nécessaire de calculer des calculs numériques.


Le questionneur n'a pas défini ce qu'il signifiait par «Modèle MetaProgramming» et «Code C équivalent», il a donc dû deviner de toute façon.


Lorsque vous spécialisez un modèle, le compilateur calcule le type de l'argument, il n'est pas numérique mais c'est un calcul :)


Je ne pense pas que l'OP avait prévu une distinction complètement rigide entre la programmation générique et le métaprogrammation de modèle. Je pense que les exemples de tri répondent à ce qu'il voulait savoir, quelle que soit la terminologie exacte. +1


Ah, je vois maintenant. :) Mais je supporte toujours mon sol que le type n'est pas calculé :) il connaît le type.


Je ne sais pas si j'appellerais Esprit un "bel" exemple de métaprogramming. Fascinant, sûr, impressionnant, définitivement, mais ... peut-être un peu sur le bord. :)


Je sais que la syntaxe Ebnf devient peu méchante, mais comment pouvez-vous le faire dans une autre langue;)


Vous ne pouvez pas, mais la plupart des gens diraient aussi que vous ne devriez pas. Il suffit de dire que ce n'est peut-être pas le meilleur le monde réel exemple de TMP utile. :RÉ



0
votes

Modèle MetaProgramming ne vous donne pas de puissances magiques en termes de performance. C'est fondamentalement un préprocesseur très sophistiqué; Vous pouvez toujours écrire l'équivalent en C ou C ++, cela pourrait tout simplement vous prendre très longtemps.


0 commentaires