Est-il important qu'une solution soit efficace?

9

Je résous de nombreux problèmes, principalement avec Top Coder. J'obtiendrai des réponses pour beaucoup, mais la plupart du temps je me retrouve avec une solution inefficace.

Dans les implémentations réelles - est-il vraiment important qu'une solution au problème soit efficace? Si oui, comment puis-je l'améliorer?

Fourmis
la source
4
Demandez-vous du point de vue du concours ou du point de vue des implémentations dans le monde réel?
rjzii
@RobZ: dans les implémentations du monde réel
Ant's
1
le «monde réel» couvre beaucoup de terrain. Intégré? Applications serveur? Applications mobiles? Logiciel d'ordinateur personnel mono-utilisateur? Des simulations scientifiques? Les réponses ne sont pas nécessairement les mêmes pour eux.
David Thornley

Réponses:

34

La meilleure solution est celle qui est (par ordre d'importance croissante) efficace, maintenable et faite .

^^^ C'est la seule chose que vous devez vraiment retenir de cette réponse. ^^^

L'efficacité est importante . Peut-être un peu moins qu'auparavant en raison de notre abondance de matériel, mais les performances sont une fonctionnalité . Dans un concours, l'efficacité est évidemment importante. Vous devez savoir comment écrire du code efficace. Plus important encore, vous devez connaître les meilleures pratiques qui produiront un code efficace et performant sans sacrifier la rapidité ou la maintenabilité d'une application. C'est vraiment là que la profondeur de l'expérience avec une plate-forme et un langage renvoie de nombreux rendements.

Mais le plus important (dans 95% des cas) est d'avoir une solution finie et maintenable. Sans produit fini , peu importe l' efficacité ou la maintenabilité de la solution. S'il vous faut un temps extraordinaire pour suivre et corriger un bogue ou ajouter une nouvelle fonctionnalité, peu importe l'efficacité de la solution. Mais, l'efficacité et les performances sont sans aucun doute importantes, quoi que l'on puisse dire.

Mike Cellini
la source
3
Ouaip. Et un programme terriblement inefficace qui est à la fois correct et fait vous donne quelque chose pour tester vos améliorations.
Mike Sherrill 'Cat Recall'
1
La partie la plus importante de cela est de connaître les meilleures pratiques en matière d'efficacité, en particulier dans le développement de bases de données où je mettrais personnellement l'efficacité au-dessus de la maintenabilité. Les utilisateurs se soucient désespérément des performances. J'ai souvent vu que le code plus efficace était plus difficile à maintenir, mais uniquement en raison de l'incapacité du développeur à comprendre le code le plus efficace pour commencer.Une fois que vous vous êtes familiarisé avec les techinques, vous accédez à ces techniques en premier choix. et ils deviennent plus faciles à maintenir parce que vous comprenez pourquoi ils fonctionnent.
HLGEM
@HLGEM S'il y avait une partie de cette réponse que je voudrais renforcer en tant que principe général (en plus de la première ligne), c'est connaître les meilleures pratiques pour écrire du code efficace. Et vous avez raison sur le fait que le SQL efficace est important.
Mike Cellini
8

Je suis d'accord avec Mike Cellini, la seule chose que j'ajouterais est.

Quelque chose est-il "assez efficace"? Par exemple, du point de vue de l'utilisateur, il n'y a pas beaucoup de différence entre une fonction qui se termine en 0,00001 seconde ou une qui se termine en 0,1 seconde même si l'une est beaucoup plus efficace que l'autre. Une fonction qui se termine en 10 minutes n'est pas très différente (pour l'utilisateur) d'une fonction qui se termine en 12 minutes. Dans les deux cas, l'utilisateur prendrait une tasse de café ou entreprendrait une autre tâche.

J'en suis venu à voir l'efficacité comme «un utilisateur efficace» et non comme un algorithme efficace.

