Il est peu probable que la différence ait de l'importance ou soit visible, mais le deuxième exemple pourrait être plus rapide. Pourquoi? Dans Oracle/OpenJDK, moins le code d'octet utilisé par une méthode est élevé, plus elle peut être optimisée, par ex. inline.
Il existe un certain nombre de seuils pour savoir quand une méthode pourrait être optimisée et ces seuils sont basés sur le nombre d'octets de code d'octet. Le deuxième exemple utilise moins de code octet, il est donc possible qu'il soit optimisé davantage. Une de ces optimisations est l'analyse d'échappement qui pourrait éliminer l'utilisation de synchronized
pour l'objet local de thread. Cela le rendrait beaucoup plus rapide. Le seuil pour l'analyse d'échappement est la méthode qui est inférieure à 150 octets (après inlining) par défaut. Vous pouvez voir des cas où la première solution fait la méthode un peu plus de 150 octets et la seconde est un peu moins de 150 octets.
REMARQUE:
- ne pas écrire le code sur cette base, les différents à la matière trop trivial. La clarté du code est loin, beaucoup plus importante.
- Si la performance est importante, l'utilisation d'une alternative comme AtomicInteger est susceptible d'être d'un ordre de grandeur plus rapide. (uniformément, pas seulement dans de rares cas)
- BTW AFAIK les bibliothèques de concurrence utilisent peu de
assert
instructions, non pas parce qu'ils ne sont pas optimisés mais parce qu'ils comptent encore à la taille du code de byte et ralentissent indirectement leur utilisation en signifiant dans Dans certains cas, le code n'est pas aussi optimal. (Cette affirmation de la mienne devrait avoir une référence, mais je ne pouvais pas le trouver)
Les deux sont une seule et même chose si ce n'est que votre code. – SMA
Avez-vous jeté un coup d'œil au bytecode? – Turing85
Oui, je pense que cette question ne peut être résolue qu'en montrant le bytecode. Je suppose que ce sera pareil, rendant la réponse évidente, mais sans vérifier je ne peux pas être sûr. Aussi, je ne suis pas sûr si JLS exige un certain bytecode spécifique, ou si une bonne réponse vérifie à la fois OpenJDK et le JDK d'Oracle. – hyde