Java:BenchmarkLanguages/fr

From Alexandre Navarro's Wiki

(Difference between revisions)
Jump to: navigation, search
(New page: {{Languages|Java:BenchmarkLanguages}} {{Category|Java}})
Line 1: Line 1:
{{Languages|Java:BenchmarkLanguages}}
{{Languages|Java:BenchmarkLanguages}}
-
{{Category|Java}}
+
 
 +
== Introduction ==
 +
On entend souvent parler de performance concernant ces "nouveaux" langages.
 +
 
 +
Difficile de se faire une idée en démelant les vrais arguments des
 +
ressentis subjectifs ou autres appréhensions.
 +
Nous proposons dans cet article de faire un certain nombre de tests, afin
 +
de se faire une opinion la plus objective possible.
 +
 
 +
== Objectifs ==
 +
L'objectif est de de mesurer les performances intrinsèques de C# (csharp)
 +
versus Java.
 +
Pour ce faire nous proposons une série de tests sur un ensemble de
 +
fonctionnalités que nous jugeons représentative d'un code C# ou Java. Un
 +
benchmark C/C++ a été rajouté pour avoir une comparaison (à titre
 +
indicatif) avec ces 2 languages pseudo-compilé. Aucune description du code
 +
C/C++ ne sera présent sur le wiki mais les sources sont disponibles. Le
 +
code C/C++ est optimisé mais n'est pas ultra optimisé comme pourrait
 +
l'écrire un expert pour de la performance extrême (ce qui est aussi le cas
 +
pour le java ou le C#).
 +
 
 +
{{Warning|L'idée n'est pas d'écrire un code hyper optimisé pour arriver à
 +
un résultat particulier, mais plutôt d'utiliser les mécanismes standards
 +
offerts par ces langages. '''Le code managé (unsafe) ou C/C++ wrappé est
 +
hors scope''' pour le C#.
 +
A contrario, si un langage propose plusieurs solutions pour arriver au même
 +
resultat, nous choisirons la plus performante.}}
 +
 
 +
* Ce que ne couvre pas cette étude:
 +
::* Les couches graphiques.
 +
::* Les outils autour des langages.
 +
::* Le wrapping du C++.
 +
 
 +
== Environnement de Test ==
 +
 
 +
Le détail de l'environnement de compil/run se trouve
 +
'''[[/TestEnvironment|ICI]]'''.
 +
 
 +
== Procedure de test ==
 +
 
 +
La procédure de test se trouve '''[[/TestProcedure|ICI]]'''.
 +
 
 +
== La liste des tests ==
 +
* [[/GetterSetterTest|Getter et setter sur les objets]]
 +
* [[/InvokationTest|Appel de methode]]
 +
* [[/CollectionTest|Les containers (Array, List, Map, ...)]]
 +
* [[/CreationTest|Création d'objets (Pas de Pool d'objets, Pas d'Objet sur
 +
la stack)]]
 +
* [[/ArithmeticTest|Calculs arithmétiques (+, -, /, *) ]]
 +
* [[/ThreadingTest|Le Multithreading]]
 +
