TD; DR:
Il y avait une certaine confusion quant à ce que je demandais, voici donc l'idée maîtresse derrière la question:
J'ai toujours voulu que la question soit ce qu'elle est. Je l’ai peut-être mal articulé à l’origine. Mais l'intention a toujours été " est un code modulaire, séparé, en vrac, découplé, refactorisé " nettement plus lentement que par nature " monolithique monolithique, tout faire à la même place, un fichier, étroitement couplé ". Le reste n'est que des détails et diverses manifestations de ce que j'ai découvert à l'époque ou maintenant ou ultérieurement. C'est plus lent sur certaines échelles. Comme un disque non défragmenté, vous devez ramasser les morceaux de partout. C'est plus lent. Pour sûr. Mais devrais-je m'en soucier?
Et la question ne concerne pas ...
pas de micro-optimisation, d'optimisation prématurée, etc. Il ne s'agit pas "d'optimiser telle ou telle partie à mort".
Qu'est-ce que c'est alors?
Il est sur l' ensemble méthodologie et des techniques et des façons de penser à écrire du code qui a émergé au fil du temps:
- "injecte ce code dans ta classe en tant que dépendance"
- "écrire un fichier par classe"
- "séparez votre vue de votre base de données, contrôleur, domaine".
- n'écrivez pas un bloc de code unique homogène, mais écrivez de nombreux composants modulaires distincts qui fonctionnent ensemble
Il s'agit de la manière et du style de code qui sont actuellement - au cours de cette décennie - vus et préconisés dans la plupart des cadres, préconisés lors de conventions, transmis via la communauté. Nous sommes en train de passer de «blocs monolithiques» à des «microservices». Et avec cela vient le prix en termes de performances et de frais généraux au niveau de la machine, ainsi que certains frais généraux au niveau du programmeur.
La question initiale suit:
Dans le domaine de l’informatique, j’ai constaté un changement notable de la pensée en matière de programmation. Je rencontre assez souvent le conseil qui va comme ceci:
- écrire du code fonctionnel plus petit (plus testable et maintenable de cette façon)
- refactorisez le code existant en morceaux de code de plus en plus petits jusqu'à ce que la plupart de vos méthodes / fonctions ne soient plus que de quelques lignes et que leur but soit clair (ce qui crée plus de fonctions par rapport à un bloc monolithique plus grand)
- écrire des fonctions qui ne font qu'une chose - séparation des problèmes, etc. (ce qui crée généralement plus de fonctions et plus d'images sur une pile)
- créer plus de fichiers (une classe par fichier, plus de classes à des fins de décomposition, pour des couches telles que MVC, l'architecture de domaine, les modèles de conception, OO, etc., ce qui crée plus d'appels de système de fichiers)
Ceci est un changement par rapport aux pratiques de codage "anciennes" ou "obsolètes" ou "spaghettis" où vous avez des méthodes couvrant 2500 lignes, et de grandes classes et des objets divins faisant tout.
Ma question est la suivante:
lorsqu’il s’appelle au code machine, aux 1 et aux 0, aux instructions d’assemblage, aux plateaux de disque dur, devrais-je être inquiet du fait que mon code OO parfaitement séparé par classe avec une variété de fonctions et de méthodes remodelées de petite à minuscule génère aussi beaucoup de frais supplémentaires?
Détails
Bien que je ne sois pas intimement familiarisé avec la façon dont le code OO et ses appels de méthode sont traités dans ASM, et comment les appels de base de données et les appels de compilateur se traduisent par le déplacement du bras de l'actionneur sur un plateau de disque dur, j'ai une idée. Je suppose que chaque appel de fonction supplémentaire, appel d'objet ou appel "#include" (dans certaines langues) génère un ensemble d'instructions supplémentaire, augmentant ainsi le volume du code et ajoutant divers frais généraux de "câblage de code", sans ajout de code "utile" . J'imagine également que de bonnes optimisations peuvent être effectuées sur ASM avant qu'il ne soit réellement exécuté sur le matériel, mais que cette optimisation ne peut que faire beaucoup aussi.
Par conséquent, ma question est de savoir combien de temps système (en espace et en vitesse) le code bien séparé (code divisé en des centaines de fichiers, classes et modèles de conception, etc.) introduit réellement par rapport à "une grosse méthode qui contient tout dans un fichier monolithique ", en raison de cette surcharge?
UPDATE pour plus de clarté:
Je suppose que prendre le même code et le scinder, le refactoriser, le découpler en de plus en plus de fonctions, d'objets, de méthodes et de classes entraînera de plus en plus de passages de paramètres entre des fragments de code plus petits. Parce que pour sûr, le code de refactoring doit garder le thread, et cela nécessite le passage de paramètre. Des méthodes plus ou plusieurs classes ou plus des modèles de conception Méthodes d' usine, les résultats dans plus généraux de passer plusieurs bits d'information plus que c'est le cas dans une seule classe monolithique ou méthode.
Il a été dit quelque part (citation à déterminer) que jusqu’à 70% de tout le code est constitué de l’instruction MOV de ASM, qui charge les registres de la CPU avec les variables appropriées et non le calcul en cours. Dans mon cas, vous chargez le temps du processeur avec les instructions PUSH / POP afin de fournir des liaisons et des passages de paramètres entre différents morceaux de code. Plus vous réduisez vos morceaux de code, plus le "couplage" est nécessaire. Je crains que ce lien ne vienne alourdir et ralentir les logiciels et je me demande si cela devrait me préoccuper, et à quel point, le cas échéant, car les générations actuelles et futures de programmeurs qui construisent des logiciels pour le siècle prochain , devra vivre et consommer des logiciels construits selon ces pratiques.
UPDATE: plusieurs fichiers
J'écris maintenant un nouveau code qui remplace lentement l'ancien code. En particulier, j'ai remarqué que l'une des anciennes classes était un fichier de ligne d'environ 3 000 lignes (comme mentionné précédemment). À présent, il devient un ensemble de 15 à 20 fichiers situés dans divers répertoires, y compris des fichiers de test et non du framework PHP que j'utilise pour lier certaines choses. D'autres fichiers sont également à venir. En ce qui concerne les E / S de disque, le chargement de plusieurs fichiers est plus lent que le chargement d'un fichier volumineux. Bien sûr, tous les fichiers ne sont pas chargés, ils sont chargés en fonction des besoins et il existe des options de mise en cache disque et de mise en cache mémoire, et pourtant je pense que cela loading multiple files
prend plus de traitement que de loading a single file
mémoire. J'ajoute cela à ma préoccupation.
UPDATE: Dependency Inject tout
Revenons à cela après un moment .. Je pense que ma question a été mal comprise. Ou peut-être que j'ai choisi de mal comprendre certaines réponses. Je ne parle pas de micro-optimisation, comme l'ont indiqué certaines réponses (du moins, je pense que qualifier ce que je parle de micro-optimisation est un terme impropre), mais du mouvement du "code du refactor pour desserrer le couplage étroit", dans son ensemble , à tous les niveaux du code. Je viens de Zend Con récemment où ce style de code a été l’un des points centraux et des pièces maîtresses de la convention. Découplez la logique de la vue, la vue du modèle, le modèle de la base de données et, si vous le pouvez, dissociez les données de la base de données. Dépendence-Tout injecter, ce qui signifie parfois simplement ajouter un code de câblage (fonctions, classes, passe-partout) qui ne fait rien, mais sert de point de couture / crochet, doublant facilement la taille du code dans la plupart des cas.
MISE À JOUR 2: La "séparation du code dans plus de fichiers" affecte-t-elle considérablement les performances (à tous les niveaux de l'informatique)
Quel est l' compartmentalize your code into multiple files
impact de la philosophie de l'informatique actuelle (performances, utilisation du disque, gestion de la mémoire, tâches de traitement de la CPU)?
je parle de
Avant...
Dans un passé pas si lointain hypothétique et pourtant bien réel, vous pourriez facilement écrire un mono-bloc d'un fichier qui contient des modèles et des vues et un contrôleur spaghetti ou non-spaghetti-codé, mais qui exécute tout lorsqu'il est déjà chargé. En faisant quelques tests dans le passé en utilisant du code C, j'ai découvert qu'il est BEAUCOUP plus rapide de charger un fichier de 900 Mo en mémoire et de le traiter en gros morceaux plutôt que de charger un tas de fichiers plus petits et de les traiter dans un repas de paix plus petit. des morceaux faisant le même travail à la fin.
.. Et maintenant*
Aujourd'hui, je me retrouve à regarder du code qui montre un grand livre, qui a des fonctionnalités telles que .. si un article est un "ordre", affichez le bloc HTML. Si un élément de campagne peut être copié, imprimez un bloc HTML comportant une icône et des paramètres HTML derrière lui, vous permettant ainsi de faire la copie. Si l'élément peut être déplacé vers le haut ou le bas, affichez les flèches HTML appropriées. Etc. Je peux, grâce à Zend Framework, créerpartial()
appels, ce qui signifie essentiellement "appeler une fonction qui prend vos paramètres et les insère dans un fichier HTML séparé qu'il appelle également". Selon le niveau de détail que je souhaite obtenir, je peux créer des fonctions HTML distinctes pour les plus petites parties du registre. Un pour la flèche vers le haut, une flèche vers le bas, un pour "puis-je copier cet élément", etc. Créez facilement plusieurs fichiers simplement pour afficher une petite partie de la page Web. En prenant mon code et le code Zend Framework en coulisse, le système / pile appelle probablement près de 20 à 30 fichiers différents.
Quelle?
Je m'intéresse aux aspects, à l' usure de la machine, qui sont créés en cloisonnant le code dans de nombreux fichiers séparés plus petits.
Par exemple, pour charger plus de fichiers, vous devez les placer à différents endroits du système de fichiers et dans divers emplacements de disques durs physiques, ce qui signifie plus de temps de recherche et de lecture des disques durs.
Pour le processeur, cela signifie probablement plus de changement de contexte et de chargement de différents registres.
Dans ce sous-bloc (mise à jour n ° 2), je m'intéresse plus strictement à l'utilisation de plusieurs fichiers pour effectuer les mêmes tâches pouvant être effectuées dans un seul fichier, qui affecte les performances du système.
Utilisation de l'API Zend Form et du HTML simple
J'ai utilisé l'API Zend Form avec les pratiques OO les plus récentes et les plus modernes, pour construire un formulaire HTML avec validation, transformant celui-ci POST
en objets de domaine.
Il m'a fallu 35 fichiers pour le faire.
35 files =
= 10 fieldsets x {programmatic fieldset + fieldset manager + view template}
+ a few supporting files
Tous ces éléments pourraient être remplacés par quelques fichiers simples HTML + PHP + JS + CSS, soit peut-être un total de 4 fichiers légers.
Est-ce mieux? Est-ce pire? ... Imaginez le chargement de 35 fichiers + de nombreux fichiers de la bibliothèque Zend Zramework qui les font fonctionner, contre 4 fichiers simples.