Post a Comment
I'm a fan of .NET, and I have to say that this test was moronically executed. Not only does it conclude completely false things, such as claiming that .NET treats arrays of native types as arrays of objects, but it's also very lacking in number and quality of tests.
The bigger "memory usage" of .NET was most likely because of a different garbage collector strategy. Seeing a big allocation it reserved a bunch of extra virtual memory space anticipating more. This memory will not be actually taken until used.
I'm a fan of .NET, and I have to say that this test was moronically executed. Not only does it conclude completely false things, such as claiming that .NET treats arrays of native types as arrays of objects, but it's also very lacking in number and quality of tests.
I agree totally. This was no meaningful comparison of Java and .Net at all. Move along.
Thus, as we have seen, .NET 2.0 won 2 out of the 3 major tests – clearly besting Java 1.5 in both execution speed and real-world memory efficiency.
Since it looks like these benchmarks ended up .NET's favor, how we can expect at least 80 comments explaining exactly how and why thest tests were biased in favor of .NET.
"Since it looks like these benchmarks ended up .NET's favor, how we can expect at least 80 comments explaining exactly how and why thest tests were biased in favor of .NET."
All benchmarks are biased one way or the other. Just like statistics, benchmarks is a great vehicle for "proving" your point.
RE: java will be gone from the limelight in 5 years
Despite all the trolls that write code for Windows-Only .NET, Microsoft doesn't have a clue on how to create multiplatform software.
I'm not sure. The .NET is basically not tied too strictly to windows, let see the mono project. There is a way to create platform-independent .NET compatible sytem. It is only the Microsoft's decision. IMHO in the future the main plaform of microsoft will the .NET and not the Windows.
RE[2]: java will be gone from the limelight in 5 years
RE[3]: java will be gone from the limelight in 5 years
It was true for win3.x and 9.x. But the NT-line is a relative good thing, the NT microkernel is really good (better then linux kernel), the win32 is not the best idea (but better then the 10000 little inconsistent library and application under linux) and IMHO the .NET will replace it in the near future.
Firstly, Linux is not a microkernel.
Secondly, your priorities for what you want in a kernel will most likely be different than everyone elses. Both Linux and NT kernels have good points, and both have bad points.
Thirdly, the NT kernel is totally uncustomizable (totally closed proprietory). Whereas Linux is totally free.
Your comparation is nearly as baseless as this article. It also seems like you dont know what you are talking about. Oh, and good luck with your driver programming in C#...
RE[6]: java will be gone from the limelight in 5 years
First of all, I would say the windows GUI sucks badly too. It is just that people are so used to it that they don't notice.
Second, most java programs runs ever written runs on the serverside without much of a GUI. In some way Java act as a modern replacement for COBOL, and just like COBOL it will take a very long time before it becomes extinkt regardless how many better techniques that becomes available.
Third, .net 2.0 is newer than Java 5 (jdk1.5), and being so similar it is only natural that .net is somewhat better, just like java 1.6 will be better than java 1.5 and .net 2.0, just like java 5 was better than .net 1.0 However, most organizations can't afford to change their software platform as often as the version numbers of the development platforms change.
RE[4]: java will be gone from the limelight in 5 years
Despite all the trolls that write code for Windows-Only .NET, Microsoft doesn't have a clue on how to create multiplatform software.
With previous version(s) of Windows NT being released for multiple platforms and the Rotor project bringing a large part of the .net base framework to *nix I'd say MS is more than capable of supporting multiple platforms.
The fact that they do not support them more at this point is purely strategic for them.
The dynamic languages always will suck. Without static type system the applications always will be slow and unstable. You can write a little bit less code, but with the dynamic typing the IDE's code completition always will be less sophisticated. In long term (and with bigger projects) you will create your application with using more working hours then the tradidional languages and systems. And with .NET or Java you can use a very big class library. This class libraries are very well designed - oppisitely the most of FOSS class libs. And this class libraries are coherent, not 1000 little redundant, incompatible, buggy little library. And this libraries are precompiled, especially on .NET.
> This class libraries are very well designed
I remember using Swing a long time ago, its design is quite clean but it was also full of bugs and very slow at this time, which Sun took years to correct..
As for the dynamic vs static type debate, I remember seing that C# v3 will have locally inferenced types which should increase the readability.
I think that local type inference is an interesting middle ground: you get nearly the same type safety as static types with a much improved readability.
This is so moronic I hardly know where to start. Do you know the difference between dynamic typing and strong typing? I can't imagine why you think dynamic typing makes for slow and unstable apps. And what does code completion have to do with anything? Finally, I make a living writing .Net code and if you think the class libraries are especially well designed then it just reveals your naivety. They're acceptable, but the collection classes in particular are unwieldy and limited. It's no surprise that the roadmap for C# contains a lot of features inspired by Ruby, one of the most dynamic languages in common use.
I can't imagine why you think dynamic typing makes for slow and unstable apps.
Speed: if you use dynamic typing, your app will check the type of your variable before every instruction.
if you execute the $a=$a+1 statament your app must check the type of $a before you can add to 1 to the $a.
Stability (PHP):
$a=2;
$b="2 apple";
$c=$a+$b;
print $c; /* 4 */
Python is better (send type error if you try a+b, but the a*b is valid, the result is 2 apple2 apple).
You can create unit tests, but IMHO better if this type of bugs filtered out in compile time.
Python is better (send type error if you try a+b, but the a*b is valid, the result is 2 apple2 apple).
You should probably read up on dynamic/static vs strong/weak typing. Python, for instance, is dynamic and strongly-typed. You might not declare types in the code, but an int is an int is an int. It is an int when it is first assigned, and it is an int throughout the program. Since the type of a variable is constant, it does not need to be checked "before every instruction". Your a*b example is doing exactly what you are telling it to do, and has nothing to do with the type system. a+b is a type error, and flagged as such. So, given that python has the same runtime type safety as java and .Net, and does not have the performance penalties you ascribe to it, I ask again - how is it that dynamic languages necessarily result in slow and unstable apps? Before answering, you might want to consider that the type safety in C# and java can be trashed by upcasting to an object in one statement, then attempting to downcast to an incompatible object in the next statement. This will not be spotted at compile time, and so by your definition must make C# and java apps unstable. C++ and (especially) C are even easier to abuse.
Java != Javascript && Javascript != Java
Javascript was created by Netscape, Java on the other hand was created by Sun microsystems.
"JavaScript was first introduced and deployed in the Netscape browser version 2.0B3 in December of 1995. The choice of name proved to be a source of much confusion. There is no real relation between Java and JavaScript; their similarities are mostly in syntax (that is, both derived from C). Their semantics are quite different: notably, their object models are unrelated and largely incompatible."
http://en.wikipedia.org/wiki/Javascript#Java.2C_JavaScript.2C_and_J...
RE[2]: we've gone dynamic
In an object oriented language if an object inherits from another than the one that inherits can be used in place of it's parent class; however, depending on the language the opposite isn't always true.
ex:
obj1 base class
obj2 extends obj1 // inheritence
void foo(obj1) can take obj2 instead, but
void bar(obj2) cannot always take obj1.
Therefore one can be the other but the opposite cannot always be true.
I suppose you'll say that .NET is also better because of it's higher version?
Last I checked .NET isn't designed for a compile once, run anywhere. Please correct me if I'm wrong.
This I'd consider Java to be more suitable/desirable for me.
Because of that factor it might also be a reason why it's a little slower. It has to figure out how that OS does things. This however can be solved by coding it into the JVM. Of course I have no backing to this just me thinking out loud at 1am.
Last I checked .NET isn't designed for a compile once, run anywhere. Please correct me if I'm wrong.
This I'd consider Java to be more suitable/desirable for me.
Are you kidding? .NET was designed by MS from the beginning to be cross-platform from the ground up! MS has released versions of .NET (Rotor) for Mac OS X and at least one other OS. Then you have Mono, which takes .NET's design onto virtually every other platform. I wrote cross-platform apps in .NET every day. It rocks!
Last time I heard Mono is not going to support System.EnterpriseServices...
This has nothing to do with the platform itself being designed to be OS/system neutral. There are many C++ libraries not available on other platforms, but it doesn't mean you can't create code that runs on all of them.
The fact is the CLI was developed to be platform neutral. .NET is one implementation of this standard. The MSR runtimes, Mono, and .GNU are other implementations of the same standards. .NET and Mono also include and/or have seperately distributed platform-specific libraries not unlike most other language distributions. These libraries in no way impede one's ability to develop platform-neutral applications as the various CLI implementations have proven.
Only problem is Mono uses microsoft API's that are not part of any standard. i.e. ASP.NET and ADO.NET are not part of the ECMA standard.
Heck, even on the Mono website, they are already figuring out ways to 'get around' the patent problems.
Java seems safer from a legal perspective.
Only problem is Mono uses microsoft API's that are not part of any standard. i.e. ASP.NET and ADO.NET are not part of the ECMA standard.
And again, the availability of class libraries licensed only for specific OSes has nothing to do with the platform neutral design of the runtime architecture.
As you said, they aren't part of the standard. This in no way impedes the development of cross-platform code, nor means the standard wasn't designed with neutrality in mind. Practically all language platforms have libraries that won't work across OSes, whether for technical reasons or only due to licensing. Whether a library is limited to a particular OS/architecture is up to the developer of that library.
Java seems safer from a legal perspective.
It is true, but just because the MS and the SUN agreed. But it is not concern to any other implementations (classpath+gcj, etc) and if SUN is out of business the legal perspective of java can be very interesting. But probably the IBM also can protect their java implementation.
Here we see .NET reversing the memory outlook and besting Java by a solid margin. This indicates that since .NET treats native types – such as double – as objects, that this incurs additional object overhead. Java, on the other hand, does not treat native types as objects and therefore can save on this overhead. However, when it comes to real-world object allocation, it appears that .NET is more efficient
What bull. .NET treats "native types" (more accurately put as value types) the same as Java. They are an int takes 4 bytes a double 8 bytes etc.
There's no need for value types to have more overhead in .NET than Java an, indeeed, they don't.
When a value type needs to act as an object (like when it's used via an object or interface referfence), then and only then does it get boxed and take up more space. Normal regular calls directly on on the value type (such as Int32.ToString() etc don't require boxing).
How can you trust an article where the author clearly doesn't know what he's talking about?
When a value type needs to act as an object (like when it's used via an object or interface referfence), then and only then does it get boxed and take up more space.
Exactly. And of course Java does exactly the same, only you've got to do the boxing and unboxing manually, which is a pain in the ass.
And C# is actually more efficient when value types are combined with generics. In Java e.g. you have to manually box integers to put them into a List<Integer>. In C# you can put them into a List<int> directly, and the runtime system automatically creates a version of the List<T> code that is specialised for int's and thus does not require any boxing at all.
There's another thing to note in there.
If the Java double type is 64-bit, that means each double takes 8 bytes of memory. With 5million doubles, that adds up to 40000000 bytes of memory, but the Java test shows 19.9MB which is ~half that.
What happens here? Does java compress the floats when they are not used, or is it that the JVM detects that they are not used, and so doesn't keep all of it in memory?
The guy who made this test is a moron who don't understand what he's talking about, plain and simple.
I noticed that too... I'm thinking Java recognizes that he hasn't done anything with his memory, he needs to be smarter than his vm and do something like:
char lst = new char[50000000];
for (int c; c < 50000000; ++c)
lst[c] = char(c%32 + 65);
That way, maybe he can trick the VM into thinking he's using that RAM.
This benchmark is pretty flawed (missing details, missing options, missing code, etc.), and by the looks of it done by someone who doesn't really have a good idea of whats going on.
I know these kinds of articles usually start a flamewar, and OSNews wants impressions - but there clearly is a lack of quality control in this case.
I know there are going to be a lot of people picking at this, in all fairness I do not care too much for either dotnet or java. I think they are great technologies they just don't excite me.
However the neutrality of this test can be called into question as we are testing the microsofts dotnet implementation on their own platform meaning they have access to private API's and the like that Sun does not have access to. Maybe this is not the case but we can't really be sure of this now can we?
How about they run these tests again on a neutral platform such as FreeBSD, it would be rather interesting to see what sort of results we got then
However the neutrality of this test can be called into question as we are testing the microsofts dotnet implementation on their own platform meaning they have access to private API's and the like that Sun does not have access to. Maybe this is not the case but we can't really be sure of this now can we?
Which private API helps .NET during selection sort? Which private API helps .NET to take up less memory for an array of objects?
Do you really believe there's a private API that makes the CPU run faster?
"Which private API helps .NET during selection sort? Which private API helps .NET to take up less memory for an array of objects?"
Couldn't tell you really mate. I think the whole "private" part of it kind of gives me a reason not to know now doesn't it...
"Do you really believe there's a private API that makes the CPU run faster?"
I doubt it, if you find one be sure to let me know...I would it really appreciate it.
Whether or not they have a private API, Microsoft does have some advantage working off their native O/S.
{and yes, MS has in the past used undocumented apis to increase performance compared to rival products on their platform}
If .Net performed worse than Java on Windows, wouldn't you be shocked?
How about we compare Mono performance vs. Kaffe?
"Whether or not they have a private API, Microsoft does have some advantage working off their native O/S.
{and yes, MS has in the past used undocumented apis to increase performance compared to rival products on their platform} "
I love it everytime someone tries to use this argument. Sun themselves did a test with this in StarOffice, and what did they find? Performance gain with undocumented API = zero.
Certain APIs are undocumented because they WILL change in the future. Once MS publically documents an API, it's very unlikely to change.
"How about we compare Mono performance vs. Kaffe?"
This has already been done, Mono won. IKVM on an old build of Mono (VM on VM, whee!) ran Java just as fast as Kaffe.
to read this article. As if either Java or .NET existed for performance reasons. .NET was not built to compete with Java in that respect, a platform comparison would be more adequate.
On the other hand I don´t think anyone could compare these two breeds to full extent.
It´s mostly a matter of personal preferences? If I were programming for Windows only, and if I hadn´t programmed in Java for so long, maybe I would consider .NET for my projects. IDEs are a real problem for .NET, you can get several powerful Java IDEs for free, and there are no counterparts in the .NET world. VS is a laugh for code-based work
As much as I like .NET, this 'benchmark' was absolutely stupid. We don't even know HOW he arrived at those numbers. For all we know, the doubles didn't do anything and didn't get allocated. Or got GCed early, in which then we'd also need to see the running time. Etc.
We don't know what sorting algorithm was used. How was it implemented? Without anything of value to actually study and draw conclusions from, this 'benchmark' has absolutely no value and smack in the face of regular .NET benchmarks that do provide full disclosure.
But the whole doubles as objects thing should have tipped off everyone that the clue is clueless.
"Last I checked .NET isn't designed for a compile once, run anywhere. Please correct me if I'm wrong.
This I'd consider Java to be more suitable/desirable for me. "
Tell that to the people who only have to maintain have to maintain 3 different codebases for 100% 'Pure Java' applications on Win, Linux and OSX. Or different builds for different appservers.
"Because of that factor it might also be a reason why it's a little slower. It has to figure out how that OS does things." No, it doesn't. It did all the figuring out when you picked which version of the JRE to install.
The only thing this 'benchmark' proved was the Hotspot VM does not do any optimizations for long running processes, which is expected to anyone with any idea about runtime optimizations, contrary to the Hotspot's proponents.
In short, this benchmark = stupid.
Actually you do know what algorithm was used: selection sort. Though knowing that is not strictly necessary so long as the same sorting algorithm is used in both cases and it is implemented in terms of the same functionality.
Your last meaningful paragraph doesn't make any sense to me, and I've only glossed over the middle of the comment. The benchmark is stupid, and the absence of source code makes it even more useless than it clearly is from the exposition. The source code though sounds like it would take about six minutes to write from scratch if anyone really cares.
Knowing it was selection sort is about as useful as knowing another benchamrk implemented a shopping cart. For all we know, the implementation could be assbackwards.
The real value of benchmarks is being able to study the results and the implementation that lead to the results so you can appropriately plan the best way to do something. In-depth and detailed benchmarks are hard to come across because it takes a lot of time, effort and resources to conduct one, which is why they're usually funded. Being a funded benchmark doesn't lessen its validity as long as you get to inspect the details from full disclosure and understand what's going on.
I vote for knife vs fork shootout. Fork is clearly superior to knife.
Is that your really weak manner of saying "I don't know what I'm talking about, stop correcting me? I didn't read the first paragraph."
As long as it's implemented in terms of precisely the same functionality on both platforms (and it clearly is since they just 'ported' the same code from one to the other) they are testing essentially the same aspects of the virtual machines. What would be much more interesting is the exact parameters used for conducting the benchmarking.
Providing the source code in this case, or even saying what algorithm is used is unimportant. It's unimportant because a single test case is completely worthless for benchmarking. It affords absolutely no advantage here because the nature of the algorithm places most of the overhead in the effectiveness of the JIT compiler, and there aren't enough tests being made to conclude anything about the VMs.
Oh, starting with the personal attacks already? Is this your really lame hypocrytical attempt to act holier than thou?
"As long as it's implemented in terms of precisely the same functionality on both platforms (and it clearly is since they just 'ported' the same code from one to the other) they are testing essentially the same aspects of the virtual machines. What would be much more interesting is the exact parameters used for conducting the benchmarking."
No. Firstly, .NET != Java. Secondly, no proof has been offered that it is just a simple port. .NET and Java are implemented differently, their VM behaviours will be different, and the class libraries will perform differently. .NET and Java are not equal. The algorithm used could have been specifically chosen to exploit weaknesses in Java. We don't even know if the tests did anything with the doubles. The only thing we got is a digested number spitted out claiming ".NET is faster than Java".
"Providing the source code in this case, or even saying what algorithm is used is unimportant. It's unimportant because a single test case is completely worthless for benchmarking. It affords absolutely no advantage here because the nature of the algorithm places most of the overhead in the effectiveness of the JIT compiler, and there aren't enough tests being made to conclude anything about the VMs."
So now you're saying the benchmark is worthless because it one uses a single test case, but it wouldn't be if the VM paramaters were given out? So now the switches are be be all and end all? Well, Hello contradictory. I'm saying it's worthless because it's too simplistic and does not disclose the full details. You can make your benchmark as complex as you want, but it will still have little real value because your implementation could be retarded, or overly biased. You can learn something about performance even from biased benchmarks by studying the details.
If you can't understand that, then there's no point continuing this discussion with you. Your arguments strike as exactly the same kind of arguments Sun uses to avoid disclosing the details of their benchmarks, and the poor arguments made for 'apples to apples' comparisons which deliberately perform unnecessary 'tweaks' to the competing system causing poorer performance.
No question benchmark is plain dumb.
As far as this statement:
"3 different codebases for 100% 'Pure Java' applications on Win, Linux and OSX" ... could you elaborate. People always throw around various complaints, without ever quantifying or at least qualifying their points.
In spirit of free discovery,
Someone who thinks benchmark is stupid.
P.S: Even though Java used to run billions of e-commerce transactions per year, with vulnerabilities counting in single digits over a period of 10 years, nothing is ever 100% perfect and no one ever writes the same code. Java provides a _specificiation_, which is free to be implemented so long as it complies with "the test suite". No test suite is ever perfect.
You never can compare a real word applications, because IMHO if you write a real word application on .NET and Java the code will be very different. The best thing what you can do the synthetic tests...
Yes, java at this moment very popular. But at this moment is nobody behind the Java, only the SUN. And the SUN is not too stable and ritch company. Yes, IBM, Oracle, etc supports Java, but this companies also supports .NET.
I mean come on, if .net is the absolute ruler except for native type memory efficiency is narrow minded to say the least. The evalutation and comparison was - to say the least - lacking and lame, not good for anything, let alone taking it as a base of comparison of .net/java. I'm not taking part of either, don't get me wrong, I'm just saying this article proves nothing beyond the lack of any working quality control in article review.
And, as if all those books/articles on managed code taught us nothing: Who cares if you sacrifice half of your clock cycles if you can save 10% of your development costs.
Not to mention, managed languages have a tendency (especially Java) to try and push you into the more efficient ways of using the VM to get the job done.. Where as, in say c, you can do whatever you want and there's no real push (although you likely won't be declaring structs with functors in them).
I really don't see the point in doing a benchmark of them. Maybe doing a benchmark of their graphics libraries, that might help out some aspiring 2d game programmers. Or, benchmark their 3d graphics libraries, maybe you'll help an aspiring cross platform 3d game programmer.
RE[2]: @Anonymous (IP: 85.66.51.---)
RE[3]: @Anonymous (IP: 85.66.51.---)
So, another completly useless test.. Big deal!
In order to compare the two frameworks you'd need a very detailed case scenario and then compare building time, code performance etc. etc.
But even then you run into heaps of issues, like flexibility and extensability.
But a performance test could be useful, but this one was just utter BS. Like many of you already commented on; how can doubles require different amounts of memory?!
A Windows funded site doing a .Net propoganda piece and handily omitting to publish the sources is about as credible as Bush not invding Iraq for oil.
Just look any 95% of Enterprise deployments (Java)
When last did ANYONE "switch" to .Nyet? It's dying, just like Microsoft and their Office revenue stream.
It's theoretically not possible to do better than a dynamic JIT compilation for certain operations.
"Positive articles about Microsoft are just not true and are FUD. Nothing positive can come out of MS"
Signed your average Linux user aka Linux Zealot(notice I didn't say open source user as Open source is way beyond linux and it has hijacked the term).
Open source the idea is great, the linux political movement--the world could do without.
With regard's to java's multiplatform capabilities, as long as your not using jni then chances are that your app will work with multiple platforms, I develop in-house mathematical applications in swing and I compile the system in my xp laptop and distribute it to different test machines, solaris, linux, windows. always the same result on all the machines. So as far as i'm concerned java's multiplatform ability is there
it's guess guess why .net beats java in the selection sort test. Autoboxing in Java isn't done in an especially efficient way - primitive types are wrapped into the heavyweight Numeric classes dynamically. I'd be willing to be the person conducting this benchmark used a Collection to store the doubles being sorted. This would result in extremely excessive overhead which could be easily dismissed by using a primitive array. So, whilst one could say that this is a flaw in Java 5, it's one that is easy to avoid.
As someone who has to write code in both languages, my experiences are that Java is faster, has better GC performance and has a better designed class library. One need only look at the .net collection classes to realise this. (This is an anecdote, so treat it as such).
I thought I'd missed a few more pages. Three, very poor, tests? I'm surprised the author didn't chuck in some code to print and time "Hello World" a few thousand times on the screen as well.
I don't know which is more embarrassing: the author thinking this was some kind of useful comparison test, or OSNews for posting such a sorry excuse for an article.
A real test would be Mono vs. Java (or if MS ever ported something to non-Windows).
.NET can be optimized for a single operating system, while Java has to be able to have an average performance on many, many operating systems.
.NET is Windows native code that just so happens to be running in a VM for the purpose of garbage collection and security. Big difference from the purpose of Java.
This is pointless. I shouldn't even be writing this post, but i couldn't let it go this time.
Compare all you want, but in the end the practical value of Java vs .NET, will differ in diffrent situations. And i'm pretty sure the "fittest" language will survive in the end. Or the "best" if you will.
"My dad is better than yours". "Gnome is better than KDE".
Please, go ahead and always look at something from only ONE perspective. Be narrow minded.
These tests are clearly biased towards .NET. Let's see how:
The machine where they did the testing has 2Gb of RAM, which puts the JVM in "server mode" automatically. In server mode, the JVM optimizes for long run execution, meaning that the startup penalty will be bigger in exchange for a potential increase in performance as the execution progresses. This works great for server applications, as they tend to have more predictable execution patterns and end up being faster than native code sometimes, due to run-time optimizations.
.NET, on the other hand, seems to be targeted (and used) mainly on the client side, where startup time matters. For this reason, and because of the JVM's server mode thing, .NET wins hands down in these tests.
For an unbiased benchmark the tests should have been longer (minutes or hours) to reduce the influence of startup overhead.
Just to back my claims up, in Server-Class Machine Detection [ http://java.sun.com/j2se/1.5.0/docs/guide/vm/server-class.html ] one can read:
"For J2SE 5.0, the definition of a server-class machine is one with at least 2 CPUs and at least 2GB of physical memory." -- The test machine is a Pentium D (dual-core) with 2Gb of RAM.
"The aim is to improve performance even if no one configures the VM to reflect the application it's running. In general, the server VM starts up more slowly than the client VM, but over time runs more quickly." -- This alone debunks these benchmarks.
It's been proven that the Hotspot does not actually do any additional optimizations for long running processes. It has different allocation and GC strategies, but JIT optimizations are zilch.
Furthermore, if you paid any attention to the 'benchmark', as stupid as it is, you'd see that the server VM must definitely start in less 375ms if the times took it into account, which certainly doesn't account for the 10000+ ms different in the second result, shooting your argument full of holes. Additionally, the graphs are proportionate, which suggests that the time taken was recorded via APIs, which in case you didn't notice, requires the VM to start first. Now, anyone can tell you that even on a 20 processor E20K, the server VM does not start in less than 375ms. Let's not even get started about the other dozen switches needed by Java to not make it look like a total laggard in properly conducted benchmarks. Switches that only help in those specific tasks and configurations.
This benchmark may be stupid and pointless, but the Java camp trying to defend Java with broken arguments is even worse.
"It's been proven that the Hotspot does not actually do any additional optimizations for long running processes. It has different allocation and GC strategies, but JIT optimizations are zilch."
Is it? Then point us all to some "proof", otherwise we will assume you are just taking that out of your ass.
The startup overhead isn't just about the startup time of the VM itself, it is about how aggressively the VM JIT compiles the code after it starts running.
If you are trying to benefit long running applications you don't start doing JIT compiling to the code right away, you collect statistics first to see what code runs frequently enough to be compiled without the JIT overhead becoming larger than the interpretation overhead of the bytecodes themeselves.
.NET, on the other hand, seems to be targeted (and used) mainly on the client side, where startup time matters. For this reason, and because of the JVM's server mode thing, .NET wins hands down in these tests.
.NET also has a server mode. One way of setting it is to make an app.config file (text file named appname.exe.config in the same directory as the app executable) with the following declaration:
<Configuration>
<runtime>
<gcServer enabled=“true“ />
</runtime>
</Configuration>
The truth is, no one really cares about benchmarks like this (i.e. my language can do a gazillion loops half a second faster than your language). Does the author really think that a business stakeholder in a project cares about stuff like that? What matters is time to market, return on investment, etc...that kind of stuff is nearly impossible to "benchmark." A real world test would be to build a large, distributed application and see:
A) Who could build it the quickest
B) Number of bugs per (n) lines of code
C) Maximum sustained number of concurrent users
D) Maximum sustained transactions/second
E) Cost of hardware to support the system at maximum throughput
The problem with this is that MS won't allow benchmarks like this with their languages/platforms unless they approve it, which of course means the results will always be in MS's favor...so we'll probably never really know the truth. In the end, it's whatever tool is best for the project at hand...and it's the stakeholders in businesses that drive projects, NOT the IT dept.
The problem with this is that MS won't allow benchmarks like this with their languages/platforms unless they approve it, which of course means the results will always be in MS's favor...so we'll probably never really know the truth.
MS does allow such benchmarks (excerpt from .NET 2.0 RTM EULA located in %systemroot%Microsoft.NET[backslash]Framework[backslash]v2.0.5 0727[backslash]Microsoft .NET Framework 2.0)
2. MICROSOFT .NET FRAMEWORK BENCHMARK TESTING. This supplement includes the .NET Framework component of the Windows operating systems (“.NET Component”). You may conduct internal benchmark testing of the .NET Component. You may disclose the results of any benchmark test of the .NET Component, provided that you comply with the following terms: (1) you must disclose all the information necessary for replication of the tests, including complete and accurate details of your benchmark testing methodology, the test scripts/cases, tuning parameters applied, hardware and software platforms tested, the name and version number of any third party testing tool used to conduct the testing, and complete source code for the benchmark suite/harness that is developed by or for you and used to test both the .NET Component and the competing implementation(s); (2) you must disclose the date (s) that you conducted the benchmark tests, along with specific version information for all Microsoft software products tested, including the .NET Component; (3) your benchmark testing was performed using all performance tuning and best practice guidance set forth in the product documentation and/or on Microsoft’s support web sites, and uses the latest updates, patches and fixes available for the .NET Component and the relevant Microsoft operating system; (4) it shall be sufficient if you make the disclosures provided for above at a publicly available location such as a website, so long as every public disclosure of the results of your benchmark test expressly identifies the public site containing all required disclosures; and (5) nothing in this provision shall be deemed to waive any other right that you may have to conduct benchmark testing. The foregoing obligations shall not apply to your disclosure of the results of any customized benchmark test of the .NET Component, whereby such disclosure is made under confidentiality in conjunction with a bid request by a prospective customer, such customer’s application(s) are specifically tested and the results are only disclosed to such specific customer. Notwithstanding any other agreement you may have with Microsoft, if you disclose such benchmark test results, Microsoft shall have the right to disclose the results of benchmark tests it conducts of your products that compete with the .NET Component, provided it complies with the same conditions above.
Edited 2005-11-06 08:42
These tests were very narrowly defined, covering only specific data types. What happens in each test if you swap out data types (double for long, char[] for String, etc)?
I'm not disputing the finding that .Net is more memory efficient than Java -- that may very well be true. I'm disputing whether this test is sufficient to show that.
Well apart all above, where is the test?
I see no any. I see someone clames .NET is better than Java. Well I think .NOT so what? Do you wish I make some graph where Java is 10^10 times faster? I mean in any benchmark we have to ask WHAT are we testing? In what conditions? I even haven't seen the java -XX parameters... I think for the raw data they have to be at least comparable (with java a little better ;-)). I still like to see some tests of .net on some solaris with 16 micros and 128Gb :-) ...or linux at least :-).
.Net has failed. It's almost official.
Cheers
Let me quote from one of them:
"Thou Shalt Render Software and Religion Asunder"
Just have all the programmers vote on the language to use and use it. If some company guideline forces you to force the programmers to use a language wich didn't win or was a close second in the vote, quit your job.
Neither .Net nor Java is a panacea. Anyone who claims either is far superior to the other is an idiot.
I prefer Java, but I, unlike the idiot .Zealots and JZealots, recognize that it is a tool. Use whatever tool works for you, but don't try to be all high and mighty claiming .Net is far superior to Java, or vice versa.
.Net supports far more languages. Java has a number of languages that target the JVM, but .Net has far more. Java isn't good enough to hold .Net's jock strap in this regard.
Java supports far more platforms. Mono is a good start, but it doesn't have the currency or platform coverage to even think about holding Java's jock strap in this area.
Why are you wasting your time reading this article? Did you think that .net wouldn't run faster on windows? Better yet, why is anyone wasting there time with .net? If you want speed under windows write c or c++ with their libs. Why are you wasting your time with .net? .Net only runs under windows so does c and c++ compiled with MS tools. Why did you think that Java would be faster in windows when it's designed to run on many platforms. How about a .net comparison with Java in linux? Oops, Java won that one since .net runs at 0 speed in linux. Everyone writing .NEt must be an idiot. They should be coding in c or c++. If you use Java, you are writing for write once run anywhere not for blazing speed.
Does no one get this? If I want to write something once and it doesn't have to run blazing fast. I write in Java. If I want to run something super fast, I code in c and assembler with the native platform tools. Could someone tell me why I would want to use a language that only runs on 1 platform that is slower then other languages available for the same platform?
Java has a purpose, what the hell is .net for? Why should a business care about .net?
I would like to try these tests using the following VM's:
1) IBM JDK 1.4.2 (or 1.5)
2) JRocket 1.5
3) Sun using 1.5.0_05 under both -client and -server modes
4) Sun 1.6 ea (for kicks...I know this is not the current VM)
I bet if the correct VM tuning params were used, the numbers would be different. Also, I have found some performance differences when running (same box) on SuSE Linux 10.
Oh, by the way, who's VM did they use in the test? Suns? IBM's? JRockets?
Also, did they set the initial and maximum heap size? This can have a huge impact on performance. I have found that for short benchmarks, setting the initial heap size made a significant difference.
Where can you get the source code and VM params used?
If the author can not provide these, then I consider these tests purely bogus.
Judging by the lack of information about command line switches it is safe to assume he
didn't know to use the -server switch
This is a classic mistake made by newbies trying to benchmark Java.
The default Java (client) compiler lacks the advanced optimization provided by the server compiler. Using SciMark the Java server compiler is much faster than .NET 2.0. Using the client compiler Java is slower than .NET. Classic newbie stuff.
Tiered compilation is being worked on (either for JDK 6 or JDK 7), which will result in the client and server compilers being combined, with the result that client applications will have access to all the optimisations provided by server compiler.
The C# and Java versions of SciMark are freely available on the net if anyone wants to compare Java (just use the -server switch!) and .NET
I'm afraid this benchmark lacks sufficient substance to have been posted on the front page.



