Pour quoi optimisez-vous? [fermé]


19

De manière générale, vers quel type d'optimisations vous orientez-vous généralement lors de la conception de logiciels?

Êtes-vous le type qui préfère optimiser votre conception pour

  • Temps de développement (c.-à-d. Rapide à écrire et / ou plus facile à entretenir)?
  • Temps de traitement
  • Espace de stockage (RAM, DB, disque, etc.)

Bien sûr, cela est très subjectif au type de problèmes à résoudre et aux délais impliqués, donc j'aimerais entendre les raisons qui vous feraient choisir une forme d'optimisation plutôt qu'une autre.


Tous les trois de ce qui précède, mais je veux jeter dans la généralité (qui concerne la maintenance). Lorsque vous prenez votre temps pour concevoir une structure de données vraiment efficace largement applicable aux besoins de votre logiciel, par exemple, et que vous la testez à fond, elle vous servira pendant des années et vous évitera d'avoir à écrire de nombreuses autres structures de données étroitement adaptées à la résolution de problèmes individuels. problèmes.

Réponses:


40

Entretien

Ensuite, profilez si nécessaire et optimisez pour la vitesse. J'ai rarement eu besoin d'un stockage - du moins pas au cours des 10 dernières années. Avant cela, je l'ai fait.


8
+1, si vous optimisez pour la maintenabilité pour commencer, il sera plus facile d'optimiser la vitesse ou le stockage plus tard si cela s'avère nécessaire.
Carson63000

Vous devez toujours considérer au moins le temps de traitement et le stockage afin de ne pas choisir une approche extrêmement excessive.

@ Thorbjørn, si vous optimisez le temps du développeur, vous choisirez probablement (plus que probablement) les algorithmes qui sont plus faciles à lire / écrire dans une langue donnée. Ce n'est que plus tard, et seulement si les performances deviennent un problème, que vous (comme l'a dit @Tim), choisissez un profileur.
Jason Whitehorn

@Jason, je suis fortement en désaccord. Vous devez connaître les caractéristiques de performances des algorithmes que vous choisissez afin de choisir une implémentation adaptée. C'est-à-dire que choisir une ArrayList lorsque vous en avez besoin principalement pour rechercher des codes postaux peut ne pas bien évoluer.

1
@ Thorbjørn, je ne suis pas en désaccord avec vous. En fait, je pense que vous avez raison en ce sens qu'il faut prêter attention aux algorithmes à portée de main. Cependant, je pense que là où nous différons d'opinions, c'est qu'à mon avis, l'idée des algorithmes à choisir est quelque chose appris par l'expérience et fixé uniquement lorsqu'un problème se présente. Vous avez raison dans votre point, je ne vois tout simplement pas la nécessité d'optimiser pour cela au détriment de moins lisible / plus long pour implémenter le code.
Jason Whitehorn

27

Temps de développement

Le traitement et le stockage sont bon marché. Votre temps n'est pas.

Juste pour noter:

Cela ne signifie pas faire un mauvais travail d'écriture de code juste pour le terminer rapidement. Cela signifie écrire le code d'une manière qui facilite un développement rapide. Cela dépend également entièrement de vos cas d'utilisation. S'il s'agit d'un site Web simple de deux ou trois pages avec un formulaire de contact, vous n'avez probablement pas besoin d'utiliser un framework PHP. Quelques inclusions et un script de mailer accéléreront le développement. Si le plan est plutôt de créer une plate-forme flexible sur laquelle se développer et ajouter de nouvelles fonctionnalités, il vaut la peine de prendre le temps de la disposer correctement et de coder en conséquence, car cela accélérera le développement futur.

En comparaison directe avec le temps de traitement et le stockage, je penche vers un temps de développement plus rapide. L'utilisation de la fonction de soustraction collectionutils est-elle la méthode la plus rapide et la plus efficace en termes de mémoire pour soustraire des collections? Non! Mais c'est un temps de développement plus rapide. Si vous rencontrez des goulots d'étranglement de performances ou de mémoire, vous pouvez les résoudre plus tard. Optimiser avant de savoir ce qui doit être optimisé est une perte de temps et c'est ce contre quoi je plaide.


4
La loi de Moore a pris fin il y a environ deux ans. Il serait peut-être temps de commencer à penser à la concurrence et à utiliser ces cœurs supplémentaires. C'est la seule façon d'obtenir des cycles d'horloge bon marché à l'avenir.
Robert Harvey

3
Pour être exact, la loi de Moore est toujours aussi solide avec un doublement du nombre de transistors sur une puce environ tous les 2 ans, ce qui permet de placer plusieurs cœurs sur une seule puce. Ce qui s'est terminé, c'est le «déjeuner gratuit» d'un nombre sans cesse croissant de cycles par seconde.
Dominique McDonnell

