Ce qui est plus rapide: de nombreux ifs, ou bien si?
Je suis une itération à travers un tableau de tri et de par les valeurs dans les jours de la semaine.
Pour le faire, je suis en utilisant de nombreux if
consolidés. Faut-il faire une différence dans la vitesse de traitement si j'utilise de nombreux if
s, par rapport à un ensemble de else if
états?
- Je ne sais pas à propos de la vitesse de traitement, mais si vous avez tellement de nombreux cas, si les blocs, peut-être vous devriez envisager d'utiliser une instruction switch. Surtout pour quelque chose comme les jours de la semaine.
- Il ya un énorme changement dans la fonction lors de la modification de nombreux cas, si les relevés d'un if-elseif déclaration. Pensez à ce que votre code n'a vraiment.
Vous devez vous connecter pour publier un commentaire.
Oui, utilisez un d'autre si, considérons le code suivant:
de
dans le second cas, si predicateA est vrai, predicateB (et toutes les autres prédicats) n'auront pas besoin d'être évalué (et donc tout le code s'exécutera plus rapidement), alors que dans le premier exemple, si predicateA est vrai, predicateB va toujours être évaluées, et vous pouvez également obtenir de l'inattendu, surprenant si predicateA et predicateB ne sont pas mutuellement exclusives.
Je doute qu'un micro-optimisation, cela ne faire une différence mesurable dans votre code.
Votre algorithme de tri est plus susceptible d'être la source d'un problème de performance. Qui algorithme de tri que vous choisissez est critique, pas beaucoup de "si" et de "else if".
Mise à JOUR:
Les points soulevés par les autres à propos de "else if" être un meilleur choix, en raison de sa sortie précoce et exclusif de logique caractéristiques suggèrent qu'il devrait être préféré à "si" dans ce cas.
Mais le point sur l'algorithme de choix tient toujours - sauf si votre jeu de données est très faible.
Il est évident que O(log n) serait mieux que O(n^2), mais la taille de la donnée questions. Si vous avez seulement quelques éléments, vous pourriez ne pas remarquer la différence. Dans ce cas, le codage d'une méthode inefficace dans la plus propre, plus lisible, plus facilement compréhensible en un coup d'œil pourrait être votre meilleur pari.
Vous pouvez avoir un coup d'oeil à phpbench
Mais pour être honnête, si vous voulez optimiser à ce niveau, vous pourriez apprendre quelque chose d'autre que de php.
Pour être honnête, je ne pense pas que ce soit la manière que vous le faites en termes de performances, je doute que vous verrez la différence. Je vous conseille d'utiliser une instruction switch qui n'est pas une performance enhancment, il suffit de syntaxiquement plus agréable:
else if
serait plus rapide dans le sens que vous comparez jusqu'à ce que vous frappez une condition qui correspond à true, et vous passez le reste de laif
s.Également envisager de réorganiser la compare par ordre décroissant de fréquence.
Et à l'aide de la
switch
déclaration selon le type de données de l'objet de la comparaison.Toutefois, à ce stade, comme duffymo a suggéré, vous seriez micro de l'optimisation. Le gain de performance ne sera jamais aussi importante si vous n'avez pas choisi le bon algorithme de tri pour le travail d'abord.
J'ai fait un test si il y a une vrai différence entre les if() et si (), puis quelques elseif()
J'ai mis une grosse corde et fait près de 20 strpos() à chaque fois (x100 000) avec les deux méthodes, et il a montré ce résultat :
Il ne fait aucun doute. Je savais déjà sucessive elseif() ont été les plus rapides, même si il y a un retour dans le milieu ; il est toujours bon de mettre quelques statistiques dans la réponse.
Si les valeurs sont des entiers vous pouvez obtenir une optimisation par l'utilisation d'une table de recherche. E. g. disons que vous avez 256 valeurs qui carte dans les 7 jours, en quelque sorte, vous pourriez mettre en place un tableau de 256 cellules et chaque cellule contenait le jour de la semaine que vous vouliez. Alors au lieu de:
.. vous pourriez avoir..
Bien sûr, si vous utilisez cette technique, alors vous devriez vérifier les limites de la valeur de la première.
J'en ai mis un autre vote pour le choix d'une instruction switch() à la place.
En général, "sinon si" style peut être plus vite, parce que dans la série des ifs, chaque condition est vérifiée, l'un après l'autre; en un "else if" de la chaîne, une fois que la condition est validée, le reste est ignoré.
La manière la plus rapide serait un tableau de répartition, qui est ce que une instruction switch obtient optimisé lorsqu'il y a suffisamment de cas dans celui-ci (si il y a peu de cas d'un commutateur, il est traduit en une série de if-else vérifie dans le code machine).
La décision d'utiliser de nombreux cas, si les relevés ou un if-elseif-elseif... ne doivent pas compter sur les performances, puisque cette décision implique le déroulement du programme massivement.
Je doute que l'on puisse passer de nombreux cas, si les relevés d'un grand if-elseif sans perte de fonctionnalité.
Ses une question de conception, pas un spectacle un.
Cette question est particulièrement intéressante lorsque le
if
bloc renvoie donc à la finition de la méthode. Il s'applique également directement à la façon dont les comparateurs en Java de travail.J'ai donc l'exécution de chaque méthode (ci-dessous) 250.000.000 fois et les résultats sont comme suit:
Alors que le pire des cas prend 1,4 fois plus long que le mieux qu'on ne avis que c'est la somme de l'itération de chacune de ces méthodes de 250 millions de fois. En supposant qu'il faudrait 100ms pour un être humain de percevoir retard et que le pire/meilleure différence est de 2,58 millis cela impliquerait que vous aurait besoin de près d'un milliard de dollars (1000 * 1000 millions de dollars) itérations pour percevoir la différence entre les différentes méthodes.
En résumé: utilisation
if-else
c'est un de ces cas où l'option la plus rapide est également l'une avec plus de lisibilité et moins sujette aux erreurs.