Question

Un pair de mes travaille sur un rapport qui affiche l'avance hebdomadaire (du dimanche au samedi) de chaque employé dans notre petite entreprise de conseil. Il y a un morceau de code qu'il a écrit qui indique les colonnes correspondant aux jours de la semaine cible. Son algorithme est le suivant:

  1. Obtenir le jour de la semaine, le premier jour du mois est. Si c'est dimanche, définir un indicateur à zéro; sinon, réglez-le sur un.
  2. itérer tous les jours du mois. Si c'est dimanche, incrémenter le drapeau. Ensuite, si est égale à la semaine à afficher la valeur du drapeau, afficher la colonne correspondant au jour courant; sinon, cacher la colonne.

Bien sûr, le drapeau indique que la semaine en cours est.

Je suggère un autre algorithme:

  1. Obtenir les jours du mois sont les premiers (F) et dernier (L) jours de la semaine spécifiée. Par exemple, la première semaine d'Octobre 2009 débute le mardi 1er et se termine le samedi 3.
  2. itérer les colonnes correspondant aux jours 1 à F-1, et les cacher.
  3. itérer les colonnes correspondant aux jours F à L, et leur montrer.
  4. itérer à travers les colonnes correspondant aux jours L + 1 à DaysOfMonth, et les cacher.

La partie « difficile » dans mon algorithme fait partie 1. Je veux dire « difficile » comme dans « difficile à comprendre », parce que la complexité algorithmique de le faire est constant. Et mon algorithme a l'avantage d'avoir la boucle plus serrée. La boucle de mon pair fait une comparaison pour chaque jour du mois. Le mien ne fonctionne pas.

Ce fut un petit exemple et vous pourriez dire que plus d'optimisation ici est un peu trop paranoïaque. Mais son style de programmation ne change pas un peu quand nous écrivons des performances critiques code réel.

Son code est aussi plein de ces tests:

/* doSomething() doesn't change the state of the relevant variables. */
if (condition)
{
    flag++;
    if (flag > test)
        doSomething();
}
else
    if (flag >= test)
        doSomething();

Quand, bien sûr, il peut être fait comme ceci:

if (flag >= test);
    doSomething();
if (condition)
    flag++;

Que dois-je faire?!?!?!

EDIT:. I corrigé les comparaisons dans les exemples de code

Était-ce utile?

La solution

Est-ce, ou sa tâche? Si le son, laissez-le faire. Je suis une personne qui se nourrit de l'efficacité, en fait, je deviens très frustré quand quelque chose semble inefficace et est hors de mon contrôle.

Il y a plus de 200 personnes sur SO qui pourrait mettre mes idées les plus « efficaces », des algorithmes et du code de la honte. Probablement plus, vous ne pouvez pas aller par le représentant seul. Si Linus Torvalds lui-même signé, il commençait à 1 comme le reste d'entre nous.

Ce que vous devez considérer est que les gens doivent être en mesure de maintenir le code qu'ils écrivent. Cela signifie, ils doivent le comprendre comme si elles lui ont donné naissance. Même si quelqu'un a démontré un autre algorithme autant plus efficace que moi-même, je ne l'utiliserais pas à moins que j'étais confortable avec.

Si cela est un projet commun, écrire votre chemin, montrer la vitesse et puis passer de très, très patient heures avec votre pairs pour l'aider à saisir vraiment.

Regarder en arrière sur des choses que vous avez écrit il y a 5 ans, tout le monde doit apprendre en faisant et tout le monde fait des choses à leur propre rythme, en particulier l'apprentissage.

Autres conseils

Je pense que votre ami a la bonne idée. Prenez l'algorithme qui est évidemment correct sur l'algorithme qui prendrait une heure pour expliquer, mais sans objectif de performance particulier à l'esprit, est plus rapide.

Si vous avez une exigence de performance spécifique, comme « le code doit être en mesure de donner des résultats corrects pour tous les mois au cours des dix prochaines années à moins de 200 microsecondes sur la machine X », et le code plus simple échoue l'exigence, vous pouvez envisager d'utiliser votre version.