* [[/AutoboxingTest|L'autoboxing (overhead)]]
 +
* [[/FileTest|File manipulation (Read, Write)]]
 +
* [[/TimingTest|La gestion du temps]]
 +
* [[/RecursiveTest|La récursivité]]
 +
* [[/StringConcatTest|La gestion des Strings]]
 +
* [[/NestedLoopsTest|Nested Loops]]
 +
* [[/MatrixMultiplyTest|Calcul de matrice]]
 +
* [[/ExceptionTest|La gestion des exceptions]]
 +
* [[/HeapSortTest|Tri de tableau]]
 +
* [[/ReflectionTest|Reflection]]
 +
* [[/EnumTest|Enum]]
 +
* [[/TrigoTest|Calculs trigonométriques (sin, cos, tan, exp, log, sqrt)]]
 +
 
 +
 
 +
Les tests sont plus ou moins dans l'ordre de leur importance pour les
 +
performances.
 +
Attention, les commentaires ont été fait seuelement à partir des résultats
 +
de l'environnement 1 dont les résultats diffèrent un petit peu de
 +
l'environnement 2.
 +
 
 +
<createarticle>
 +
type=createarticle
 +
preload=Archi:JavaCsharpPerf/TemplateTest
 +
default=MyTestName
 +
prefix=Archi:
 +
subpage=JavaCsharpPerf
 +
buttonlabel=Create a new test page
 +
align = left
 +
parameter1=value
 +
parameter2=value
 +
 
 +
</createarticle>
 +
 
 +
== Synthese des résulats ==
 +
 
 +
Sur les graphiques, moins le temps est important, mieux c'est.
 +
 
 +
Le meilleur temps de chaque test est mis abitrairement à 1 afin de montrer
 +
le rapport entre le meilleur temps et les autres.
 +
 
 +
=== Environnement 1 ===
 +
 
 +
[[Image:summary-benchmark.png]]
 +
 
 +
{| class="wikitable sortable" style="text-align:center"
 +
! Test Name !! Java (windows x86) !! C# (windows x86)!! C/C++ (VS windows
 +
x86)
 +
|-
 +
| align=left | [[/GetterSetterTest|Getter Setter]] ||1.01||2.97||1
 +
|-
 +
| align=left | [[/InvokeTest|Invoke]] ||1||3.6||2.53
 +
|-
 +
| align=left | [[/CollectionTest|Collection]] ||1||2.46||7.6
 +
|-
 +
| align=left | [[/CreationTest|Creation]] ||1||1.39||126.76
 +
|-
 +
| align=left | [[/ArithmeticTest|Arithmetic]] ||1||1.53||1.03
 +
|-
 +
| align=left | [[/ThreadingTest|Threading]] ||1||1.49||0
 +
|-
 +
| align=left | [[/AutoboxingTest|Autoboxing]] ||1||1.72||0
 +
|-
 +
| align=left | [[/FileTest|File]] ||1||1.03||1.08
 +
|-
 +
| align=left | [[/TimingTest|Timing]] ||1||11.51||1.12
 +
|-
 +
| align=left | [[/RecusiveTest|Recusive]] ||1||3.52||2.63
 +
|-
 +
| align=left | [[/StringConcatTest|StringConcat]] ||1||1.07||1.44
 +
|-
 +
| align=left | [[/NestedLoopsTest|Nested Loops]] ||1||3.47||2.47
 +
|-
 +
| align=left | [[/MatrixMultiplyTest|Matrix Multiply]] ||1.75||1.7||1
 +
|-
 +
| align=left | [[/HeapSortTest|HeapSort]] ||1||1.14||1.1
 +
|-
 +
| align=left | [[/ExceptionTest|Exception]] ||1||20.13||25.56
 +
|-
 +
| align=left | [[/ReflectionTest|Reflection]] ||1||40.23||0
 +
|-
 +
| align=left | [[/EnumTest|Enum]] ||1||38.95||0
 +
|-
 +
| align=left | [[/TrigoTest|Trigo]] ||10.61||1||1.29
 +
 
 +
|}
 +
 
 +
=== Environnement 2 ===
 +
 
 +
[[Image:summary-benchmark-1-env2.png]]
 +
 
 +
[[Image:summary-benchmark-2-env2.png]]
 +
 
 +
{| class="wikitable sortable" style="text-align:center"
 +
! Test Name !! Java (windows x86) !! Java (linux x86) !! Java (linux
 +
x86_64) !! C# (windows x86) !! C/C++ (VS windows x86)!! C/C++ g++ (linux
 +
x86_64))
 +
|-
 +
| align=left | [[/GetterSetterTest|Getter Setter]]
 +
||1.02||1.02||1.08||1.89||1.22||1
 +
|-
 +
| align=left | [[/InvokeTest|Invoke]] ||1.01||1.06||1||2.38||2.16||1.27
 +
|-
 +
| align=left | [[/CollectionTest|Collection]]
 +
||1||1.01||1.3||2.11||5.63||1.95
 +
|-
 +
| align=left | [[/CreationTest|Creation]]
 +
||1||1.02||2.04||1.28||53.55||39.6
 +
|-
 +
| align=left | [[/ArithmeticTest|Arithmetic]]
 +
||1.06||1.5||1||1.55||1.04||1.02
 +
|-
 +
| align=left | [[/ThreadingTest|Threading]] ||1.01||1.04||1||1.48||0||0
 +
|-
 +
