R(cid:201)F : 2007/II2/SUJET N(cid:6)...
A-U : 2007/2008
MinistŁre de l’Enseignement SupØrieur, de la Recherche Scienti(cid:28)que et de
la Technologie
UniversitØ de La Manouba
Ecole Nationale des Sciences de l’Informatique
Rapport de Stage d’Immersion en Entreprise
rØaliser Par
Imen BENZARTI
Sujet
SPRA
Static Performance Rule Analyser
Organisme d’accueil : Adhoc ISL
Sous la direction de : Mr Marouani Slim
EncadrØ par : Mr Hmida Haithem
Adresse : Rue Madrid 5000 Monastir
TØl : (216)73 503 303 Fax : (216)73 503 303
RØsumØ
LE Le prØsent projet s’intitule " Static Performance Rule Analyzer ", il a ØtØ rØalisØ
au sein de la sociØtØ Adhoc ISL dans le cadre du stage d’insertion en entreprise.
Le travail demandØ Øtait la dØ(cid:28)nition, implØmentation et documentation des rŁgles
de validation de code source Java, l’outil dØveloppØ valide un code source de c(cid:244)tØ
performance, il est destinØ par consØquent et en premier lieu aux dØveloppeurs.
Mots clØs : performance, test de logiciel, analyseur statique de code source.
Abstract
THE The present project is named "Static Performance Rule Analyzer" ; it was
developed in Adhoc ISL company through our internship in enterprise.
The requested work was the de(cid:28)nition, documentation, implementation and test of
the performance-oriented coding rules, the developed tool validate a Java source code
from a performance view, dedicated consequently and in the (cid:28)rst place to developers.
Key words : performance, software tests, static source code analyzer.
Remerciements
Il m’est particuliŁrement agrØable, avant de prØsenter mon (cid:247)uvre, d’exprimer toute
ma gratitude envers les personnes qui, de prØs ou de loin, m’ont apportØ leur aide.
Je tiens sincŁrement (cid:224) remercier aux encadrants Mr Hmida Haithem et Mr Ben
Selem Akram pour leur contribution dans ce travail et leurs conseils prØcieux.
Table des matiŁres
Remerciements
Introduction gØnØrale
1 PrØsentation gØnØrale
1.1 PrØsentation de la sociØtØ Adhoc
. . . . . . . . . . . . . . . . . . . . .
1.2
IntØgration dans l’Øquipe Adhoc . . . . . . . . . . . . . . . . . . . . . .
1.3 Cadre gØnØrale du travail . . . . . . . . . . . . . . . . . . . . . . . . . .
2 (cid:201)tat de l’art
2.1 Le test logiciel
. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.2 La qualitØ du code
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.3 Les analyseurs statique de code source
. . . . . . . . . . . . . . . . . .
2.4 Critique et solution proposØs . . . . . . . . . . . . . . . . . . . . . . . .
3 Les rŁgles de codage orientØes performance
3.1 Les zones de performance
. . . . . . . . . . . . . . . . . . . . . . . . .
3.1.1 Les zones de performances Java SE (J2SE) . . . . . . . . . . . .
3.1.1.1
Les entrØe/sortie . . . . . . . . . . . . . . . . . . . . .
3.1.1.2
L’objet String bu(cid:27)er . . . . . . . . . . . . . . . . . . .
iv
1
3
3
4
5
7
7
8
8
9
11
11
11
11
12
TABLE DES MATI¨RES
3.1.1.3
Les appels des mØthodes . . . . . . . . . . . . . . . . .
3.1.1.4
Les types primitifs et les types objets . . . . . . . . . .
3.1.1.5
L’accŁs aux variables instanciØes
. . . . . . . . . . . .
3.1.1.6 Class " (cid:28)nal " . . . . . . . . . . . . . . . . . . . . . . .
3.1.1.7
Les collections
. . . . . . . . . . . . . . . . . . . . . .
3.1.2
b. Les zones de performance JEE . . . . . . . . . . . . . . . . .
3.1.2.1
Les servlets . . . . . . . . . . . . . . . . . . . . . . . .
3.1.2.2
JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1.3 Les zones communes de performance . . . . . . . . . . . . . . .
3.1.3.1
Synchronisation . . . . . . . . . . . . . . . . . . . . . .
3.2 Les rŁgles de codage orientØ performance J2SE . . . . . . . . . . . . . .
3.2.1 Les rŁgles gØnØraux . . . . . . . . . . . . . . . . . . . . . . . . .
3.2.2 Les rŁgles sur les Objets . . . . . . . . . . . . . . . . . . . . . .
3.2.3 Les rŁgles des boucles . . . . . . . . . . . . . . . . . . . . . . . .
3.2.4 Les rŁgles d’exception . . . . . . . . . . . . . . . . . . . . . . . .
3.2.5 Les rŁgles des (cid:29)ux d’entrØe/sortie . . . . . . . . . . . . . . . . .
3.2.6 Les rŁgles de chaine de caractŁres (le type String) . . . . . . . .
3.2.7 Les rŁgles de collection . . . . . . . . . . . . . . . . . . . . . . .
3.2.8 Les rŁgles de synchronisation . . . . . . . . . . . . . . . . . . . .
3.3 Les rŁgles de codage orientØ performance JEE . . . . . . . . . . . . . .
3.3.1 Les rŁgles de l’API Servlet . . . . . . . . . . . . . . . . . . . . .
3.3.2 Les rŁgles JDBC . . . . . . . . . . . . . . . . . . . . . . . . . .
4 SpØci(cid:28)cation des besoins
vi
12
13
13
13
13
15
16
16
17
17
17
17
18
19
19
20
20
21
22
23
23
23
25
4.1
Introduction des besoins . . . . . . . . . . . . . . . . . . . . . . . . . .
25
TABLE DES MATI¨RES
4.2 Les besoins fonctionnels
. . . . . . . . . . . . . . . . . . . . . . . . . .
Advertisement
4.3 Les besoins non fonctionnels . . . . . . . . . . . . . . . . . . . . . . . .
4.4 Les cas d’utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5 Conception
5.1 Les choix conceptuels . . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.1 DØ(cid:28)nition de quelque Framework (cid:224) utiliser . . . . . . . . . . . .
5.1.1.1 Ant
. . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.1.2 PMD . . . . . . . . . . . . . . . . . . . . . . . . . . .
5.1.2 Choix de technologie . . . . . . . . . . . . . . . . . . . . . . . .
5.2 Conception architecturale de l’application . . . . . . . . . . . . . . . .
5.2.1 L’hiØrarchie de classe dans PMD . . . . . . . . . . . . . . . . .
5.2.2 Le design pattern Visiteur . . . . . . . . . . . . . . . . . . . . .
5.2.3 Diagramme de classe de SPRA . . . . . . . . . . . . . . . . . .
6 RØalisation
6.1 La mise en oeuvre de l’outil SPRAs . . . . . . . . . . . . . . . . . . . .
6.1.1 Classi(cid:28)cation des rŁgles
. . . . . . . . . . . . . . . . . . . . . .
6.1.2 L’ajout des rŁgles . . . . . . . . . . . . . . . . . . . . . . . . . .
6.1.3 Les rŁgles de performances implØmentØes . . . . . . . . . . . . .
6.1.3.1
Les rŁgles d’exception . . . . . . . . . . . . . . . . . .
6.1.3.2
Les rŁgles de collections
. . . . . . . . . . . . . . . . .
6.1.3.3
Les rŁgles de String . . . . . . . . . . . . . . . . . . . .
6.1.3.4
Les rŁgles des boucles
. . . . . . . . . . . . . . . . . .
6.1.3.5
Les rŁgles de JDBC . . . . . . . . . . . . . . . . . . .
6.1.3.6
Les rŁgles de synchronisation . . . . . . . . . . . . . .
vii
25
26
27
28
28
28
28
29
29
30
30
30
32
35
35
36
36
36
37
39
39
41
41
45
TABLE DES MATI¨RES
6.1.3.7
Les rŁgles sur les Objet . . . . . . . . . . . . . . . . .
6.1.3.8
RŁgles gØnØrales . . . . . . . . . . . . . . . . . . . . .
6.1.3.9 RŁgles d’entrØes sortie . . . . . . . . . . . . . . . . . .
6.1.3.10 RŁgles sur les servlets
. . . . . . . . . . . . . . . . . .
6.2 Test des rŁgles implØmentØs
. . . . . . . . . . . . . . . . . . . . . . . .
6.3 Chronogramme de travail . . . . . . . . . . . . . . . . . . . . . . . . . .
Conclusion gØnØrale
Bibliographie
A Analyse de code source Java avec PMD
A.1 L’arbre syntaxique abstraite (Abstract Syntax Tree - AST . . . . . . .
A.2 Les caractØristiques d’une rŁgle avec PMD . . . . . . . . . . . . . . . .
A.3 Comment PMD analyse les codes sources . . . . . . . . . . . . . . . . .
B Les rØgles de codage classi(cid:28)Øes selon di(cid:30)cultØ
B.1 Les rŁgles classØes faciles
. . . . . . . . . . . . . . . . . . . . . . . . .
B.2 Les rŁgles classØes moyennes . . . . . . . . . . . . . . . . . . . . . . . .
B.3 Les rŁgles classØes di(cid:30)ciles . . . . . . . . . . . . . . . . . . . . . . . . .
B.4 Les rŁgles classØes trŁs di(cid:30)ciles
. . . . . . . . . . . . . . . . . . . . . .
viii
49
50
50
52
54
55
57
58
59
59
61
62
63
63
63
63
63
Liste des (cid:28)gures
1.1 Organigramme de l’entreprise Adhoc . . . . . . . . . . . . . . . . . . .
1.2 Adhoc ISL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.1 L’hiØrarchie des classes de la bibliothŁque collection . . . . . . . . . . .
3.2 Les di(cid:27)Ørents niveaux d’une application J2EE [4]
. . . . . . . . . . . .
4
5
14
15
4.1 Le cas d’utilisation du dØveloppeur
. . . . . . . . . . . . . . . . . . . .
27
5.1 HØrarchie de classe dans PMD . . . . . . . . . . . . . . . . . . . . . . .
5.2 Les (cid:28)ls de la classe SimpleNode . . . . . . . . . . . . . . . . . . . . . .
5.3 Diagramme de classe du design pattern visiteur
. . . . . . . . . . . . .
5.4 Diagramme de classe de SPRA . . . . . . . . . . . . . . . . . . . . . .
6.1 Rapport genere du framework Spring . . . . . . . . . . . . . . . . . . .
6.2 Documentation d’une rŁgle . . . . . . . . . . . . . . . . . . . . . . . . .
6.3
les Øtapes de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.1 GØnØration de l’arbre syntaxique abstrait lors de la compilation . . . .
A.2 Construction d’AST d’un programme Java avec PMD designer . . . . .
A.3 Le (cid:28)chier favorite.xml . . . . . . . . . . . . . . . . . . . . . . . . . . . .
A.4 Exemple d’un (cid:28)chier ruleset : braces.xml
. . . . . . . . . . . . . . . . .
31
32
33
33
55
55
56
60
60
61
62
LISTE DES FIGURES
B.1 Les rŁgles classØes faciles . . . . . . . . . . . . . . . . . . . . . . . . . .
B.2 Les rŁgles classØes moyennes . . . . . . . . . . . . . . . . . . . . . . . .
Advertisement
B.3 Les rŁgles classØes moyennes . . . . . . . . . . . . . . . . . . . . . . . .
B.4 Les rŁgles classØes di(cid:30)ciles . . . . . . . . . . . . . . . . . . . . . . . . .
B.5 Les rŁgles classØes trŁs di(cid:30)ciles
. . . . . . . . . . . . . . . . . . . . . .
x
64
65
66
67
68
Liste des tableaux
3.1 Les rŁgles gØnØraux . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.2 Les rŁgles sur les Objets
. . . . . . . . . . . . . . . . . . . . . . . . . .
3.3 Les rŁgles des boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.4 Les rŁgles d’exception . . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.5 Les rŁgles des (cid:29)ux d’entrØe/sortie . . . . . . . . . . . . . . . . . . . . .
3.6 Les rŁgles de chaine de caractŁres . . . . . . . . . . . . . . . . . . . . .
3.7 Les rŁgles de collection . . . . . . . . . . . . . . . . . . . . . . . . . . .
3.8 Les rŁgles de synchronisation . . . . . . . . . . . . . . . . . . . . . . . .
3.9 Les rŁgles de l’API Servlet . . . . . . . . . . . . . . . . . . . . . . . . .
3.10 Les rŁgles JDBC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
18
18
19
20
20
21
21
22
23
24
Introduction gØnØrale
LA performance des applications devient de plus en plus le facteur le plus impor-
tant dans les solutions informatiques. En raison de son important impact sur le
dØveloppement des applications d’une part, et son aspect non fonctionnel d’autre part,
la performance reste l’attribut de qualitØ du systŁme le plus sensible qui doit Œtre me-
surØ, surveillØ et contr(cid:244)lØ conformØment aux exigences du systŁme ainsi qu’aux besoins
et aux recommandations du client.
A(cid:28)n de garantir la qualitØ du systŁme, une fois implØmentØ, le systŁme a besoin
d’Œtre surveillØ a(cid:28)n d’Øvaluer les di(cid:27)Ørents aspects de performance et de signaler n’im-
porte quel dØfaut ou faiblesse observØs.
Cependant, plusieurs outils ont ØtØ dØveloppØs pour Øvaluer la performance des ap-
plications. Ces outils rassemblent des informations pendant l’exØcution de l’application
et fournissent des indicateurs de performance qui peuvent Œtre analysØs pour identi(cid:28)er
les points faibles de la performance de l’application.
Le but de ce projet est de rØaliser un outil qui valide la performance d’un code
source Java sans recourir (cid:224) exØcuter le code c’est-(cid:224)-dire de maniŁre statique.
Le prØsent rapport synthØtise tout le travail rØalisØ dans cette perspective. Il est
organisØ en six chapitres comme suit :
(cid:21) Le premier chapitre prØsente l’organisme d’accueil (cid:224) savoir la sociØtØ Adhoc ISL.
(cid:21) Le deuxiŁme chapitre prØsente le contexte thØorique de l’application (cid:224) dØvelopper
INTRODUCTION G(cid:201)N(cid:201)RALE
2
et une Øtude de l’existant et ses limites ainsi que la solution proposØe et retenue.
(cid:21) Le troisiŁme chapitre prØsente les rŁgles de codage orientØ performance.
(cid:21) Le quatriŁme chapitre prØsente l’analyse des besoins fonctionnels et non fonction-
nels ainsi qu’une reprØsentation UML de ses spØci(cid:28)cations.
(cid:21) Le cinquiŁme chapitre est une Øtude conceptuelle de la future application.
(cid:21) Le sixiŁme chapitre est une reprØsentation de l’application rØalisØe.
Nous cl(cid:244)turons ce rapport par une conclusion qui rappelle le contexte de notre travail
ainsi que l’approche proposØe et qui ouvre les portes (cid:224) de nouvelles perspectives.
CHAPITRE1 PrØsentation gØnØrale
Le prØsent chapitre a pour objectif de situer le projet dans son cadre gØnØral (cid:224)
savoir l’entreprise accueillante, son organisation et ses principales fonctionnalitØs, ainsi
que les objectifs (cid:224) atteindre et la mØthodologie adoptØe tout au long de ce projet.
1.1 PrØsentation de la sociØtØ Adhoc
Adhoc est un centre de compØtences pour l’ingØnierie de performance, il prØsente :
(cid:21) Des services de conseil basØs sur les mØthodes d’ingØnierie pour ma(cid:238)triser la per-
formance des applications durant tout le cycle de leurs vies.
(cid:21) Des recherches et des dØveloppements consacrØs (cid:224) analyser, tester et Øvoluer la
technologie de l’ingØnierie de performance et les composants rØutilisables des ap-
plications.
Il o(cid:27)re aussi une plateforme de collaboration pour les nouvelles technologies et les
nouveaux concepts par :
(cid:21) Le partenariat avec les leaders de technologie dans le domaine de test de perfor-
mance, de la gestion des applications et de l’intØgration des mainframes.
(cid:21) La Collaboration avec des instituts de recherche et des acteurs universitaires bien
connus dans le domaine de la performance des applications.
Adhoc ISL est une sociØtØ (cid:224) responsabilitØ limitØe, totalement exportatrice, crØe (cid:224)
Monastir en janvier 2004. C’est une sociØtØ d’ingØnierie informatique spØcialisØe dans
CHAPITRE 1. PR(cid:201)SENTATION G(cid:201)N(cid:201)RALE
4
le dØveloppement et le test de performance des applications J2EE.
L’organigramme de la (cid:28)gure 1.1 ci-dessous schØmatise la position de la (cid:28)liale Adhoc
ISL dans la sociØtØ Adhoc international :
Figure 1.1 (cid:22) Organigramme de l’entreprise Adhoc
Elle a pour principal but la conception, le dØveloppement et la mise en (cid:247)uvre de
solutions informatiques ainsi que toute prestation d’Øtude, de conseil, de diagnostique
et d’audit informatique. ((cid:28)gure 1.2)
1.2 IntØgration dans l’Øquipe Adhoc
Le 16 Juin 2008, nous nous sommes rejoints (cid:224) l’Øquipe Adhoc. Suite (cid:224) une prØ-
sentation de la sociØtØ ainsi que les membres de l’Øquipe nous nous sommes installØs
dans notre bureau. A partir de ce moment-l(cid:224), nous sommes considØrØs comme l’un du
personnel d’Adhoc en termes de droits et de devoirs.
Comme tout ingØnieur de la sociØtØ, nous avons du suivre les Øtapes de dØveloppe-
ment de projet adoptØ par Adhoc et faire des tests d’Øvaluation de certaines techniques
tout en rØdigeant des documents en anglais. Ces documents sont :
(cid:21) Requirements Speci(cid:28)cation Report : ce rapport prØsente le contexte du projet et
spØci(cid:28)e les besoins fonctionnels et les besoins non fonctionnels du systŁme.
CHAPITRE 1. PR(cid:201)SENTATION G(cid:201)N(cid:201)RALE
5
Figure 1.2 (cid:22) Adhoc ISL
(cid:21) Project planning : ce document dØcrit la plani(cid:28)cation du projet (cid:224) suivre.
1.3 Cadre gØnØrale du travail
La performance est une question importante avec Java et ceci depuis que la pre-
miŁre version atteint le Web depuis quelque annØes. Rendre ces premiers programmes
s’exØcuter avec assez de rapiditØ Øtait un Ønorme dØ(cid:28) pour plusieurs dØveloppeurs.
La performance des programmes Java s’amØliore ØnormØment et n’importe quel
programme Java peut Œtre rØalisØ a(cid:28)n de s’exØcuter rapidement (cid:224) condition que le
dØveloppeur Øvite les piŁges de la performance.
Notre but est de rØaliser de outil qui teste la performance d’un programme auto-
matiquement et gØnŁrent des rapports qui listent les points faibles dans ce programme.
CHAPITRE 1. PR(cid:201)SENTATION G(cid:201)N(cid:201)RALE
6
Conclusion
Ce chapitre prØsente l’organisme d’accueil, le cadre du stage, ainsi que les objectifs (cid:224)
atteindre. En vue de suivre un avancement logique dans ce rapport, une Øtude thØorique
concernant l’Øtat de l’art fera l’objet du prochain chapitre.
CHAPITRE2 (cid:201)tat de l’art
Le dØveloppement et l’Øvolution d’un logiciel sont vus comme un processus, appelØ le
cycle de vie du logiciel. Ce cycle est composØ de plusieurs Øtapes ou phases qui commu-
niquent entre eux et dont certains Øvoluent en parallŁle. Dans chaque phase de ce cycle
existe des facteurs qui peuvent toucher (cid:224) la qualitØ et la performance de l’application.
Plus nous sommes capable de dØtecter ces anomalies le plus t(cid:244)t possible, plus notre
application est performante et la satisfaction du client est garantie. Dans ce sens est
menØ par un souci de trouver une solution qui permet de dØtecter ces problŁmes dans
la phase de dØveloppement s’intitule l’outil que nous envisageons de dØvelopper. Dans
ce chapitre nous allons prØsenter les di(cid:27)Ørentes pratiques qui permettent d’amØliorer
la qualitØ du code et Øventuellement la performance et en(cid:28)n nous allons positionner
l’outil que nous allons dØvelopper.
2.1 Le test logiciel
Tester un logiciel est le fait de dØterminer les bugs et les erreurs contenues dans
ce logiciel en le soumettant (cid:224) un jeu qui prØsentent un ensemble de donnØes et de
conditions de fonctionnement simulØes. Le but du test est d’assurer la qualitØ du code
ce qui signi(cid:28)e la recti(cid:28)cation des anomalies du logiciel, l’amØlioration de sa performance
et la vØri(cid:28)cation de son adØquation vis-(cid:224)-vis des besoins.
Distinguons plusieurs types de tests :
Tests unitaires : Ces tests sont les tests du niveau le plus bas, ils permettent de
CHAPITRE 2. (cid:201)TAT DE L’ART
8
Advertisement
tester chaque module de l’application sØparØment.
[6]
Tests d’intØgration : ces tests visent (cid:224) contr(cid:244)ler les interactions entre di(cid:27)Ørents mo-
dules ou composants de l’application en les intØgrant au sein d’un sous-systŁme.
[6]
Tests du systŁme : Ces tests sont de type bo(cid:238)te noire et visent (cid:224) assurer l’acceptation
de l’application dØveloppØe par les utilisateurs.
[6]
Tests de performance : permet de cibler les problŁmes de performance et donc d’op-
timiser les composants spØci(cid:28)Øs.
[6]
Tests de recette : ils valideront le logiciel par rapport aux besoins de l’utilisateur. Ce
qui aboutira sur l’acceptation, l’acceptation conditionnelle ou le refus du produit.
[6]
2.2 La qualitØ du code
Le code doit Œtre facile (cid:224) utiliser ce qui est garantie par le choix du design pattern
adØquat avec une documentation claire, Øgalement le code ne doit pas contenir des
erreurs par consØquence un ensemble de tests doivent Œtre con(cid:231)u ainsi que les tests
unitaires qui permettent de tester chaque module ou composant de l’application sØ-
parØment. Finalement, le code doit Œtre facile maintenir puisque rarement les logiciels
sont maintenue par leurs dØveloppeurs originaux.
2.3 Les analyseurs statique de code source
L’analyse statique de code source est l’analyse d’un logiciel qui est e(cid:27)ectuØ sans
l’exØcution de programmes qui construit ce logiciel (analyse e(cid:27)ectuØe sur l’exØcution
des programmes est connu sous le nom de l’analyse dynamique).
Dans la plupart des cas, l’analyse est e(cid:27)ectuØe sur le code source et dans d’autres
cas sur une certaine forme de code objet.
CHAPITRE 2. (cid:201)TAT DE L’ART
9
Cette analyse est gØnØralement e(cid:27)ectuØe par un outil automatisØ. La sophistication
des analyses e(cid:27)ectuØes par ces outils varie de ceux qui ne considŁrent que le comporte-
ment des di(cid:27)Ørents Øtats et dØclarations, (cid:224) ceux qui comprennent le code source complet
d’un programme dans leur analyse.
Parmi ces outils distinguons :
PMD : c’est un analyseur statique de code source Java qui dØtecte des problŁmes
tels que le code dupliquØ, le code mort (non atteint), le code non optimal ... (2) Il
implØmente plus de 175 rŁgles qui assurent le respect des conventions de codage.
FindBug : C’est un outil d’analyse statique de code objet Java c’est-(cid:224)-dire les (cid:28)chiers
.class et qui permet de dØtecter certaines erreurs comme : Mauvaise implØmenta-
tion de l’interface Cloneable (cid:21) DØ(cid:28)nition d’une variable locale non utilisØe par la
suite - ...
Checkstyle : Cet outil permet d’assurer un niveau bien dØ(cid:28)ni de qualitØ de code
source. Ses vØri(cid:28)cations portent essentiellement sur la forme et ne permettent en
rien de dire qu’un programme est correct ou complet.
2.4 Critique et solution proposØs
Vue l’importance de la performance des programmes Øcrit en Java, il est important
de rØaliser des outils qui dØtectent les causes d’une mauvaise performance.
Ces outils peuvent Œtre des analyseurs de code source Java qui applique des rŁgles
orientØ performance. NØanmoins, les outils dØj(cid:224) citØs dans le paragraphe prØcØdent ne
permettent pas explicitement de dØcerner les causes possibles d’une mauvaise perfor-
mance.
Notre travail consiste (cid:224) rØaliser un outil qui doit Œtre extensible et qui permet de
signaler les parties du code source qui sont potentiellement susceptible de nuire (cid:224) la
performance des applications.
CHAPITRE 2. (cid:201)TAT DE L’ART
10
Conclusion
Ce chapitre prØsente le contexte thØorique du projet de stage d’ØtØ qui se base
essentiellement sur la gestion des anomalies de performance des codes source Java.
Cette Øtude nous a permis de dØgager une solution contribuant dans l’amØlioration
de l’Øtat des analyseurs statiques de code source a(cid:28)n qu’il s’adapte au problŁme de
performance.
CHAPITRE3 Les rŁgles de codage
orientØes performance
Il y a une perception gØnØrale que les programmes Java sont lents, mais avec la
progression de la machine virtuelle Java et des outils de dØveloppement une applica-
tion Java (ou applet, servlet, etc) doit s’exØcuter (cid:224) la rapiditØ attendu. Avec une bonne
conception et en suivant de bonnes pratiques de codage, les applications peuvent gØ-
nØralement s’exØcuter assez vite. [5]
Plusieurs zones dans un programme Java/JEE sont sensibles de point de vue perfor-
mance, Plusieurs ce des zones peuvent Œtre rØglØe et corrigØe au prØalable pour fournir
vers la (cid:28)n une application performante qui suscite la satisfaction du client
3.1 Les zones de performance
3.1.1 Les zones de performances Java SE (J2SE)
3.1.1.1 Les entrØe/sortie
Les entØes/sorties sont particuliŁrement couteuses si elles sont mal utilisØes. En
e(cid:27)et, il existe une variØtØ de techniques pour l’amØlioration de la performance des
entrØe/sortie en Java. La plupart de ces techniques s’articulent autour de rØglage des
(cid:28)chiers d’entrØe/sortie disque, mais certaines sont applicables au entrØe/ sortie rØseau
ainsi que les fenŒtres de sortie.
CHAPITRE 3. LES R¨GLES DE CODAGE ORIENT(cid:201)ES PERFORMANCE
12
3.1.1.2 L’objet String bu(cid:27)er
L’utilisation de " += " sur le type String est trŁs coßteux, la raison est que les String
ne sont pas modi(cid:28)Øe aprŁs leurs crØation. Pour ajouter (cid:224) une chaine de caractŁre vous
devez la copier (cid:224) un Objet StringBu(cid:27)er et concatØner (cid:224) elle une autre chaine et puis
la convertir en String. StringBu(cid:27)ers sont utilisØs pour e(cid:27)ectuer des opØrations sur les
chaines, comme "+" et "+=".
3.1.1.3 Les appels des mØthodes
Le coßt de performance ØlevØ associØ aux appels de mØthode est causØ par plusieurs
e(cid:27)ets, citons le temps nØcessaire (cid:224) la mise en place de la pile d’appels et le transfert de
contr(cid:244)le a la mØthode.
Dans Java le cause principale du coßt ØlŁve de l’appel de mØthode est que ces dernier
sont par dØfaut virtuels, la mØthode rØel appelØ est dØterminØ au cours de l’exØcution
en considØrant le type de l’objet utilisØ.
Par exemple, l’objet de type Objet, duquel tous les classes dØrivent, possŁde une
mØthode appelØ hashCode(), une classe qui hØrite de la classe Objet dØ(cid:28)nie aussi la
mØthode hashCode() . Donc si nous avons un programme qui rØfØrence un objet de
type Objet, oø nous avons un appel (cid:224) la mØthode hashCode() :
public void f(Object p)
{
int h = p.hashCode() ;
}
La version appelØe de hashCode() dØpend de p : s’il est de type Objet ou d’un type
qui dØrivent de Objet. [4]
Le mot clØ " (cid:28)nale " peut accorder une optimisation importante puisqu’elle interdit
la modi(cid:28)cation de mØthodes hØritØes par des classes dØrivantes.
CHAPITRE 3. LES R¨GLES DE CODAGE ORIENT(cid:201)ES PERFORMANCE
13
Le coßt de performance des appels des mØthodes devient plus ØlevØ si la mØthode
est appelØe au sein d’une boucle plusieurs fois.
3.1.1.4 Les types primitifs et les types objets
Les types primitifs (int, double, (cid:29)oat, etc.) ne sont pas des types classe ; ils ne
possŁdent pas cette propriØtØ. Mais il y a des types classes qui peuvent prØsenter ces
types primitifs et les introduire dans la hiØrarchie Objet.
Les types objet possŁdent l’avantage de traiter les types primitifs comme des Objets.
Mais ils ont un coßt de performance trŁs important aux niveaux d’espace mØmoire et
temps d’exØcution.
3.1.1.5 L’accŁs aux variables instanciØes
L’accŁs aux variable dans un programme peut Œtre coßteux en utilisant les getters
et les setters surtout si la variable est accØdØ plusieurs fois dans une boucle.
La solution pour rØduire le coßt consiste (cid:224) crØer des copies locales pour ces variables.
3.1.1.6 Class " (cid:28)nal "
Les classes qui utilisent le mot clØ " (cid:28)nal " ne peuvent hØriter d’une classe ou Œtre
sous classØ, ceci apporte un avantage a(cid:28)n d’interdire l’introduction d’un comportement
anormale dans cette classe.
Les classes " (cid:28)nal " amØliorent la performance puisque toutes ces mØthodes sont "
(cid:28)nal " aussi.
3.1.1.7 Les collections
La plateforme Java fournis quelques structures de donnØe de base sous forme des
classes java.util.Vector et java.util.Hashtable. Bien qu’ils fussent utilisØs avec succŁs par
plusieurs dØveloppeurs, ces classes ont de nombreux problŁmes liØs (cid:224) la performance.
CHAPITRE 3. LES R¨GLES DE CODAGE ORIENT(cid:201)ES PERFORMANCE
14
A chaque version de Java des autres structures sont ajoutØe avec des algorithmes
de haute performance.
Une collection est un objet qui regroupe plusieurs ØlØments. Elles sont utilisØes
pour enregistrer, rechercher et manipuler des donnØes. Elles sont aussi utiliser pour
transmettre des donnØes d’une mØthode (cid:224) une autre.
En fournissant une bonne performance et haute qualitØ d’implØmentation des struc-
tures de donnØes utiles et des algorithmes, les collections aident (cid:224) amØliorer la perfor-
Advertisement
mance du logiciel (cid:224) dØvelopper.
La bibliothŁque des collections est basØe sur six interfaces de collection et fournit
l’implØmentation de chacune de ces interfaces et les algorithmes qui les manipulent.
La (cid:28)gure 3.1 montre l’hiØrarchie des interfaces et des classes qui construisent le
noyau de la bibliothŁque.
Figure 3.1 (cid:22) L’hiØrarchie des classes de la bibliothŁque collection
Chacune de ces interfaces est plus adØquate pour une t(cid:226)che bien dØterminØe. A(cid:28)n
d’atteindre la vitesse d’exØcution minimale et l’utilisation optimale de la mØmoire, le
dØveloppeur doit utiliser l’implØmentation la plus adØquate pour son application.
CHAPITRE 3. LES R¨GLES DE CODAGE ORIENT(cid:201)ES PERFORMANCE
15
3.1.2 b. Les zones de performance JEE
JEE utilise un model distribuØe multi-tiers. Ce modŁle inclut gØnØralement un ni-
veau client, un niveau de contr(cid:244)le et le niveau system d’information de l’entreprise
(Enterprise Information System EIS). Le niveau client peut Œtre une ou plusieurs ap-
plications ou un navigateur. La plateforme JEE se trouve au niveau contr(cid:244)le au milieu
et consiste (cid:224) un serveur web et un serveur de EJB (Entreprise Java Bean). Nous pou-
vons avoir d’autres niveaux au milieu. Le troisiŁme niveau EIS composØ des applications
existantes, des (cid:28)chiers et des bases de donnØes [4]. ( 3.2)
Figure 3.2 (cid:22) Les di(cid:27)Ørents niveaux d’une application J2EE [4]
Pour la conservation des donnØes, la plateforme JEE nØcessite une base de donnØes
accessible (cid:224) travers JDBC, SQLJ, or JDO API.
CHAPITRE 3. LES R¨GLES DE CODAGE ORIENT(cid:201)ES PERFORMANCE
16
La performance de l’application est importante dans chacun de ces niveaux. Nous
nous intØressons particuliŁrement (cid:224) deux zones de performance : Les Servlets (niveau
contr(cid:244)le), JDBC (EIS)
3.1.2.1 Les servlets
Servlet prØsente une extension du serveur Http. Elle prend une requŒte http comme
entrØe et renvois une rØponse Http au client comme sortie.
L’API Servlet fournis deux packages : javax.servlet et javax.http.servlet. Ces deux
packages contiennent des interfaces et des classes qui manipulent les fonctionnalitØs http
a(cid:28)n de permettre au dØveloppeur d’Øcrire une Servlet en Java qui re(cid:231)oit des requŒte
http du client et lui envois des rØponses http. Le client est dans la plupart des cas un
navigateur.
La Servlet est chargØ en mØmoire par le moteur de Servlet elle fait appel a la
mØthode init() (cid:224) la premier requŒte puis seulement la mØthode service() est appelØ
pour les requŒte d’aprŁs. A la (cid:28)n la mØthode destroy() est appelØ lorsque la Servlet est
enlevØ par le moteur de Servlet.
3.1.2.2 JDBC
JDBC est utilisØ pour accØder (cid:224) des bases de donnØes relationnelles. La connexion
JDBC supporte l’exØcution et la crØation des requŒtes.
Ces requŒte peuvent Œtre des requŒte de mise (cid:224) jour pour SQL par exemple
CREATE, INSERT, UPDATE et DELETE ou des requŒtes de lecture de donnØes
ainsi que SELECT. En outre les appels des procØdures enregistrØes dans la base. Une
requŒte est confondue avec l’un des trois types suivant :
Statement : pour les requŒtes qui ne s’exØcutent pas plusieurs fois.
PreparedStatement : pour les requŒtes qui sont exØcutØ plusieurs fois.
CallableStatement : pour l’exØcution des procØdures enregistrØes dans la base.
[4]
CHAPITRE 3. LES R¨GLES DE CODAGE ORIENT(cid:201)ES PERFORMANCE
17
3.1.3 Les zones communes de performance
3.1.3.1 Synchronisation
Dans notre contexte, la synchronisation signi(cid:28)e l’exclusion mutuelle ; le block syn-
chronisØ doit Œtre atomique c’est-(cid:224)-dire accessible par un seule processus. La mauvaise
utilisation des synchronisations infecte dans plusieurs situations la performance des
applications car elles conduisent (cid:224) des blocages et (cid:224) des mauvaises utilisations des
ressources critiques de l’application.
Nous avons dØ(cid:28)nie dans cette partie les zones dans un programme Java/JEE sensible
de c(cid:244)tØ performance et qui peuvent, si nous ne respectons pas les rŁgles de codage,
conduire (cid:224) des temps d’exØcution Ønorme et un gaspillage de la mØmoire. Dans la
prochaine partie nous listons les rŁgles de codage orientØ performance.
3.2 Les rŁgles de codage orientØ performance J2SE
3.2.1 Les rŁgles gØnØraux
RØgle Description
GR01 Ne pas appeler la mŒme mØthode dans un test conditionnel
GR02 Ne pas instancier des variables inutilisables
GR03 Ne pas utiliser des appels aux mØthodes pour vØri(cid:28)er la condition
d’arrŒt de boucle.
CHAPITRE 3. LES R¨GLES DE CODAGE ORIENT(cid:201)ES PERFORMANCE
18
GR04 Utiliser des variables statiques pour les attributs qui ont besoin
d’Œtre a(cid:27)ectØ une seule fois.
GR05 Ne pas accØder a des variables privØs de la classe interne depuis la
classe contenant.
GR06 Rendre nulle les rØfØrences qui ne sont plus utilisable dans le pro-
gramme.
GR07 Utiliser des variables locaux au lieu des variables statiques (de
classe)
GR08 Utiliser des opØrateurs composØ, tel que n=+4, au lieu de opØrateur
primitifs, tel que n=n+4, car elles gØnŁrent moins de byte code.
GR09 Utiliser le design pattern lazy-loading pour les objets dØpendants
(ce design pattern vise (cid:224) initialiser des ØlØments "(cid:224) la demande")
GR10 Utiliser s’il est possible des mØthodes statiques et privØs et des
classes " (cid:28)nal "
Tableau 3.1 (cid:22) Les rŁgles gØnØraux
3.2.2 Les rŁgles sur les Objets
RŁgle Description
OR01 Ne pas crØer des objets dans une boucle
OR02 Utiliser des chaines de caractŁres littØral au lieu de crØer les crØer
sous forme d’objet (avec ’new ’) si le contenue est le mŒme.
OR03 Utiliser des types primitifs au lieu des types Objet.
OR04 Seulement si c’est inØvitable, utiliser des variables locaux au lieu
des variables de classe.
OR05 Garder des constructeurs simples et l’hiØrarchie d’hØritage si pos-
sible moins profonde.
OR06 (cid:201)viter d’initialiser les variables plusieurs fois.
Tableau 3.2 (cid:22) Les rŁgles sur les Objets
CHAPITRE 3. LES R¨GLES DE CODAGE ORIENT(cid:201)ES PERFORMANCE
19
3.2.3 Les rŁgles des boucles
RŁgle
description
LR01 Utiliser les entiers comme index de boucle.
LR02 Utiliser System.arraycopy()pour copier les tableaux.
LR03
(cid:201)viter l’appel de mØthode dans une boucle.
LR04 Comparer la condition de (cid:28)n de boucle avec zØro.
LR05
(cid:201)viter l’utilisation des mØthodes pour vØri(cid:28)er la condition de (cid:28)n de
boucle.
LR06
Lors de l’utilisation des opØrateurs logiques placer l’expression qui
est susceptible d’Øvaluer fausse sur l’extrŒme gauche si l’expression
contient & &.
LR07
Lors de l’utilisation des opØrateurs logiques placer l’expression qui
est susceptible d’Øvaluer vrai sur l’extrŒme gauche si l’expression
contient ||.
LR08 Ne pas traiter des exceptions dans une boucle.
Tableau 3.3 (cid:22) Les rŁgles des boucles
3.2.4 Les rŁgles d’exception
RŁgle description
ER01 SpØci(cid:28)ez le type d’exceptions lorsque vous manipulez l’exception
dans le bloc catch.
ER02 SpØci(cid:28)ez le type d’exceptions lorsque vous lancez l’exception dans
la clause throws.
ER03 Ne pas utiliser les exceptions pour contr(cid:244)ler le (cid:29)ux du programme.
ER04 Utilisez toujours le bloc (cid:28)nally pour libØrer les ressources nØcessaires
pour prØvenir les fuites de ressources.
CHAPITRE 3. LES R¨GLES DE CODAGE ORIENT(cid:201)ES PERFORMANCE
20
ER05 Traiter l’exception localement si possible.
Tableau 3.4 (cid:22) Les rŁgles d’exception
3.2.5 Les rŁgles des (cid:29)ux d’entrØe/sortie
RŁgle Description
IOR01 (cid:201)viter les opØrations des informations sur les (cid:28)chier tel que
File.length() , puisqu’elle nØcessite un appel systŁme.
IOR02 Utiliser le mot clØ "transient" pour les variables inutiles qui n’ont
pas besoin d’Œtre lu/Øcrites dans les (cid:29)ux.
Advertisement
IOR03 (cid:201)vitez la lecture et l’Øcriture des donnØes en utilisant le...