(L'exemple de code que vous avez envoyé bien évidemment mieux dans votre chemin, car il est moins alambiqué.)

D'après votre description, je ne suis pas sûr que je suis en désaccord avec votre collègue. La question clé ici est de savoir si cette pièce ou non du code est un goulot d'étranglement de performance .

Convaincre me pour passer à votre algorithme que vous auriez à profil de l'application en question et me montrer que ce morceau de code est la performance critique. Ensuite, faire votre changement et le profil de nouveau. De cette façon, vous avez une base objective comparaison .

S'il y a une différence significative entre les deux algorithmes, puis les deux vous pouvez discuter de l'opportunité de faire le changement, il est ou non utile.

Si vous êtes inquiet au sujet des temps de chargement des pages d'une application web, rappelez-vous les leçons de Sites Web de haute performance et les directives de performance Yahoo -. comment vous gérez CSS, javascript et la mise en cache aura un impact beaucoup plus important que l'optimisation des algorithmes qui fonctionnent sur votre serveur

l'optimisation Prônant sans mesure est tout aussi dangereux que sans tenir compte des conséquences sur les performances des algorithmes naïfs.

Eh bien, vous ne devriez pas interférer car il est évident que vous avez tort ... Les deux morceaux de code ne sont pas équivalents. Il suffit de prendre la condition = 1, indicateur = 0 et test = 1

G'day,

Je vous suggère que vous privilégiez la simplicité algorithmiques qui effectue au sein de vos contraintes sur des algorithmes intelligents, trop compliqués qui fournissent aucun gain réel. Dans mon expérience, ces sortes de trucs trop intelligent plus que probablement tourner être un cauchemar d'entretien futur!

Cette idée est mieux exprimée par la citation suivante:

  

« Le programmeur compétent est pleinement conscient de la taille strictement limitée de son crâne et, par conséquent, il se rapproche de la tâche de programmation dans l'humilité pleine, et entre autres il évite des trucs intelligents comme la peste. » - Edsger Dijkstra 1972 dans son ACM Turing Conférence « Le Humble programmeur "

BTW Ce document est une excellente lecture! Avec plusieurs de ses autres documents qui sont disponibles en ligne sur le EWDijkstra Archive

HTH

Cheers,

je ne vois pas le problème ici ... bien que sa version dispose d'une façon petit rond-point de se rendre à l'objectif, il ne s'y rendre.

Cette déclaration que je vais dire ne devrait pas être pris hors contexte: mais il y aura toujours des gens qui le font comme ça - et ce n'est pas mal, bien au contraire ... il ne sait peut-être pas un bonne façon de faire quelque chose, mais il ne sait comment obtenir le résultat, peu importe la laideur de sa méthode.
Cela peut être une véritable bouée de sauvetage quand personne ne connaît l'algorithme correct pour quelque chose ... les chances sont qu'il va bande de canard il en quelque sorte.

Je suis d'accord avec le sentiment qui prévaut ici: si une amélioration de la performance rendrait le code beaucoup plus difficile à lire, il vaut mieux être une bonne raison de faire ce changement

.

D'autre part, cela ne signifie pas que nous devrions toujours se contenter de la première chose qui vient à l'esprit . Parfois, il y a clairement des alternatives supérieures qui sont tout aussi lisibles ou presque.

Si vous voulez convaincre votre collègue de prendre son choix d'algorithmes au sérieux, vous devez choisir vos batailles avec soin. Ne pas essayer de tourner le monde à l'envers et la force de la question sur tous les cas unique que vous trouvez. Commencez par faire vos suggestions que lorsque vous pouvez penser à un algorithme de remplacement qui est manifestement supérieure et aussi claire, et être prêt à reculer s'il résiste.

Si vous vous sentez sournoise, vous pourriez même lui donner des conseils, poser des questions tendancieuses, ou tout autre technique que vous pouvez penser pour l'aider à le découvrir par lui-même.

Je ressens votre douleur. Les programmeurs sont vraiment stubburn dans la nature. Tout le monde a ses propres principes et règles de construction des programmes. Si d'autres opinions entrent en collision avec un peu d'alors, changer l'opinion du programmeur est comme déplacer des piliers de Fundament d'un immeuble de gratte-ciel. :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top