| align=left | [[/AutoboxingTest|Autoboxing]] ||1.17||1.18||1.76||1||0||0
 +
|-
 +
| align=left | [[/FileTest|File]] ||4.06||2.5||1||3.61||3.97||1.92
 +
|-
 +
| align=left | [[/TimingTest|Timing]] ||1||10.77||5.98||15.14||1.17||7.86
 +
|-
 +
| align=left | [[/RecusiveTest|Recusive]] ||1.03||1.03||1||1.73||1.8||1.17
 +
|-
 +
| align=left | [[/StringConcatTest|StringConcat]]
 +
||1.25||1.23||1.08||1||1.11||1.28
 +
|-
 +
| align=left | [[/NestedLoopsTest|Nested Loops]]
 +
||2||2||1||5.89||4.37||7.63
 +
|-
 +
| align=left | [[/MatrixMultiplyTest|Matrix Multiply]]
 +
||2.74||2.74||1.8||2.47||1.58||1
 +
|-
 +
| align=left | [[/HeapSortTest|HeapSort]] ||1.11||1.12||1.12||1.12||1.01||1
 +
|-
 +
| align=left | [[/ExceptionTest|Exception]]
 +
||1||1.16||1.04||9.96||12.74||16.89
 +
 
 +
|-
 +
| align=left | [[/ReflectionTest|Reflection]] ||1||1.31||1.13||21.03||0||0
 +
|-
 +
| align=left | [[/EnumTest|Enum]] ||1.12||1||1.13||42.02||0||0
 +
|-
 +
| align=left | [[/TrigoTest|Trigo]] ||7.5||6.23||6.75||1||1.37||1.4
 +
|-
 +
|}
 +
 
 +
 
 +
Les tests indiqués à 0 en C/C++ n'ont été effectués.
 +
* soit car cela n'a pas de sens (Autoboxing)
 +
* soit car cela a un sens très différent (Enum)
 +
* soit car cela est impossible à faire dans le langage (Reflection)
 +
* soit car le test est complexe à faire (différents suivant les
 +
environnements, différentes implémentations possibles notamment pour les
 +
thread : pthread, thread windows, boost) et par manque de temps (Threading)
 +
 
 +
== Source et Résultats ==
 +
 
 +
[file:///\\srvparfil28\ITEC-IBD-DAI-ARC$\All\BenchmarkLanguages\benchmark-languages.rar
 +
Source + Résultats] [last update 2008-01-16]
 +
 
 +
=== Arborescence des répertoires ===
 +
 
 +
*benchmark-languages
 +
** benchmark-cpp : projet C/C++ avec un fichier README.txt pour savoir
 +
comment compiler et runner les tests
 +
*** src/main/cpp : source C/C++
 +
** benchmark-csharp : projet C# avec un fichier README.txt pour savoir
 +
comment compiler et runner les tests
 +
*** src/main/csharp: source C#
 +
** benchmark-java : projet java avec un fichier README.txt pour savoir
 +
comment compiler et runner les tests
 +
*** src/main/java: source java
 +
** results : résultats
 +
*** env1 : résultats pour environnement 1
 +
*** env2 : résultats pour environnement 2
 +
 
 +
== Présentation du Benchmark ==
 +
Attention les résultats obtenus sont ceux de l'environnement 1 avec les C#
 +
2.0 et non C# 3.5.
 +
 
 +
TODO A mettre à jour
 +
 
 +
