ASP.NET Web Api vs Node.js Benchmark, Take 2
Here’s a new run of the ASP.NET Web Api vs Node.js benchmark but this time with few changes:
- ASP.NET Web Api: The release candidate is used instead of beta.
 - ASP.NET Web Api: Self-Host is used instead of IIS.
 - ASP.NET Web Api: Use of async / await
 - Node.js: Version 0.6.19 is used instead of 0.6.17.
 
Also the test environment was tweaked a little and this time there was a dedicated c1.medium server for the ab.
The test
A simple server which accepts a POST-request and then responds back with the request’s body.
Node.js Implementation
var express = require('express') 
    , app = express.createServer(); 
app.use(express.bodyParser()); 
app.post('/', function(req, res){ 
    res.send(req.body); 
}); 
app.listen(8080);ASP.NET Web Api implementation
public class ValuesAsyncController : ApiController 
{ 
    public async Task<string> Post() 
    { 
        return await this.ControllerContext.Request.Content.ReadAsStringAsync(); 
    } 
}The benchmark
I used Apache’s ab tool to test the performance of the platforms. The benchmark was run with the following settings:
- Total number of requests: 100 000
 - Concurrency: 80
 
The benchmark (test.dat) contained a simple JSON, taken from Wikipedia.
{
     "firstName": "John",
     "lastName" : "Smith",
     "age"      : 25,
     "address"  :
     {
         "streetAddress": "21 2nd Street",
         "city"         : "New York",
         "state"        : "NY",
         "postalCode"   : "10021"
     },
     "phoneNumber":
     [
         {
           "type"  : "home",
           "number": "212 555-1234"
         },
         {
           "type"  : "fax",
           "number": "646 555-4567"
         }
     ]
 }Here’s the whole command which was used to run the performance test:
ab -n 100000 -c 80 -p .test.dat -T 'application/json; charset=utf-8' http://localhost/
The performance test was run 3 times and the best result for each platform was selected. The performance difference between the test runs was minimal.
The Test Environment
The benchmark was run on a Windows Server 2008 R2, hosted on an c1.medium Amazon EC2 –instance:
![]()
Specs of the instance
- 1.7GB memory
 - 5 EC2 Compute Units (2 virtual cores)
 
Versions
- Node.js: 0.6.19
 - ASP.NET Web Api: The release candidate.
 
The ab has its own dedicated c1.medium –instance. All the instances were on the eu-west-1a zone and the private IP was used to connect the ab and test servers.
The Benchmark Results
| Web Api | Node.js | |
| Time taken (in s) | 59,64 | 54,73 | 
| Requests per second | 1676,76 | 1827,33 | 
| Time per request (in ms) | 47,71 | 43,78 | 
| Failed requests | 0 | 0 | 
Few words about the multi-core systems
Where Node.js is limited to a single thread and as such only uses one processor core, self-hosted Web Api can automatically take advantage of multi-core systems. With Node.js you have to use for example cluster in order to split the workload between the cores.
Here’s a graph from ASP.NET Web Api-server which shows the CPU usage of each logical processor (from my local machine):
Here’s an overall CPU usage when running the Node-server:
And here’s the same graph but this time with the ASP.NET Web Api-server:
The Code
The source code for the implementations and also the test tools (ab.exe, test.dat) are available from GitHub.