HTTP is expensive, even when it's going on asynchronously in the background of your pages. I wanted to see just how much more it costs in terms of time to send data to the server using a classic HTTP POST versus sending data over an open Websocket. I set up the following test.
First, I set up a Node application using Express and Socket.io.
var express = require("express");
var http = require("http");
var app = express();
var server = http.Server(app);
var io = require("socket.io")(server);
//------------ Socket.io stuff
var wFirstSeen = null;
var events = 0;
io.on("connection", function(socket) {
socket.on("data", function(data) {
if (!wFirstSeen) {
wFirstSeen = new Date();
}
events++;
if (events === 200) {
console.log('websockets done in ' + ((new Date() - wFirstSeen)));
events = 0;
wFirstSeen = null;
}
});
});
//------------ web application route
var hFirstSeen = null;
var posts = 0;
app.post("/data", function(req, res, next) {
if (!hFirstSeen) {
hFirstSeen = new Date();
}
posts++;
if (posts === 200) {
console.log('http post done in ' + ((new Date() - hFirstSeen)));
posts = 0;
hFirstSeen = null;
}
res.sendStatus(200);
});
app.use(express.static('public'));
// ------------ start the listening
var srv = server.listen(3000, function() {
console.log("listening on port %d", srv.address().port);
});
Then I made a test web page so my client could send data to the server.
<!doctype html> <html lang="en"> <head> <meta charset="utf-8"> <title>WS vs HTTP</title> </head> <body> <p>Pushes data to the server.</p> <div id="wsStatus"></div> <div id="httpStatus"></div> </body> <script src="https://code.jquery.com/jquery-1.11.2.min.js"></script> <script type="text/javascript" src="/socket.io/socket.io.js"></script> <script type="text/javascript" src="/test.js"></script> </html>
Finally, here are the contents of my test.js file.
var sckt;
var data = {
field1: "something",
field2: 12,
field3: false,
field4: "whatnot"
}
function websocketTest() {
$("#wsStatus").append("starting send");
for (var x = 0; x < 200; x++) {
sendWebsocketData();
}
$("#wsStatus").append("sends complete");
}
function ajaxTest() {
$("#httpStatus").append("starting send");
for (var x = 0; x < 200; x++) {
sendAjaxData();
}
$("#httpStatus").append("sends complete");
}
function sendWebsocketData() {
sckt.emit("data", data);
}
function sendAjaxData() {
$.post("/data", data);
}
$(function() {
sckt = io.connect();
sckt.on("connect", function() {
$("#wsStatus").append("socket connected");
});
});
So my test was pretty simple. I send the same data object from the client to the server 200 times and print out how long it takes for the server to process. I have test methods set up for Websockets and HTTP post. After I bring up my test page in my browser and see that my websocket connects, I can execute the websocketTest function and the ajaxTest function. The server will print out the results, which are in milliseconds.
![]() |
| The results in my Eclipse console |
The send via Websocket was quite a bit faster every time, which is what I had expected. Posts consistently took well over 200 ms, whereas the data could be transmitted by websocket in the 45 ms range. Definitely something to think about when designing a web application that will be sending a lot of data from the client to the server. Websockets are currently supported across most browsers, so using them in place of HTTP posts may be a viable option.
That's enough seriousness for today. In today's frog comic, I examine the push for self-driving automobiles.
That's enough seriousness for today. In today's frog comic, I examine the push for self-driving automobiles.
![]() |
| Amphibian.com comic for 11 March 2015 |


No comments:
Post a Comment