2012-07-04 3 views
1

Je fais quelques exercices de programmation à la fin du chapitre quatre dans "Introduction à Java Programming: Comprehensive Version" par Y. Daniel Liang. À la question 4.18, j'ai proposé deux solutions différentes.Quel code est plus efficace? Pourquoi?

Quelle solution (PatternLoop1 ou PatternLoop2) est la plus efficace et pourquoi?

public class PatternLoop1 { 
    public static void main(String[] args) { 
     for (int counter = 0; counter < 6; ++counter) { 
      for (int counter2 = 0; counter2 <= counter; ++counter2) { 
       System.out.print(counter2 + 1); 
      } 
      System.out.println(); 
     } 
    } 
} 


public class PatternLoop2 { 
    public static void main(String[] args) { 
     for (int counter = 1; counter < 7; counter++) { 
      for (int counter2 = 1; counter2 < 7 && counter2 <= counter; counter2++) { 
       System.out.print(counter2); 
      } 
      System.out.println(); 
     } 
    } 
} 
+5

Aucun des deux n'est plus efficace. Le runtime sera complètement dominé par 'System.out.print'. –

+1

Je doute fortement que des détails mineurs puissent faire la différence en traitant deux boucles de 6 itérations chacune. – Tudor

+5

Clayton - bienvenue à SO. Nous pouvons voir que vous commencez à chercher un peu de critique à propos de votre code ... en demandant effectivement lequel est le meilleur. Jon a été bon et a essayé de t'aider. Ce que vous devez comprendre sur le reste des commentaires est que pour le code qui est ce * trivial *, il n'y a aucun avantage matériel à produire la version la plus "optimisée". Du point de vue de l'ingénierie logicielle, le meilleur code serait le code le plus facilement compréhensible (et donc maintenable). –

Répondre

7

EDIT: Je ne l'avais pas remarqué l'étiquette code-efficiency avant. La réponse ci-dessous est sur la façon dont les solutions sont - et l'efficacité du code comprend comment il est lisible, OMI. (C'est avec quelle efficacité il exprime ses objectifs.) Les différences efficacité seront infiniment petites.

En supposant que le but est d'imprimer 1, puis 1 2, puis 123 ... jusqu'à 123456 je partirais avec quelque chose entre les deux, où tous les chiffres sont ceux qui sont impliqués dans la sortie :

for (int counter = 1; counter <= 6; counter++) { 
    for (int counter2 = 1; counter2 <= counter; counter2++) { 
     System.out.print(counter2); 
    } 
    System.out.println(); 
} 

Notez que le compteur est toujours < = 6, donc on n'a pas besoin d'un contrôle supplémentaire pour être counter2 < = 6.

Notez également que plus du temps nous avons besoin de chiffres dans la gamme [ 0, n) dans mon expérience - le [1, n] exigence ici est relativement rare. Bien sûr, cela dépend de ce que vous faites, mais vous devriez penser à la façon naturelle d'exprimer la portée. Si l'inclinaison naturelle est de rendre la borne supérieure inclusive, utiliser <=; si l'inclinaison naturelle est de rendre exclusive la limite supérieure, utilisez <.

+0

Nous vous remercions de votre aide. J'essaie juste d'obtenir des commentaires de votre part. Je suis un débutant à la recherche de pratique. – Clayton

6

La réponse est que cela n'a pas d'importance. La JVM optimise déjà le code, et pour une différence triviale comme celle-ci, elle finira probablement par générer les mêmes instructions. De plus, l'optimisation est un problème très complexe et vous ne pouvez pas regarder le code et dire que c'est plus rapide. Les performances réelles dépendent de beaucoup de choses cachées comme le comportement du cache du processeur. Enfin, vous ne devriez pas essayer de faire ce genre d'optimisation en premier lieu. Ne vous embêtez pas à moins de trouver un goulot d'étranglement avec un problème de performance mesurable. Profil, profil, profil.

Questions connexes