1
"Le traitement et le stockage sont bon marché." Le cache CPU et la vitesse du bus ne le sont pas. Ils sont aujourd'hui les principaux goulots d'étranglement des performances.
mojuba

3
Je suis complètement d'accord avec ça. Le maintien d'un code lisible, l'utilisation d'outils appropriés pour la tâche et le respect des normes convenues par votre entreprise réduiront considérablement votre temps passé à taper du code sur un ordinateur, ce qui vous fera économiser une tonne d'argent. Votre temps vaut mieux dépenser l'ingénierie que de taper.
Matt DiTrolio

1
@Bill: Ou si vous faites de l'intégration, où vous pouvez avoir des limites strictes qui augmenteront considérablement le coût du produit si vous les dépassez. Ou pour le logiciel serveur, parfois - si quelqu'un pouvait améliorer le traitement sur les serveurs Google de 1%, ce serait pas mal d'économies.
David Thornley

12

Expérience utilisateur.

C'est la seule valeur qui compte pour votre client.

Le temps de développement est moins important. Je peux écrire une application en ligne de commande complète beaucoup plus rapidement qu'une interface graphique, mais si Mme Jane ne peut pas comprendre comment faire cracher les rapports qu'elle veut, c'est inutile.

L'entretien est moins important. Je peux réparer une balançoire très rapidement, mais si elle se trouve au milieu d'une forêt, les utilisateurs ne peuvent pas la trouver.

Le temps de traitement est moins important. Si je fais une voiture qui passe de 0 à la vitesse de la lumière en 60 secondes, les utilisateurs ne peuvent pas diriger.

L'esthétique est moins importante. Je peux peindre une Joconde, mais si elle est cachée derrière un mur, personne ne la voit.

L'expérience utilisateur est la seule valeur qui compte. Faire une application qui fait exactement ce que l'utilisateur veut de la manière attendue par l'utilisateur est l'ultime réalisation.


Désolé Joeri, je me suis un peu emporté dans mon montage.
Malfist

C'est un wiki communautaire pour quelque chose, non? ;)
Joeri Sebrechts

8

Il n'y a qu'une seule chose à optimiser et c'est:

Ce que veulent vos clients

Vos clients ont-ils besoin du programme le plus rapide possible? Optimiser pour la vitesse.

Vos clients ont-ils besoin d'une fiabilité absolue? Optimiser pour cela.

En ont-ils besoin demain ou ce sera inutile? Optimiser pour la vitesse de développement.

Fonctionnant sur un appareil incroyablement minuscule avec des ressources limitées? Optimiser pour ces ressources.


Le seul hic, c'est qu'ils ne savent souvent pas ce qu'ils veulent ou qu'ils ont des attentes quant à ce qui est possible ou utile.
Tim Williscroft

1
Et lorsqu'on lui pose cette série de questions à choix multiples, le plus souvent, vous entendrez simplement «oui» :-)
Jason Whitehorn

1
Je n'ai pas dit que c'était facile. Et au moins si vous le demandez, il y a une chance que vous obteniez une réponse utile.
DJClayworth

5

Temps de traitement

Le temps de mon utilisateur n'est pas bon marché. Qui sème le vent récolte la tempête.


Je viens de mettre à jour une application que j'utilise l'année dernière. Ils avaient complètement réécrit l'application et le garçon était lent. J'ai finalement dû acheter un nouvel ordinateur pour le faire fonctionner rapidement. Je vous garantis que ce n'était pas bon marché, mais mon temps est plus précieux.


Prise en compte intéressante du temps de traitement. Vous souhaitez partager le type d'applications que vous développez? Je suis intrigué.
Jason Whitehorn

1
Le temps de traitement est important si vous exécutez sur de nombreux ordinateurs. Par exemple, si elle est un choix entre passer un 2 mois l' optimisation ou la mise à niveau de 10.000 PC supplémentaires pour le matériel plus récent, dans ce cas , le temps du développeur n'a pas gagné sur. Mais bien sûr, c'est un compromis. Si vous n'exécutez que sur une demi-douzaine de serveurs, le temps du développeur l'emporte probablement dans ce cas.
Dean Harding

1
@Jason, c'est facile pour le moment, de travailler avec Excel et VBA dans un conglomérat de feuilles de calcul (que j'ai condensé rapidement). Mes utilisateurs travaillent dans la pièce voisine et ils me préviennent si j'ai des problèmes. Mon point de vue vient de l'utilisation des ordinateurs pendant trente ans, et le fait de regarder les applications ne cesse de gonfler, forçant les mises à niveau à trop compenser. Je sais que les développeurs peuvent faire mieux, il leur suffit de prendre l'habitude d'écrire du code efficace.

+10 pour le code efficace. C'est trop souvent négligé, en particulier dans la programmation modulaire. Chaque module fonctionne à une vitesse raisonnable, mais la somme de tous peut être horriblement lente.
Joris Meys