[file:///\\srvparfil28\ITEC-IBD-DAI-ARC$\All\BenchmarkLanguages\PerfJavaCsharp.ppt
 +
Présentation Synthétique Benchmark Java/C++/C#]
 +
 
 +
[file:///\\srvparfil28\ITEC-IBD-DAI-ARC$\All\BenchmarkLanguages\PerfJavaCsharpDetaillee.ppt
 +
Présentation Détaillée Benchmark Java/C++/C#]
 +
 
 +
== Reviewers ==
 +
* [[/Reviewer| Remarques des différents reviewers et intégration ou pas
 +
dans le benchmark ]]
 +
 
 +
 
 +
== Auteur du benchmark ==
 +
Alexandre Navarro (alexandre.navarro@sgcib.com)
 +
 
 +
== Mainteneur du benchmark (coté archi) ==
 +
Alexandre Garcia (alexandre-itec.garcia@sgcib.com)
 +
 
 +
== Conclusion ==
 +
 
 +
=== Comparaision des languages pseudo-compilés Java-C# ===
 +
En dehors de la concaténation des chaines de caratère avec des + et les
 +
opérations trigonométriques, le java est toujours au moins aussi rapide que
 +
C# et dans de nombreux cas plus rapide voire beaucoup plus rapide.
 +
 
 +
Le java se distingue particulièrement dans tout ce qui est Création,
 +
getter, setter d'object, Invocation de méthode (surtout par interface),
 +
gestion des Collections (Array, List, Map), Timing, Exception et
 +
Reflection.
 +
 
 +
=== Comparaison du meilleur language pseudo-compilé (Java) avec le C/C++
 +
===
 +
Attention, les 2 languages ont certains concepts très différents ce qui
 +
rend certains benchmarks très avantageux pour l'un des 2 langages.
 +
 
 +
Voici 2 exemples :
 +
 
 +
Le new en java/c# (allocation de la mémoire sur le Heap déjà préalloué) est
 +
conceptuellement totalement différent du new en C++ (demande à l'OS
 +
d'allocation de la mémoire physique) et est très avantageux pour le java/C#
 +
en terme de performance (mais très désavantageux terme d'occupation
 +
mémoire).
 +
 
 +
La String en java/c# étant immutable comparé au C++ où la String est
 +
mutable, la concaténation de String avec des + n'a pas du tout le même sens
 +
en java/C# qu'en C++ et est très avantageux pour le C++.
 +
 
 +
Le C/C++ est plus rapide dans le cas de manipulation très bas niveau de
 +
registres (multiplication de matrices par exemple) et permet d'avoir une
 +
optimisation à la compilation plus importante (beaucoup de tests modifiés
 +
pour qu'ils aient du sens en C/C++) notamment pour dérouler des boucles
 +
(Nested Loops avant modification pour le tromper l'optimiseur gcc) par
 +
exemple. Même si ce n'est pas l'objet du test, C/C++ prend moins de mémoire
 +
que du Java/C#. Ces différentes raisons peuvent expliquer pourquoi il est
 +
intéressant de faire de C (pas du C++) pour faire certains choses comme un
 +
kernel d'OS (linux par exemple).
 +
 
 +
Le java permet de faire des optimisations à la compilation (un peu moins
 +
globalement que le C/C++) mais aussi à l'éxecution ce qui n'est pas
 +
possible en C/C++ (voir [http://en.wikipedia.org/wiki/Escape_analysis
 +
l'article sur l'Escape Analysis de java]). Les tests Getter Setter ont été
 +
modifiés pour qu'ils ne soient pas optimisés. Le java est très bon pour
 +
tout ce qui création d'objet sur le Heap (pouvant être + ou - contourné en
 +
C/C++ par de l'allocation sur la stack ou des pools d'objet) et
 +
l'invocation de méthode (notamment par interface / méthodes virtuelles en
 +
C/C++ et non statiques). On voit que les tests où le java est meilleur sont
 +
des tests où l'on fait de la programmation objet.
 +
 
 +
Le benchmark compare du Java, C# et du C++ pas beaucoup de C. Le C et le
 +
C++ sont différents et non pas les mêmes performance (en désavantage au
 +
C++).
 +
 
 +
Globalement on peut se rendre compte que les résultats sont souvent proches
 +
en dehors de cas particuliers comme la création des objets sur le Heap, la
 +
manipultation de Collection (stdlib pas très optimisé notamment sous Visual
 +
Studio et lié au temps mis pour mettre des objets sur le heap) et les
 +
Exception (pas très important en C/C++).
 +
 
 +
=== Précision importante ===
 +
Je précise fortement que '''CECI N'EST QU'UN BENCHMARK''' et il faut le
 +
prendre comme tel. Il se veut le plus réaliste possible et le plus objectif
 +
possible. Les rapports de performance ne seront pas les mêmes sur une vraie
 +
application de production.
 +
 
 +
== D'autres en parle ==
 +
PS: Merci de n'indiquer que des comparatifs récents.
 +
* [http://artisan.karma-lab.net/java-mono-natif-performances-comparees
 +
Java1.6 vs C#Mono vs Gcc]
 +
* [http://www.irrlicht3d.org/pivot/entry.php?id=446 C++ vs Java6]
 +
*
 +
[http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=java&lang2=csharp
 +
comparatif multi language]
 +
* [http://www.bytonic.de/html/benchmarks.html Quand Java est plus rapide
 +
que le C dans une vraie application (Quake2)]
 +
*
 +
[http://java.sun.com/developer/technicalArticles/javase/consumerjre/#Performance
 +
Encore plus de perf sous windows avec la version 1.7 et un usage intensif
 +
de DirectX]
 +
*
 +
[http://www.tommti-systems.de/go.html?http://www.tommti-systems.de/main-Dateien/reviews/languages/benchmarks.html
 +
Benchmark java, C/C++, java (attention les JVM et CLR sont très anciennes
 +
(jdk-1.4 C#-1.0)]
 +
* [http://www.kano.net/javabench/ Comparaison C/C++ et java]
 +
 
 +
== Others Links ==
 +
* [http://en.wikipedia.org/wiki/Java_performance Wikipedia Java Performance
 +
(Très bon article comme point d'entrèe)]
 +
* [http://en.wikipedia.org/wiki/Escape_analysis Article très intéressant
 +
sur l'Escape Analysis de java]
 +
* [http://en.wikipedia.org/wiki/C_Sharp#Performance C# performance]
 +
* [http://en.wikipedia.org/wiki/Comparison_of_C_Sharp_and_Java Comparaison
 +
Java / C# (features)]
 +
* [http://www.ondotnet.com/pub/a/dotnet/2003/06/23/mcinterop.html?page=1
 +
Article sur le C++/CLI avec ses désavantages et ses avantages]
 +
* [http://msdn2.microsoft.com/en-us/library/aa712981(VS.71).aspx Article
 +
explicant que l'interop entre la CLR et C++ natif/DLL utilise exactement le
 +
même méchanisme pour PInvoke et pour ManagedC+]
 +
* [http://www.asp-php.net/tutorial/asp.net/linq-2.php?page=1 Article
 +
indiquant que depuis la .Net 2.0, les CLR n'évolue plus notamment en .Net
 +
3.0 ou dans le futur .Net 3.5]
 +
* [http://java.sun.com/performance/reference/whitepapers/6_performance.html
 +
Sun Performance whitepaper (1.6)]
 +
* [http://msdn2.microsoft.com/en-us/library/ms998547.aspx C# Improving
 +
Managed Code Performance]

Revision as of 21:10, 1 April 2008

Contents

Introduction

On entend souvent parler de performance concernant ces "nouveaux" langages.

Difficile de se faire une idée en démelant les vrais arguments des ressentis subjectifs ou autres appréhensions. Nous proposons dans cet article de faire un certain nombre de tests, afin de se faire une opinion la plus objective possible.

Objectifs

L'objectif est de de mesurer les performances intrinsèques de C# (csharp) versus Java. Pour ce faire nous proposons une série de tests sur un ensemble de fonctionnalités que nous jugeons représentative d'un code C# ou Java. Un benchmark C/C++ a été rajouté pour avoir une comparaison (à titre indicatif) avec ces 2 languages pseudo-compilé. Aucune description du code C/C++ ne sera présent sur le wiki mais les sources sont disponibles. Le code C/C++ est optimisé mais n'est pas ultra optimisé comme pourrait l'écrire un expert pour de la performance extrême (ce qui est aussi le cas pour le java ou le C#).

Template:Warning

  • Ce que ne couvre pas cette étude:
  • Les couches graphiques.
  • Les outils autour des langages.
  • Le wrapping du C++.

Environnement de Test

Le détail de l'environnement de compil/run se trouve ICI.

Procedure de test

La procédure de test se trouve ICI.

La liste des tests


Les tests sont plus ou moins dans l'ordre de leur importance pour les performances. Attention, les commentaires ont été fait seuelement à partir des résultats de l'environnement 1 dont les résultats diffèrent un petit peu de l'environnement 2.

<createarticle>

type=createarticle
preload=Archi:JavaCsharpPerf/TemplateTest
default=MyTestName
prefix=Archi:
subpage=JavaCsharpPerf
buttonlabel=Create a new test page
align = left
parameter1=value
parameter2=value
</createarticle>

Synthese des résulats

Sur les graphiques, moins le temps est important, mieux c'est.

Le meilleur temps de chaque test est mis abitrairement à 1 afin de montrer le rapport entre le meilleur temps et les autres.

Environnement 1

Image:Summary-benchmark.png

Test Name Java (windows x86) C# (windows x86) C/C++ (VS windows

x86)

Getter Setter 1.012.971
Invoke 13.62.53
Collection 12.467.6
Creation 11.39126.76
Arithmetic 11.531.03
Threading 11.490
Autoboxing 11.720
File 11.031.08
Timing 111.511.12
Recusive 13.522.63
StringConcat 11.071.44
Nested Loops 13.472.47
Matrix Multiply 1.751.71
HeapSort 11.141.1
Exception 120.1325.56
Reflection 140.230
Enum 138.950
Trigo 10.6111.29

Environnement 2

Image:Summary-benchmark-1-env2.png

Image:Summary-benchmark-2-env2.png

Test Name Java (windows x86) Java (linux x86) Java (linux

x86_64) !! C# (windows x86) !! C/C++ (VS windows x86)!! C/C++ g++ (linux x86_64))

Getter Setter 1.021.021.081.891.221
Invoke 1.011.0612.382.161.27
Collection 11.011.32.115.631.95
Creation 11.022.041.2853.5539.6
Arithmetic 1.061.511.551.041.02
Threading 1.011.0411.4800
Autoboxing 1.171.181.76100
File 4.062.513.613.971.92
Timing 110.775.9815.141.177.86
Recusive 1.031.0311.731.81.17
StringConcat 1.251.231.0811.111.28
Nested Loops 2215.894.377.63
Matrix Multiply 2.742.741.82.471.581
HeapSort 1.111.121.121.121.011
Exception 11.161.049.9612.7416.89
Reflection 11.311.1321.0300
Enum 1.1211.1342.0200
Trigo 7.56.236.7511.371.4


Les tests indiqués à 0 en C/C++ n'ont été effectués.

  • soit car cela n'a pas de sens (Autoboxing)
  • soit car cela a un sens très différent (Enum)
  • soit car cela est impossible à faire dans le langage (Reflection)
  • soit car le test est complexe à faire (différents suivant les

environnements, différentes implémentations possibles notamment pour les thread : pthread, thread windows, boost) et par manque de temps (Threading)

Source et Résultats

[file:///\\srvparfil28\ITEC-IBD-DAI-ARC$\All\BenchmarkLanguages\benchmark-languages.rar

Source + Résultats] [last update 2008-01-16]

Arborescence des répertoires

  • benchmark-languages
    • benchmark-cpp : projet C/C++ avec un fichier README.txt pour savoir

comment compiler et runner les tests

      • src/main/cpp : source C/C++
    • benchmark-csharp : projet C# avec un fichier README.txt pour savoir

comment compiler et runner les tests

      • src/main/csharp: source C#
    • benchmark-java : projet java avec un fichier README.txt pour savoir

comment compiler et runner les tests

      • src/main/java: source java
    • results : résultats
      • env1 : résultats pour environnement 1
      • env2 : résultats pour environnement 2

Présentation du Benchmark

Attention les résultats obtenus sont ceux de l'environnement 1 avec les C# 2.0 et non C# 3.5.

TODO A mettre à jour

[file:///\\srvparfil28\ITEC-IBD-DAI-ARC$\All\BenchmarkLanguages\PerfJavaCsharp.ppt

Présentation Synthétique Benchmark Java/C++/C#]

[file:///\\srvparfil28\ITEC-IBD-DAI-ARC$\All\BenchmarkLanguages\PerfJavaCsharpDetaillee.ppt

Présentation Détaillée Benchmark Java/C++/C#]

Reviewers


Auteur du benchmark

Alexandre Navarro (alexandre.navarro@sgcib.com)

Mainteneur du benchmark (coté archi)

Alexandre Garcia (alexandre-itec.garcia@sgcib.com)

Conclusion

Comparaision des languages pseudo-compilés Java-C#

En dehors de la concaténation des chaines de caratère avec des + et les opérations trigonométriques, le java est toujours au moins aussi rapide que C# et dans de nombreux cas plus rapide voire beaucoup plus rapide.

Le java se distingue particulièrement dans tout ce qui est Création, getter, setter d'object, Invocation de méthode (surtout par interface), gestion des Collections (Array, List, Map), Timing, Exception et Reflection.

=== Comparaison du meilleur language pseudo-compilé (Java) avec le C/C++

=

Attention, les 2 languages ont certains concepts très différents ce qui rend certains benchmarks très avantageux pour l'un des 2 langages.

Voici 2 exemples :

Le new en java/c# (allocation de la mémoire sur le Heap déjà préalloué) est conceptuellement totalement différent du new en C++ (demande à l'OS d'allocation de la mémoire physique) et est très avantageux pour le java/C# en terme de performance (mais très désavantageux terme d'occupation mémoire).

La String en java/c# étant immutable comparé au C++ où la String est mutable, la concaténation de String avec des + n'a pas du tout le même sens en java/C# qu'en C++ et est très avantageux pour le C++.

Le C/C++ est plus rapide dans le cas de manipulation très bas niveau de registres (multiplication de matrices par exemple) et permet d'avoir une optimisation à la compilation plus importante (beaucoup de tests modifiés pour qu'ils aient du sens en C/C++) notamment pour dérouler des boucles (Nested Loops avant modification pour le tromper l'optimiseur gcc) par exemple. Même si ce n'est pas l'objet du test, C/C++ prend moins de mémoire que du Java/C#. Ces différentes raisons peuvent expliquer pourquoi il est intéressant de faire de C (pas du C++) pour faire certains choses comme un kernel d'OS (linux par exemple).

Le java permet de faire des optimisations à la compilation (un peu moins globalement que le C/C++) mais aussi à l'éxecution ce qui n'est pas possible en C/C++ (voir [http://en.wikipedia.org/wiki/Escape_analysis l'article sur l'Escape Analysis de java]). Les tests Getter Setter ont été modifiés pour qu'ils ne soient pas optimisés. Le java est très bon pour tout ce qui création d'objet sur le Heap (pouvant être + ou - contourné en C/C++ par de l'allocation sur la stack ou des pools d'objet) et l'invocation de méthode (notamment par interface / méthodes virtuelles en C/C++ et non statiques). On voit que les tests où le java est meilleur sont des tests où l'on fait de la programmation objet.

Le benchmark compare du Java, C# et du C++ pas beaucoup de C. Le C et le C++ sont différents et non pas les mêmes performance (en désavantage au C++).

Globalement on peut se rendre compte que les résultats sont souvent proches en dehors de cas particuliers comme la création des objets sur le Heap, la manipultation de Collection (stdlib pas très optimisé notamment sous Visual Studio et lié au temps mis pour mettre des objets sur le heap) et les Exception (pas très important en C/C++).

Précision importante

Je précise fortement que CECI N'EST QU'UN BENCHMARK et il faut le prendre comme tel. Il se veut le plus réaliste possible et le plus objectif possible. Les rapports de performance ne seront pas les mêmes sur une vraie application de production.

D'autres en parle

PS: Merci de n'indiquer que des comparatifs récents.

Java1.6 vs C#Mono vs Gcc]

[http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=java&lang2=csharp

comparatif multi language]

que le C dans une vraie application (Quake2)]

[http://java.sun.com/developer/technicalArticles/javase/consumerjre/#Performance

Encore plus de perf sous windows avec la version 1.7 et un usage intensif

de DirectX]

[http://www.tommti-systems.de/go.html?http://www.tommti-systems.de/main-Dateien/reviews/languages/benchmarks.html

Benchmark java, C/C++, java (attention les JVM et CLR sont très anciennes

(jdk-1.4 C#-1.0)]

Others Links

(Très bon article comme point d'entrèe)]

sur l'Escape Analysis de java]

Java / C# (features)]

Article sur le C++/CLI avec ses désavantages et ses avantages]

explicant que l'interop entre la CLR et C++ natif/DLL utilise exactement le même méchanisme pour PInvoke et pour ManagedC+]

indiquant que depuis la .Net 2.0, les CLR n'évolue plus notamment en .Net 3.0 ou dans le futur .Net 3.5]

Sun Performance whitepaper (1.6)]

Managed Code Performance]

Personal tools