Bonjour tous le monde,
A mon travail nous essayons de gagner du temps sur un processus de conversion de message texte en objet JAVA en fonction de leur provenance.
Je m'explique :
Si la provenance du message texte envoye provient de la societe A, alors nous chargeons le translator A. Si cela vient de la societe B alors nous chargeons le translator B. (Chaque message a ses specificites et donc chaque processus de conversion est legerement different). Pour etre plus precis ce sont des messages du protocole FIX (Financial Information eXchange).
Nous chargeons les translators une fois au demarrage du serveur via une reflection en utilisant createInstance().
Mon boss insiste sur le fait que les appels des differentes methodes d'un objet cree via reflection est beaucoup plus lent que les appels d'un objet cree via new.
En cherchant sur le net, on peut en effet voir pas mal de petits tests montrant que l'instantiation prend beaucoup plus de temps en reflexion.
1. Est ce egalement vrai pour les apppels d'un objet cree via cette reflection?
2. Nous avons reexecuter un petit test trouver sur stackoverflow prouvant que la reflection etait beaucoup plus lent. Cependant sur mon PC de travail utilisant java 8, il n y a aucune difference de performance. Voici le code :
Les classes A et B sont exactement les meme classes. Nous avons tester ce test avec l'instantiation dans la boucle et a l'exterieur de la boucle. Le second cas etait pour tester uniquement les appels de methode d'un objet cree via reflection.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40 public class Main { public static void main(String[] args) throws Exception { doRegular(); doReflection(); } public static void doRegular() throws Exception { long start = System.currentTimeMillis(); A a = new A(); int a1 = 35; double d1 = 78.9; String s = "Yoni"; for (int i=0; i<10000000; i++) { a.doSomeThing(a1, d1 ,s); } System.out.println(System.currentTimeMillis() - start); } public static void doReflection() throws Exception { long start = System.currentTimeMillis(); B a = (B) Class.forName("B").newInstance(); int a1 = 35; double d1 = 78.9; String s = "Yoni"; for (int i=0; i<10000000; i++) { a.doSomeThing(a1, d1 ,s); } System.out.println(System.currentTimeMillis() - start); } }
Nous avons execute plusieurs fois ce petit programme mais il n y a quasiment aucune difference de performance :
Output :
54418
54213
Quelqu'un peut il faire de l'ordre dans ma tete ?
Merci
Partager