4

J'ai tendance à limiter la consommation de mémoire et les allocations. Je sais que c'est de la vieille école, mais:

  • La plupart du code non jetable que j'écris est fortement parallèle. Cela signifie qu'une allocation de mémoire excessive et une activité de récupération de place sérialiseront beaucoup de code par ailleurs parallélisable. Cela signifie également qu'il y aura beaucoup de conflits pour un bus de mémoire partagée.
  • Ma langue principale est D, qui n'a pas encore une bonne prise en charge 64 bits (bien que cela soit corrigé).
  • Je travaille régulièrement avec des ensembles de données assez volumineux.

+1 pour avoir travaillé pour éviter les bloatwares. Les programmes de stockage de mémoire sont de mauvais programmes.

Les programmes de stockage de mémoire peuvent être exécutés sur des systèmes 64 bits, dans l'ensemble. C'est ce que nous avons fait lorsque l'une de nos applications a rencontré des problèmes de mémoire (elle utilise légitimement de grandes quantités de mémoire). Le premier point est important lorsque la performance l'est.
David Thornley

2

Je dirais que j'optimise vers l'efficacité, l'efficacité étant définie comme un compromis entre le temps de développement, la maintenabilité future, l'expérience utilisateur et les ressources consommées. En tant que développeur, vous devez jongler avec tout cela pour maintenir une sorte d'équilibre.

Comment atteignez-vous cet équilibre? Eh bien, vous devez d'abord établir quelques constantes, telles que la date limite, le matériel sur lequel votre application s'exécutera et le type de personne qui l'utilisera. Sans les connaître, vous ne pouvez pas établir le bon équilibre et hiérarchiser où cela est nécessaire.

Par exemple, si vous développez une application serveur sur une machine puissante, vous voudrez peut-être sacrifier l'efficacité des performances pour vous assurer de respecter un délai inamovible. Cependant, si votre développeur a une application qui doit répondre rapidement aux entrées des utilisateurs (pensez à un jeu vidéo), vous devez prioriser votre routine d'entrée pour vous assurer qu'elle n'est pas en retard.


2

Quelle que soit la technologie de virtualisation que j'utilise

Vous vous souvenez du temps où les systèmes avec plus de 512 Mo de RAM étaient considérés comme à la pointe de la technologie? Je passe mes journées à écrire du code pour le précédent.

Je travaille principalement sur des programmes de bas niveau qui s'exécutent sur le domaine privilégié dans un environnement Xen. Notre plafond pour le domaine privilégié est de 512 Mo, ce qui laisse le reste de la RAM disponible pour nos clients. Il est également typique pour nous de limiter le domaine privilégié à un seul cœur de processeur.

Me voici donc en train d'écrire du code qui fonctionnera sur un tout nouveau serveur de 6 000 $, et chaque programme doit fonctionner (idéalement) dans un plafond alloué de 100 Ko, ou éviter complètement l'allocation de mémoire dynamique.

De manière concise, j'optimise pour:

  • Empreinte mémoire
  • Trie (où la plupart de mon code passe la plupart de son temps)

Je dois également être extrêmement diligent en ce qui concerne le temps passé à attendre les verrous, à attendre les E / S ou à simplement attendre en général. Une grande partie de mon temps est consacrée à l'amélioration des bibliothèques de sockets non bloquantes existantes et à la recherche de méthodes plus pratiques de programmation sans verrouillage.

Chaque jour, je trouve un peu ironique que j'écris du code comme je l'ai fait il y a 15 ans, sur des systèmes achetés le mois dernier, en raison des progrès technologiques.

Cela est typique de tous ceux qui travaillent sur des plates-formes embarquées, même si beaucoup d'entre eux ont au moins 1 Go à leur disposition. Comme le souligne Jason, cela est également typique lors de l'écriture de programmes à exécuter sur des appareils mobiles. La liste est longue, kiosques, clients légers, cadres, etc.

Je commence à penser que les restrictions matérielles séparent vraiment les programmeurs des gens qui peuvent faire fonctionner quelque chose sans se soucier de ce qu'il consomme réellement. Je m'inquiète (votez contre moi si vous devez) quelles langues ce type complètement abstrait et cette mémoire vérifient dans le pool collectif de bon sens qui (autrefois) partageait les programmeurs de diverses disciplines.


1
+1 pour l'angle d'impression du pied mémoire. Je n'ai jamais codé contre les contraintes particulières que vous rencontrez, mais supprimez la première section sur Xen et remplacez-la par iPhone et je sais exactement d'où vous venez :-)
Jason Whitehorn

2

Résultats de recherche

