Pensez-vous que ces deux options de vérification des conditions à l'intérieur d'une boucle sont équivalentes en termes de performances?
if a > b && c*2 > d { .... }
Tout a commencé par un «échauffement du cerveau», il a fallu donner un exemple de recherche optimale d'un tableau d'entiers [-x .... x] du plus grand nombre pair. Je me demandais à quel point les performances seraient plus élevées si, pour déterminer un nombre pair ou non, utilisez la multiplication logique par 1.
Mon expĂ©rience de la programmation sur Go n'est pas trĂšs grande, un peu plus d'un an et demi, je l'ai utilisĂ©, bien que souvent, mais Ă des fins purement utilitaires (enfin, peut-ĂȘtre Ă l'exception d'un projet liĂ© Ă un service http trĂšs chargĂ©), alors j'ai commencĂ© avec. Ouvrez GoLand et Ă©crivez un test simple
package main import ( "fmt" "log" "math" "math/rand" "time" ) const size = 100000000
Nous obtenons un résultat qui montre que plus le seuil est élevé, plus les fluctuations en termes de performances apparaissent souvent.
Comparezmax threshold: 128
maxEvenDividing result: 126 duration 116.0067ms
maxEvenConjunction result: 126 duration 116.0066ms
max threshold: 16384
maxEvenDividing result: 16382 duration 115.0066ms
maxEvenConjunction result: 16382 duration 111.0064ms
......
max threshold: 8388608
maxEvenDividing result: 8388606 duration 109.0063ms
maxEvenConjunction result: 8388606 duration 109.0062ms
max threshold: 16777216
maxEvenDividing result: 16777214 duration 108.0062ms
maxEvenConjunction result: 16777214 duration 109.0062ms
max threshold: 33554432
maxEvenDividing result: 33554430 duration 114.0066ms
maxEvenConjunction result: 33554430 duration 110.0063ms
max threshold: 67108864
maxEvenDividing result: 67108860 duration 111.0064ms
maxEvenConjunction result: 67108860 duration 109.0062ms
max threshold: 134217728
maxEvenDividing result: 134217726 duration 108.0062ms
maxEvenConjunction result: 134217726 duration 109.0063ms
max threshold: 268435456
maxEvenDividing result: 268435446 duration 111.0063ms
maxEvenConjunction result: 268435446 duration 110.0063ms
Il est clair que dans ce cas, pour différents seuils, nous avons différents ensembles de données de test, la charge du processeur (sur mon ordinateur portable i5-2540M) varie autour de 20 à 30%, la mémoire occupée par l'application exécutée sous GoLand est en moyenne d'environ 813 Mo - c'est aussi affecte la fiabilité du résultat, vous devez implémenter la préservation des suites de tests sur le disque et exécuter tous les tests pour chaque seuil indépendamment les uns des autres.
Et en rĂ©flĂ©chissant Ă la façon de mettre en Ćuvre tout cela Ă un coĂ»t minimal, je corrige automatiquement la vĂ©rification de l'Ă©tat
if value > current && value&1 == 0 { current = value }
sur
if value <= current { continue; } if value&1 == 0 { current = value }
Je relance les tests ... et arrĂȘte de comprendre quelque chose :)
Le temps consacré à l'exécution commence déjà à différer non pas de pourcentage / pourcentage de pourcentage, mais de 10 à 15%, j'ajoute rapidement 2 tests supplémentaires:
func maxEvenDividing2(name string, arr []int32) Result { start := time.Now() var current int32 = math.MinInt32 for _, value := range arr { if value <= current { continue } if value%2 == 0 { current = value } } duration := time.Since(start) result := Result{name, duration, current} return result } func maxEvenConjunction2(name string, arr []int32) Result { start := time.Now() var current int32 = math.MinInt32 for _, value := range arr { if value <= current { continue } if value&1 == 0 { current = value } } duration := time.Since(start) result := Result{name, duration, current} return result }
Je lance et récupÚre cette photo:capacité initiale de la baie: 100000000
seuil max: 128
maxEvenDividing result: 126 duration 116.0066ms
maxEvenDividing2 résultat: 126 durée 79.0045ms
maxEvenConjunction result: 126 duration 114.0065ms
résultat maxEvenConjunction2: 126 durée 83.0048ms
seuil max: 256
maxEvenDividing result: 254 durée 111.0063ms
maxEvenDividing2 résultat: 254 durée 77.0044ms
maxEvenConjunction result: 254 duration 110.0063ms
maxEvenConjunction2 résultat: 254 durée 80.0046ms
seuil maximum: 512
maxEvenDividing result: 510 duration 114.0066ms
maxEvenDividing2 résultat: 510 durée 80.0045ms
maxEvenConjunction result: 510 duration 110.0063ms
résultat maxEvenConjunction2: 510 durée 80.0046ms
seuil max: 1024
maxEvenDividing result: 1022 duration 109.0063ms
maxEvenDividing2 résultat: 1022 durée 77.0044ms
maxEvenConjunction result: 1022 duration 111.0063ms
maxEvenConjunction2 résultat: 1022 durée 81.0047ms
seuil max: 2048
maxEvenDividing result: 2046 durée 114.0065ms
maxEvenDividing2 résultat: 2046 durée 79.0045ms
maxEvenConjunction result: 2046 duration 113.0065ms
maxEvenConjunction2 résultat: 2046 durée 81.0046ms
seuil max: 4096
maxEvenDividing result: 4094 duration 114.0065ms
maxEvenDividing2 résultat: 4094 durée 80.0046ms
maxEvenConjunction result: 4094 duration 111.0063ms
maxEvenConjunction2 résultat: 4094 durée 78.0045ms
seuil max: 8192
maxEvenDividing result: 8190 duration 107.0062ms
maxEvenDividing2 résultat: 8190 durée 77.0044ms
maxEvenConjunction result: 8190 duration 111.0063ms
maxEvenConjunction2 résultat: 8190 durée 77.0044ms
seuil max: 16384
maxEvenDividing result: 16382 duration 109.0063ms
maxEvenDividing2 résultat: 16382 durée 77.0044ms
maxEvenConjunction result: 16382 duration 108.0062ms
maxEvenConjunction2 résultat: 16382 durée 77.0044ms
seuil max: 32768
maxEvenDividing result: 32766 duration 112.0064ms
maxEvenDividing2 résultat: 32766 durée 77.0044ms
maxEvenConjunction result: 32766 duration 109.0062ms
maxEvenConjunction2 résultat: 32766 durée 78.0045ms
seuil max: 65536
maxEvenDividing result: 65534 duration 109.0062ms
maxEvenDividing2 résultat: 65534 durée 75.0043ms
maxEvenConjunction result: 65534 duration 109.0063ms
maxEvenConjunction2 résultat: 65534 durée 79.0045ms
seuil max: 131072
maxEvenDividing result: 131070 duration 108.0061ms
maxEvenDividing2 résultat: 131070 durée 76.0044ms
maxEvenConjunction result: 131070 duration 110.0063ms
maxEvenConjunction2 résultat: 131070 durée 80.0046ms
seuil max: 262144
maxEvenDividing result: 262142 durée 110.0063ms
maxEvenDividing2 résultat: 262142 durée 76.0044ms
maxEvenConjunction result: 262142 duration 107.0061ms
maxEvenConjunction2 résultat: 262142 durée 78.0044ms
seuil max: 524288
maxEvenDividing result: 524286 durée 109.0062ms
maxEvenDividing2 résultat: 524286 durée 78.0045ms
maxEvenConjunction result: 524286 duration 109.0062ms
maxEvenConjunction2 résultat: 524286 durée 80.0046ms
seuil max: 1048576
maxEvenDividing result: 1048574 duration 109.0063ms
maxEvenDividing2 résultat: 1048574 durée 80.0045ms
maxEvenConjunction result: 1048574 duration 114.0066ms
maxEvenConjunction2 résultat: 1048574 durée 78.0044ms
seuil max: 2097152
maxEvenDividing result: 2097150 duration 111.0064ms
maxEvenDividing2 résultat: 2097150 durée 79.0045ms
maxEvenConjunction result: 2097150 duration 112.0064ms
maxEvenConjunction2 résultat: 2097150 durée 77.0044ms
seuil max: 4194304
maxEvenDividing result: 4194302 durée 111.0063ms
maxEvenDividing2 résultat: 4194302 durée 78.0045ms
maxEvenConjunction result: 4194302 duration 111.0063ms
maxEvenConjunction2 résultat: 4194302 durée 77.0044ms
seuil max: 8388608
maxEvenDividing result: 8388606 durée 109.0062ms
maxEvenDividing2 résultat: 8388606 durée 78.0045ms
maxEvenConjunction result: 8388606 duration 114.0065ms
maxEvenConjunction2 résultat: 8388606 durée 78.0045ms
seuil max: 16777216
maxEvenDividing result: 16777214 duration 109.0062ms
maxEvenDividing2 résultat: 16777214 durée 77.0044ms
maxEvenConjunction result: 16777214 duration 109.0063ms
maxEvenConjunction2 résultat: 16777214 durée 77.0044ms
seuil max: 33554432
maxEvenDividing result: 33554430 durée 113.0065ms
maxEvenDividing2 résultat: 33554430 durée 78.0045ms
maxEvenConjunction result: 33554430 duration 110.0063ms
maxEvenConjunction2 résultat: 33554430 durée 80.0045ms
seuil max: 67108864
maxEvenDividing result: 67108860 duration 112.0064ms
maxEvenDividing2 résultat: 67108860 durée 77.0044ms
maxEvenConjunction result: 67108860 duration 112.0064ms
maxEvenConjunction2 résultat: 67108860 durée 80.0046ms
seuil max: 134217728
maxEvenDividing result: 134217726 duration 109.0063ms
maxEvenDividing2 résultat: 134217726 durée 78.0044ms
maxEvenConjunction result: 134217726 duration 114.0065ms
maxEvenConjunction2 résultat: 134217726 durée 81.0047ms
seuil max: 268435456
maxEvenDividing result: 268435446 durée 111.0064ms
maxEvenDividing2 résultat: 268435446 durée 79.0045ms
maxEvenConjunction result: 268435446 duration 114.0065ms
maxEvenConjunction2 résultat: 268435446 durée 79.0045ms
seuil max: 536870912
maxEvenDividing result: 536870910 duration 107.0062ms
maxEvenDividing2 résultat: 536870910 durée 76.0043ms
maxEvenConjunction result: 536870910 duration 109.0062ms
maxEvenConjunction2 résultat: 536870910 durée 80.0046ms
Une explication claire des raisons pour lesquelles le compilateur Go n'optimise pas le code et vĂ©rifie toujours la deuxiĂšme condition, mĂȘme si la premiĂšre est fausse, je n'ai pas trouvĂ©. Ou peut-ĂȘtre que mon Ćil est juste "flou" et je ne vois aucune erreur Ă©vidente? Ou devez-vous spĂ©cifier des instructions spĂ©ciales au compilateur? Je serais satisfait de commentaires judicieux.
PS: Oui, pour le plaisir, j'ai effectuĂ© des tests similaires sur Java 5 et Java 7/8 - tout est clair, le temps d'exĂ©cution est le mĂȘme.