Jaydee
la source
La règle générale que j'ai entendue est qu'une amélioration de 20% peut être remarquée par un utilisateur. Les deux semblent être admissibles, je pense qu'un utilisateur peut réellement ressentir une différence de réactivité entre 0,1 et 0,00001 seconde.
Chris Pitman
Chris, vous avez peut-être raison de penser qu'un utilisateur pourrait remarquer la différence entre les deux systèmes côte à côte, mais un système rendrait-il un utilisateur sensiblement plus efficace dans son travail? Mon observation (je fais cela depuis plus de 25 ans) est que les deux systèmes permettraient à l'utilisateur de faire la même quantité de travail en un temps donné.
Jaydee
2

En général, la solution la plus importante à un problème sera celle qui existe réellement et est valable pour les cas tels qu'ils existent pour votre problème. En d'autres termes, évitez l' optimisation prématurée jusqu'à ce que vous sachiez réellement que vous disposez d'un code inefficace ou d'un code efficace qui doit être plus rapide.

N'oubliez pas non plus que la meilleure solution pour votre application n'est peut-être pas la solution générale. Cas et point, il y a quelques années, un professeur a donné à notre classe un problème dans lequel nous devions imprimer les 10 premiers numéros d'un type donné (désolé, ma mémoire me fait défaut quant au type, mais c'était l'un des nombres les plus inhabituels classes) et on nous a donné un test pour vérifier que le nombre était le type donné. C'était l'étendue du problème qui nous a été donné et on nous a dit que c'était dû le lendemain avec la solution la plus efficace recevant le plein crédit. La conférence suivante, le professeur a résumé les résultats:

  • Certains élèves ont utilisé une boucle simple et la formule fournie pour vérifier que les chiffres étaient corrects et les afficher, lents mais ont fait le travail, O (n ^ 3).
  • D'autres étudiants ont fait leurs recherches et trouvé une formule qui a fait un meilleur travail de vérification pour s'assurer qu'un nombre donné était valide, ces programmes fonctionnaient beaucoup plus rapidement, O (n ^ 2).
  • Un élève a utilisé la formule lente pour générer les valeurs, puis les a copiées dans un tableau constant dans leur code et en afficher le contenu, O (n).

La solution finale a été jugée la plus efficace par le professeur. Il s'avère que le problème était en fait un exercice pour bien comprendre le problème et pas seulement pour sortir et trouver la solution la plus efficace.

Le point de ce qui précède est que, lorsqu'il s'agit de trouver une solution efficace à un problème, il est généralement préférable de passer du temps à vous assurer que vous comprenez vraiment quel est le problème avant de partir et d'écrire du code, ou d'essayer d'optimiser le code. Si vous pouvez stocker un ensemble de valeurs de référence dans un tableau constant, il vaut mieux le faire du point de vue des performances que d'essayer d'écrire un algorithme sophistiqué.

De même, n'oubliez pas que pour la plupart des applications, les développeurs eux-mêmes sont les seules personnes qui ont tendance à voir du code inefficace (quand il n'est pas inutilement inefficace!). Si vous écrivez du code propre qui ne fait exactement que ce qu'il doit faire, il y a de fortes chances que la plupart du temps, les utilisateurs ne remarquent pas de problèmes de performances lorsqu'ils travaillent avec votre programme et lorsqu'ils optimisent simplement les parties qu'ils mentionnent. vous.

rjzii
la source
2

Cela dépend de la structure du concours, mais généralement, oui: la performance est une considération la plupart du temps, selon leur documentation . Parfois, comme dans le lien suivant, vous devez chasser, mais pour citer:

Écrivez du code propre, clair et efficace. Même s'il n'y a pas d'élément de campagne de révision spécifiquement pour cela, les réviseurs sont néanmoins susceptibles de mieux réagir au code qui est facile à lire et à comprendre. Avec un code efficace, vous obtenez un avantage de performance potentiel dans les tests de stress et de référence, ainsi que des félicitations probables (et quelques points supplémentaires) des examinateurs.