En tant qu'universitaire, j'ai pensé que je devrais partager ce que j'optimise. Notez que ce n'est pas tout à fait la même chose que l'optimisation pour un temps de développement plus court. Souvent, cela signifie que le travail peut soutenir une question de recherche, mais ne pas être un produit livrable et poli. Cela pourrait être considéré comme un problème de qualité, et cela pourrait expliquer pourquoi beaucoup disent que les informaticiens (universitaires) n'ont aucune expérience du "monde réel". (Par exemple, "Ne sauraient-ils pas comment développer un produit livrable autrement?" )

C'est une ligne fine. En termes d'impact, vous voulez que votre travail soit utilisé et cité par d'autres, et l'effet Iceberg de Joel entre en jeu: un peu de poli et d'éclat peut aller très loin. Mais si vous ne jetez pas les bases d'autres projets sur lesquels s'appuyer, vous ne pourrez peut-être pas justifier le temps passé à fabriquer un produit livrable.


1
  1. Conception
    • couplage bas, modulaire
    • domaines fonctionnels concis et bien définis
    • bien documenté
    • refactor en continu pour cruft
  2. Maintenence
    • construction et débogage reproductibles
    • tests unitaires
    • tests de régression
    • contrôle de source

... après tout le reste

... enfin, optimisez pour les performances ;-)


1

Qualité / Test

Optimisez vers la qualité, en veillant à ce qu'il y ait du temps dans le calendrier de développement pour les tests, à la fois les tests unitaires et les tests après les fonctionnalités / phases.


1

Cela dépend des besoins de votre programme.

La plupart de ce que je fais est fortement contraint par la capacité de traitement et la mémoire, mais ne passe pas par de nombreux changements importants, voire aucun, au cours de l'année moyenne.

Dans le passé, j'ai travaillé sur des projets où le code est fréquemment modifié de sorte que la maintenabilité devient plus importante dans ces cas.

J'ai également travaillé sur des systèmes dans le passé où la quantité de données est le problème le plus important, même sur le disque pour le stockage, mais le plus souvent, la taille devient un problème lorsque vous devez déplacer les données beaucoup ou trop lentement lien.


1

L'élégance .

Si votre code est bien conçu, il aura plusieurs effets:

  1. Il sera plus facile à entretenir (réduction des coûts pour le client)
  2. Il sera plus facile à optimiser (pour les compilateurs JIT ou complets)
  3. Il sera plus facile à remplacer (quand vous pensez à une meilleure solution)

0

Temps de développement, absolument. J'optimise également pour la bande passante, mais je ne vais pas au binaire.


0

Depuis que je fais des installations sur plusieurs types de systèmes, de l'ordinateur central IBM aux PC, j'optimise d'abord la compatibilité, puis la taille, puis la vitesse.


0

Ça dépend

Si vous travaillez sur un système de traitement vidéo intégré en temps réel, vous optimisez la vitesse de traitement. Si vous travaillez sur un traitement de texte, vous optimisez le temps de développement.

Cependant, dans tous les cas, votre code doit fonctionner et il doit être maintenable.


0

Expressivité de mon intention.

Je veux que quelqu'un lisant mon code puisse voir facilement quelles opérations j'essayais d'appeler sur le domaine. De même, j'essaie de minimiser les indésirables non sémantiques (accolades, mots-clés 'fonction' dans js, etc.) pour faciliter la numérisation.

Bien sûr, vous devez équilibrer cela par maintenabilité. J'adore écrire des fonctions qui renvoient des fonctions et toutes sortes de techniques avancées et elles font avancer mon objectif, mais si l'avantage est faible, je préférerai m'en tenir aux techniques que les programmeurs jr solides connaissent.


-6

Tous

Temps de traitement

Les ordinateurs d'aujourd'hui sont rapides, mais loin de suffire. Il existe de nombreuses situations dans lesquelles les performances sont critiques - si vous utilisez des serveurs multimédia en streaming.

Espace de rangement

Votre client peut avoir un gros disque, disons 1 To. Lequel peut être repris par 1000 films HD, si vous voulez en faire un service c'est loin d'être suffisant, non?

Temps de développement

Eh bien, je ne sais pas si cela compte comme "optimisation", ce que je fais, c'est que j'utilise Java au lieu de C ++, et le développement est 10 fois plus rapide. J'ai l'impression de dire ce que je pense directement à l'ordinateur, très directement en avant et totalement rock!

BTW Je crois que pour accélérer le développement de votre processus de développement, vous devez choisir java, ne jamais essayer de détritus comme python ... qui prétend qu'ils peuvent vous raccourcir le temps DEV.


Vous pourriez trouver cette lecture intéressante: paulgraham.com/avg.html - elle discute de la force des langages de programmation.

3
Avec un temps et un budget limités, vous ne pouvez pas passer du temps sur chacun d'eux - il doit y avoir une priorité.
JBRWilkinson

@JRBWilkinson Eh bien, devrait être au cas par cas
tactoth
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.