Parce que je n'ai pas reçu la réponse à ma question sur laquelle est la plus efficace, j'ai décidé de faire quelques tests de mon propre.
J'ai testé une itération sur values()
, Arrays.asList( values() )
et EnumSet.allOf( )
.
J'ai répété ces tests de 10 000 000 de fois pour différents enum tailles. Voici les résultats du test:
oneValueEnum_testValues 1.328
oneValueEnum_testList 1.687
oneValueEnum_testEnumSet 0.578
TwoValuesEnum_testValues 1.360
TwoValuesEnum_testList 1.906
TwoValuesEnum_testEnumSet 0.797
ThreeValuesEnum_testValues 1.343
ThreeValuesEnum_testList 2.141
ThreeValuesEnum_testEnumSet 1.000
FourValuesEnum_testValues 1.375
FourValuesEnum_testList 2.359
FourValuesEnum_testEnumSet 1.219
TenValuesEnum_testValues 1.453
TenValuesEnum_testList 3.531
TenValuesEnum_testEnumSet 2.485
TwentyValuesEnum_testValues 1.656
TwentyValuesEnum_testList 5.578
TwentyValuesEnum_testEnumSet 4.750
FortyValuesEnum_testValues 2.016
FortyValuesEnum_testList 9.703
FortyValuesEnum_testEnumSet 9.266
Ce sont les résultats de tests a couru à partir de la ligne de commande. Quand j'ai couru ces tests à partir d'Eclipse, j'ai reçu un énorme soutien testValues
. Fondamentalement, il était plus petit que EnumSet
, même pour les petits les énumérations. Je crois que le gain de performance vient de l'optimisation de la matrice de itérateur en for ( val : array )
boucle.
En revanche, dès que vous avez besoin de java.util.Collection de passer autour, Arrays.asList( )
perd plus d' EnumSet.allOf
, surtout pour les petits les énumérations, qui sera, je le crois une majorité dans aucune donnée de la base de code.
Je dirais donc, vous devez utiliser
for ( final MyEnum val: MyEnum.values( ) )
mais
Iterables.filter(
EnumSet.allOf( MyEnum.class ),
new Predicate< MyEnum >( ) {...}
)
Et de n'utiliser Arrays.asList( MyEnum.values( ) )
où java.util.List
est absolument nécessaire.