I decided to run a little benchmark.
The scenario: A RESTful web service that receives the first letter of a city, looks up all cities beginning with the supplied letter in a MySQL database, and returns the cities' names and IDs using JSON.
The setup:
- Test system: Intel i5 M540, 4 GB RAM, Windows 7 Professional x64 SP1
- MySQL 5.5.27 x64 running on localhost
- Apache JMeter 2.7 running on localhost
- Node.js 0.8.6 with node-mysql 0.9.6
- JBoss 7.1.1, JAX-RS, JPA/Hibernate
- JMeter settings: 50 threads, 500 repetitions (thus, 25.000 requests in total).
@Stateless
@Path("/test")
public class TestService {
@PersistenceContext
private EntityManager entityManager;
@GET
@Produces(MediaType.APPLICATION_JSON)
@SuppressWarnings("unchecked")
public Response action(@QueryParam("beginning") @DefaultValue("") String beginning) {
Response response = new Response();
Query query = getEntityManager().createQuery("FROM Name WHERE name LIKE :name");
query.setParameter("name", beginning + "%");
response.setNames((List)query.getResultList());
return response;
}
public EntityManager getEntityManager() {
return entityManager;
}
public void setEntityManager(EntityManager entityManager) {
this.entityManager = entityManager;
}
}
Node.js Code:
var http = require('http');
var url = require('url');
var mysql = require('mysql');
var client = mysql.createClient({
user: 'root',
password: ''
});
client.query('USE `rest-test`');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'application/json'});
var url_parts = url.parse(req.url, true);
var query = url_parts.query;
var beginning = query['beginning'];
client.query('SELECT * FROM name WHERE name LIKE "'+beginning+'%"', function selectCb(error, results, fields) {
var result = [];
for (var i=0; i < results.length; i++) {
var row = results[i];
result.push({'id': row['id'], 'name': row['name']});
}
res.end(JSON.stringify({'names': result}));
});
}).listen(8080, '127.0.0.1');
The result:
- Node.js: 148.0 requests per second
- JAX-RS: 467.2 requests per second
Download the source codes, JMeter test case, and benchmark summary
No comments:
Post a Comment