CppCMS benchmarks vs Java, C#, PHP
Long time ago I had posted a benchmarks comparing CppCMS based blog and PHP based one.
I wanted to compare real life applications with each other. For a long time I had been searching for similar applications in several technologies doing very similar jobs in leading technologies: PHP, Asp.Net and Java/JSP. The last two were particularly important as they use static type system and "compiled" languages as C# and Java that are known to be faster then other dynamic typed languages like PHP, Python, Ruby and Perl popular in web development.
Setup
Unfortunately I had failed to find such application, so finally I decided to write something representative and small on my own an application with following requirements:
- Uses simple time-out based page caching
- Uses MySQL and the database and keeps open connections in pool.
- For each request access to database (if page is not cached), fetches the page content and comments for "sample article" in blog.
- Converts text to HTML using a markdown filter and displays it on page.
I used following technologies:
CppCMS:
Version: 0.99.3
MySQL Connection: dbixx/libdbi library using libmysqlclient
Markdown library: discount
Connection: internal HTTP serverPHP
Version: 5.2.6
MySQL Connection: internal driver
Markdown library: PHP-Makrdown
Connection: Lighttpd 1.4.19 + FastCGI
Bytecode Cache: XCacheAsp.Net/Mono
Version: 2.6.7
MySQL Connection: Connector/Net
Markdown library: MarkdownSharp
Connection: internal HTTP server XSP (found to be much faster than fastcgi server)JSP/Tomcat
Version - Tomcat: 6.0.18
Version - Java: Sun Java 1.6.0_12
MySQL Connection: Connector/J
Markdown library: jmd-0.8.1
Caching: oscache 2.4.1
Connection: HTTP
I tested following parameters:
- Pages per seconds generation for different cache hit/miss ratio: stating from 0% miss ratio up to 100% miss ratio.
- Memory usage
For each test the application was "warmed up" with 100 requests to fill the cache, and then 1000 request with max concurrency of 5 request are done, while certain percent of them is new pages and the other are taken from "warmed up" once.
Notes:
I used the fastest Markdown implementation I had found.
C# implementation is the same one that http://stackoverflow.com uses - it is actually heavily optimized implementation based on older C# implementation
The Java implementation is based on the above C# and the fastest one I had found.
Discount is the fastest C implementation of markdown that I had found.
Results:
Summary
- C#, Java and PHP implementation behave very similarly and without significant differences.
- The memory usage of Java/Tomcat and Mono/Asp.Net was significantly higher - up one or two orders of magnitude in comparison to CppCMS and PHP
- Surprisingly PHP behaves very well, in comparison to "compiled" languages like Java and C#.
Revisiting
After doing some profiling it was clear that C implementation of Markdown was significantly faster then all other implementations. So I decided to create my own mini-markdown that make some basic handing of titles, lists, paragraphs and quotes at one level only. That is very simple syntax but implemented similarly in all 4 languages using same algorithm.
The results were following:
The difference between CppCMS and other implementations was still significant but still much smaller then the difference between real markdown implementation. So the performance difference was less dramatic.
2nd Revision
And in the last revision I decided not to use any text filters by fetch ready HTML formatted content from DB and display it on the web as is.
Such comparison actually profile the most basic stuff:
- Caching
- SQL Connection
- Request/Response handling
And would ignore hundreds lines of code used in any web applications responsible for the actual business logic.
Conclusions
- Using C++ with CppCMS provides significant performance gains in developing web applications even in very basic case.
- The performance is effected not only by the framework itself but also by many other libraries that are in use. Using highly optimized C and C++ libraries may give significant performance gain in many cases.
- Such called "jit-compiled" languages as C# and Java and the frameworks based on the use significant amount of memory and still provide much lower performance then the one that can be achieved using real compiled languages like C++.
- It is good to remember that these benchmarks are still quite synthetic ones and in real life the actual performance depend on many factors - but using high quality and high performance libraries available for C++ have significant impact on performance.
Results Data
Markdown
---------
Miss % CppCMS Mono PHP JSP/Tomcat
0 3200.73 747.164 974.142 821.887
1 2891.2 427.727 724.173 337.736
2 2734.69 300.017 544.162 257.44
5 2285.95 162.686 301.507 130.023
10 1749.14 89.4447 174.724 68.5387
20 1247.86 47.7347 93.7919 25.7081
50 642.769 19.8311 38.979 15.1298
100 356.968 9.77116 20.1892 7.96328
Mini-Markdown
---------
Miss % CppCMS Mono PHP JSP/Tomcat
0 3103.14 763.222 1152.63 744.72
1 2933.97 728.971 1076.38 765.599
2 2944.42 726.338 1016.42 724.869
5 2804.44 661.613 866.32 822.927
10 2592.99 584.725 705.465 753.218
20 2239.03 471.576 507.021 674.488
50 1625.5 309.443 274.962 374.26
100 1156.09 197.123 159.974 164.515
HTML
-----
Miss % CppCMS Mono PHP JSP/Tomcat
0 3286.51 849.849 1147.21 808.038
1 3055.53 776.305 1137.35 748.829
2 2991.02 691.502 1122.88 693.439
5 2687.84 693.257 1074.22 756.618
10 2390.12 615.311 1016.27 604.452
20 1886.69 521.467 917.225 668.23
50 1947.93 346.672 669.693 289.656
System and Hardware
- OS: Linux, Debian Lenny, 64 bit
- Hardware: AMD Athlon XP 3000, 64 bit, 1GB memory
Related:
Code
The Code can be downloaded from there. note, to run it you will need to have some libraries installed and configure some hardcoded paths to make it run.
Comments
Pretty cool results.
You know where I think this framework has great potential? In the cloud. Using this framework on Amazon EC2 (for example) would be great to boost performance and save money since you have to pay for memory/CPU resources and CppCms definitely needs less of those.
Possibly consider making your graph labels a little bit bigger and explaining the results mean; I was a little confused at what I was looking at on the graph.
Wonder how it would compare with this: http://www.sairyx.org/2010/10/running-ocaml-directly-on-top-of-xen-for-massive-performance-gains-in-the-cloud/?utm_source=twitterfeed&utm_medium=twitter
Why didn't you use the same markdown library for ASP.NET and CppCMS? The whole point behind the Common Language Runtime is that you are supposed to be able to use libraries from any other language.
It would be interesting to see how the new Mono 2.8 stacks up. It has a better garbage collector and LLVM backend. It also claims to have better ASP.NET performance.
Hey kid,
your article is full of spelling and benchmarking mistakes. It is completely useless and only shows results that we already know. By the way does this comment system have spam protection?
Seems like it doesn't have spam protection. Benchmarks won't help you if you just can't code :D
I hadn't try to compare to every existing technology, because it just to hard.
Mono 2.8 was released only few weeks ago. I didn't noticed that, but I don't think that the difference will be huge. Also it is quite predictable that Java and C# implementations are quite similar.
I'm not English speaker, also I had a small problem with Chrome's spell checker that didn't show all errors, now it fixed, if you see more, you are welcome to tell me.
What exactly, in your opinion the mistakes in this article? I'd suggest to be constructive.
Interesting... What results you already know?
In fact it has, but against robots and not human beings. I found it much more effecting then 1000 other spam protecting systems that WP and other has and fail on false positive.
Not exactly. The code is written in C, I can use "native" interface but what is the point? In same way I can use JNI and integrate C library in PHP, this is not the point.
The idea is to take ready components and combine it. Also note C++ is not C++/CLR ;-)
You should have used ASP.NET on IIS and not Mono, because Mono is known to be very slow compared to native microsoft implementation.
It is problematic for several reason:
Not exactly:
This wasn't the case 2 years ago but now it is fine.
And actually you can see that Java and Mono have similar performance and basically Java and C# are basically same languages
;-)
so I'm not surprised that they perform similarly.I'd still argue you should try Mono 2.8 (remember to use LLVM and SGen garbage collector). While the start up time will suffer a bit, LLVM backend is known to produce code that's better optimized than Mono's fast JIT compiler. SGen GC is also better at cleaning up (comparable to the one from MS), so I'd expect to see improved performance.
I wonder what the results for php would look like compiled with hip hop. Mind giving it a shot?
thanks for posting this work.
CPPCMS vs. node.js would be interesting as well...
ANSI C scripts run much faster than ASP.Net C#, Java or PHP, see:
http://gwan.ch/
http://gwan.ch/imgs/loan100_lan.png
And the footprint (less than 200 KB) includes the scripting engine AND the Web server.
.Net (200 MB), Java (120 MB) and PHP (80 MB) are far away in terms of memory usage and performances.
A new mechanism is in the works to make all existing socket code asynchronous even if it was programmed as blocking (great for all client libraries, like for database engines).
Why you did the cppcms test with "Internal HTTP Server" connection instead of "Lighttpd + FastCGI" connection?
Are there significant differences between the two types of connections?
Because Tomcat supports only HTTP connectivity and Asp.Net/Mono runs much faster using HTTP then using FastCGI connector (which is really slow in case of mono)
So I wanted to compare eggs with eggs, the only tool that had not direct HTTP support was PHP that was run behind lighttpd.
There are non negligible difference - as there IPC and additional layer is involved but still FastCGI connectivity is very fast and good.
Now I am starting learning this great framework!
puchuu...
I'd suggest wiki from SVN "/wikipp/branches/for_cppcms_v100" branch... That uses CppCMS 1.x.x and not the old one.
You might want to include other parameters like CPU times and the type of memory usage to have the full picture, like this article did:
http://www.codeproject.com/KB/dotnet/RuntimePerformance.aspx
I did quick performance test to see how CppCMS compares with Play framework or RestExpress (Netty).
http://joshitech.blogspot.com/2012/04/performance-nginx-netty-cppcms.html
What exactly did it test? It is not described.
What application? What kind of page?
Hello World? (according to the link)
Is least interesting thing. Also it is not really correct to compare static page and dynamic application.
Basically it says that CppCMS is as fast as high performance web server.
But for real tests you need real applications, not something trivial.
Here is another database that is compatible with Mono: http://www.kellermansoftware.com/p-43-ninja-net-database-pro.aspx
What about trying to take part at http://www.techempower.com/benchmarks/
Add Comment:
You must enable JavaScript in order to post comments.