Summary: if you want performance, use Java, Scala, Go, Clojure, Lua, or C++ Hon

My new entrant, servlet3-cass, has taken 5th place in this category, which made it the second best performing Java implementation, losing only slightly to Netty. Based on this, I would conclude that Servlet container overhead doesn’t currently seem to impose a significant bottleneck in this test. It’s interesting to note that there’s about 400 req/s difference between servlet and servlet3-cass performance, though the implementations are very similar. Both have been implemented on the Servlet API, run on the Resin servlet container and use Jackson for JSON processing.

  • I’ve previously used the JAX-RS 2 asynchronous processing API, but not the Servlet 3 async API.
  • In the scientific world research must be repeatable, in order to be credible.
  • Provide access to app server, DB server etc. logs.
  • You can also take the tests and run the benchmarks on your own hardware.
  • It would be interesting to look at the system activity reports from test runs to analyze potential bottlenecks in more detail.
  • Asynchronous processing is also used in the data access tier in order to minimize resource consumption.

Some interesting observations could be made just by looking at the raw data. In addition to comparing throughput, it’s also interesting to compare how well frameworks scale. One way of quantifying scalability is to take test implementation throughput figures for the lowest and highest concurrency level per framework and plot them on a 2-D plane.

I’ve got a project on a 16G server – the data center doesn’t have anything bigger. Moving everything to a custom server or different data center to get to 24G or 32G is… Some time spent finding memory reductions is still worth it. As a related aside, we have an intention to eventually capture some additional statistics about the implementations such as source lines of code, total number of commits, and possibly lines of code of libraries . This model is not entirely without problems since the scalability rating is not relative to the throughput, so e.g. a poorly performing framework can end up having a great scalability rating. As a result, you’d have to look at these figures together.

cpoll cppsp ?? just-js , drogon -core cached ulib , servlet

The top two performers in this test are Dart based implementations that use MongoDB. Unfortunately, the Scala-based Spray test implementation, as well as the JVM-based polyglot framework Vert.x implementation, were removed due to being outdated. Hope to see these included in a future benchmark round. Quite many frameworks are Java or JVM based and rather large variations exist even within this group, so clearly neither the language nor the JVM is an impeding factor in this group. On round 9 the top 10 implementations were all based on MySQL whereas on round 10 three PostgreSQL based implementations have entered the top 10.

The top 10 implementations were implemented in C++, Ur and Java. Again, both undertow and undertow edge seem to be included three times in round 9 data table, which looks a bit strange for the best results table. CppCMS is the web development framework written in C++, that is aimed on development of high performance web application. It uses different web APIs, most noticably FastCGI, as a web layer and various databases as a storage backed.

They had two primary reasons for this massive undertaking. First, getting started on your ASP.NET app was a multiple-hour endevour — as in, four hours after you decided you wanted to try ASP.NET, you were ready to write your first line of code. (We covered how much they’ve improved that experience in a previous blog post, Writing.NET Applications With Visual Studio Code.) Second, they wanted to improve ASP.NET’s performance as much as possible. CPPSP (C++ Server Pages) is an open source web application framework similar to ASP.NET. It features a template parser that parses, compiles, and loads CPPSP pages automatically at runtime. CPPSP pages have a very similar syntax to ASP and ASP.NET, where all code is considered HTML by default, and server-side active code can be embedded using “”.


To find that, we need to go back to Round 9 in 2014 — the last time ASP.NET was even listed. The fastest framework was “cpoll_cppsp”, which handled 6,738,911 requests per second. That translates to 3.2 million requests per second – which is outperforming all but the top 5 on the 10 GbE directly connected 40 HT core Peak tests.

I need to know which one is the best in terms of execution speed+resource usage (as that should be the main reason for choosing C++ for web development), stability and security. As soon as you throw a php framework on top though, it sinks to the bottom of the benchmarks. Doesn’t look to be “an order of magnitude faster” – 200% faster in some cases – certainly nice numbers, but not a massive game changer for many (yet?). It is perfectly fine to not squeeze every drop from your hardware and pick Go or Lua. All the way down to x4, in other words not an order of magnitutde.


While I’m not contesting this statement, but there wasn’t any mention about software versions, and since performance attributes tend to change over time between releases, this premise is not repeatable. Detailed data about what goes on inside the servers could be published, so that externals could analyze benchmark results in a more meaningful way. System activity reports e.g. system resource usage can provide valuable clues to possible scalability issues. Also, application, framework, database and other logs can be useful to test implementers. In 2014, the .NET team decided it was time for a change.

It seems to correspond to languages with a solid community behind them. But it is often easier to start by studying the language first. Each feature is quite important and mostly independant from each other. I tried to embrace most important topics concerning web frameworks with these four properties. I am fully concious some people might lack another important feature. Nonetheless the methodology used here can be easily replicated.


Top performing 10 frameworks were based on Java, C++, Lua and PHP languages and are using MySQL, PostgreSQL and MongoDB databases. Both use MySQL DB. Spring based test implementation performance was a bit of a disappointment. I was a bit disappointed with the performance of the servlet3-cass test implementation in the database tests. Unfortunately, there’s no resource usage or profiling data available for the test run, and as I don’t have access to a real performance test environment myself, so it’s difficult to analyse potential bottlenecks further. Where the previous test exercised a single database query per request this test does a variable number of database queries per request. Again, I would’ve assumed this test would measure the backend database performance more than the framework performance, but it seems that framework and database access method overhead can also contribute significantly.

A new Scala + ElasticSearch based test implementation

The bean validation specification was first released in 2009. This API uses annotations to set constraints on Java Beans. You then call the validation method on an annotated instance to find out if its valid. The reference, and most popular implementation is from Hibernate.

TFB executes Java based performance implementations in the Resin web container, and after a while of puzzlement about the errors, I decided to test the code in other web containers, namely Tomcat and Jetty. It turned out that I had bumped into 1 Resin bug and 2 Tomcat bugs related to servlet asynchronous processing support. Fortunately, since then framework installation procedure has been compartmentalized, so it’s possible to install just the framework that you’re developing tests for. Also, recently the project has added support for fully automated development environment setup with Vagrant, which is a great help. Another excellent addition is Travis CI integration that allows test implementation developers to gain additional assurance that their code is working as expected also outside their sandbox.

Data validation

The only difference between the two seems to be Jackson JSON library version numbers. One of the very common problem in programming is data validation. In a word, we want to make sure that every incoming data has the correct structure. We need to discriminate unsafe external inputs from safe, compiler validated data.

This is the most complex test that aims to exercise the full framework stack from request routing through business logic execution, database access, templating and response generation. Top 10 frameworks in this test are based on Dart, Java, Clojure, PHP and C# languages and they use MongoDB and MySQL databases. Performance and scalability are often high priority concerns.

Database updates test

Too bad memory is not measured/displayed as well. For many cloud-hosted servers, you will end up paying for memory, rather than CPU. In my last project I tried to use scalatra with slick, and while I really liked pluralsight web-dev-starter scalatra, slick made me go nuts. I had to jump over so many hoops that it was just a pain. When ever I feel like that, a few hours with either the Java or Scala persistance frameworks rapidly cures me of it.

© Kathir College of Education. All Rights Reserved
Design: MindMade Technologies