La meilleure façon de s'améliorer est d'écrire du code efficace, ce que vous faites déjà. Même si vous terminez le travail, passez du temps à en améliorer l'efficacité - même après la compétition - et cela sera payant.

Vous voulez probablement aussi investir dans la théorie, comme les livres sur les algorithmes , qui peuvent vous donner deux choses: des outils plus efficaces pour résoudre un problème spécifique et des mécanismes plus efficaces pour identifier quel est le problème que vous devez résoudre.

Enfin, les cours d'informatique sont de plus en plus disponibles en ligne et couvriront le contexte que vous devez améliorer.

Daniel Pittman
la source
Il existe une nouvelle édition du manuel de conception d'algorithmes. (11 ans entre les deux). Y a-t-il quelque chose qui ne va pas avec le plus récent? D'autant plus qu'il est moins cher que l'ancien. Si oui, cela devrait peut-être être abordé dans votre réponse.
World Engineer
Non, je viens d'énumérer le premier que j'ai trouvé sur Amazon, et je n'ai pas pris la peine de vérifier qu'il s'agissait de la deuxième édition.
Daniel Pittman
1

L'efficacité d'une solution doit dépendre d'un certain nombre de facteurs. Le plus important est de savoir ce que veut votre utilisateur. Voici quelques exemples.

  1. Si vous êtes le seul utilisateur d'un bloc de code et que cela fonctionne très bien pour vous, alors vous allez probablement bien.
  2. Si votre programme va être vendu, vous devez avoir une plate-forme cible à l'esprit. Testez-le avec cette plateforme. Si le programme est exceptionnellement lent, vous devez travailler à le rendre plus efficace. Si cela vous semble correct, remettez-le aux autres utilisateurs et voyez s'ils sont d'accord.
  3. Peut-être que le programme a d'autres considérations. Si vous construisez, disons, un programme basé sur un serveur, vous devrez peut-être travailler très dur pour rendre le programme aussi efficace que possible. Ou, s'il fonctionne sur un microprocesseur, assurez-vous qu'il y fonctionne également.

Comment rendre votre code plus efficace:

  1. La première étape consiste à se faire une idée de ce qui prend le plus de temps. L'astuce consiste à faire quelque chose appelé code de profilage. Recherchez ce qui prend le plus de temps et voyez si vous pouvez trouver un moyen de le faire fonctionner plus rapidement.
  2. Le facteur limitant clé est peut-être la mémoire. Si tel est le cas, recherchez ce qui prend de gros morceaux de mémoire et voyez comment vous pouvez le réduire.

Il y a tout un domaine à l'optimisation, mais les deux conseils ci-dessus devraient au moins vous aider à démarrer.

PearsonArtPhoto
la source
1

Pour un concours, vous devez comprendre qui sont les juges et en quoi ils consistent - s'ils recherchent de bons codeurs et rien de plus, vous obtiendrez des félicitations pour un code plus efficace.

En règle générale, dans le monde réel, cela n'a pas d'importance. L'une des idées clés du développement de logiciels est "N'optimisez pas ce que vous ne savez pas doit être optimisé", puis "Optimisez uniquement lorsqu'il a été prouvé qu'il est nécessaire"

De nombreux praticiens soutiendront que cela conduit à un code gonflé et inefficace qui ne peut pas être facilement corrigé, et dans certains cas marginaux (ce qu'ils croiseront comme si c'est ce que font la plupart des codeurs toute la journée), ils sont corrects. Cependant, peu de projets de développement de logiciels ont des résultats mesurés "Performance: Plus rapide que nécessaire, Coût: Peu importe, Délai de livraison: Parfois cette décennie", Dans le monde réel, c'est généralement "Je le veux pas cher, je le veux hier, je veux ça marche ".

mattnz
la source