
This article discusses a small-scale benchmark test run on nine modern computer languages or variants:
Java 1.3.1,
Java 1.4.2, C compiled with
gcc 3.3.1,
Python 2.3.2, Python compiled with
Psyco 1.1.1, and the four languages supported by Microsoft's
Visual Studio .NET 2003 development environment:
Visual Basic,
Visual C#,
Visual C++, and
Visual J#. The benchmark tests arithmetic and trigonometric functions using a variety of data types, and also tests simple file I/O. All tests took place on a Pentium 4-based computer running Windows XP.
Update: Delphi version of the benchmark
here.
I'm talking about things like array bounds checking, every data structure being a reference to an object, GC
----------
These three are not necessarily that bad. Analysis shows that most bound checks can be eliminated ahead of time. I'm sure the Java compiler does this optimization. On the other hand, every data structure being a reference is something that is slow in Java, but doesn't need to be.
You see, the primitive/class distinction in Java is largely unnecessary. It is entirely possible for a powerful compiler to determine what should be boxed and what should not. Powerful CL/Scheme/Dylan/ML/Smalltalk compilers do such analysis. So in these languages, there are no primitive types. Everything seems to be a full object on the heap. The compiler will take care of doing things like stack-allocating variables when no references to it escape the function, or unbox an object when it can be determined that it is safe to do so.