ฉันทำการทดสอบประสิทธิภาพพื้นฐานระหว่าง nodejs และ IIS IIS เร็วกว่า nodejs ประมาณ 2.5 เท่าเมื่อทำการออก "hello, world!" รหัสด้านล่าง
ฮาร์ดแวร์ของฉัน: Dell Latitude E6510, Core i5 (ดูอัลคอร์), 8 GB RAM, Windows 7 Enterprise 64 บิตระบบปฏิบัติการ
เซิร์ฟเวอร์โหนด
runs at http://localhost:9090/
/// <reference path="node-vsdoc.js" />
var http = require("http");
http.createServer(function (request, response) {
response.writeHead(200, { "Content-Type": "text/html" });
response.write("<p>hello, world!</p>");
response.end();
}).listen(9090);
default.htm
hosted by iis at http://localhost/test/
<p>hello, world!</p>
โปรแกรมเบนช์มาร์กของฉันเองโดยใช้ไลบรารีงานแบบขนาน:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Threading;
using System.Threading.Tasks;
using System.Diagnostics;
namespace HttpBench
{
class Program
{
private int TotalCount = 100000;
private int ConcurrentThreads = 1000;
private int failedCount;
private int totalBytes;
private int totalTime;
private int completedCount;
private static object lockObj = new object();
/// <summary>
/// main entry point
/// </summary>
static void Main(string[] args)
{
Program p = new Program();
p.Run(args);
}
/// <summary>
/// actual execution
/// </summary>
private void Run(string[] args)
{
// check command line
if (args.Length == 0)
{
this.PrintUsage();
return;
}
if (args[0] == "/?" || args[0] == "/h")
{
this.PrintUsage();
return;
}
// use parallel library, download data
ParallelOptions options = new ParallelOptions();
options.MaxDegreeOfParallelism = this.ConcurrentThreads;
int start = Environment.TickCount;
Parallel.For(0, this.TotalCount, options, i =>
{
this.DownloadUrl(i, args[0]);
}
);
int end = Environment.TickCount;
// print results
this.Print("Total requests sent: {0}", true, this.TotalCount);
this.Print("Concurrent threads: {0}", true, this.ConcurrentThreads);
this.Print("Total completed requests: {0}", true, this.completedCount);
this.Print("Failed requests: {0}", true, this.failedCount);
this.Print("Sum total of thread times (seconds): {0}", true, this.totalTime / 1000);
this.Print("Total time taken by this program (seconds): {0}", true, (end - start) / 1000);
this.Print("Total bytes: {0}", true, this.totalBytes);
}
/// <summary>
/// download data from the given url
/// </summary>
private void DownloadUrl(int index, string url)
{
using (WebClient client = new WebClient())
{
try
{
int start = Environment.TickCount;
byte[] data = client.DownloadData(url);
int end = Environment.TickCount;
lock (lockObj)
{
this.totalTime = this.totalTime + (end - start);
if (data != null)
{
this.totalBytes = this.totalBytes + data.Length;
}
}
}
catch
{
lock (lockObj) { this.failedCount++; }
}
lock (lockObj)
{
this.completedCount++;
if (this.completedCount % 10000 == 0)
{
this.Print("Completed {0} requests.", true, this.completedCount);
}
}
}
}
/// <summary>
/// print usage of this program
/// </summary>
private void PrintUsage()
{
this.Print("usage: httpbench [options] <url>");
}
/// <summary>
/// print exception message to console
/// </summary>
private void PrintError(string msg, Exception ex = null, params object[] args)
{
StringBuilder sb = new System.Text.StringBuilder();
sb.Append("Error: ");
sb.AppendFormat(msg, args);
if (ex != null)
{
sb.Append("Exception: ");
sb.Append(ex.Message);
}
this.Print(sb.ToString());
}
/// <summary>
/// print to console
/// </summary>
private void Print(string msg, bool isLine = true, params object[] args)
{
if (isLine)
{
Console.WriteLine(msg, args);
}
else
{
Console.Write(msg, args);
}
}
}
}
และผลลัพธ์:
IIS: httpbench.exe http://localhost/test
Completed 10000 requests.
Completed 20000 requests.
Completed 30000 requests.
Completed 40000 requests.
Completed 50000 requests.
Completed 60000 requests.
Completed 70000 requests.
Completed 80000 requests.
Completed 90000 requests.
Completed 100000 requests.
Total requests sent: 100000
Concurrent threads: 1000
Total completed requests: 100000
Failed requests: 0
Sum total of thread times (seconds): 97
Total time taken by this program (seconds): 16
Total bytes: 2000000
nodejs: httpbench.exe http://localhost:9090/
Completed 10000 requests.
Completed 20000 requests.
Completed 30000 requests.
Completed 40000 requests.
Completed 50000 requests.
Completed 60000 requests.
Completed 70000 requests.
Completed 80000 requests.
Completed 90000 requests.
Completed 100000 requests.
Total requests sent: 100000
Concurrent threads: 1000
Total completed requests: 100000
Failed requests: 0
Sum total of thread times (seconds): 234
Total time taken by this program (seconds): 27
Total bytes: 2000000
สรุป: IIS เร็วกว่า nodejs ประมาณ 2.5 เท่า (บน Windows) นี่คือการทดสอบขั้นพื้นฐานมากและไม่ได้ข้อสรุป แต่ฉันเชื่อว่านี่เป็นจุดเริ่มต้นที่ดี Nodejs น่าจะเร็วกว่าบนเว็บเซิร์ฟเวอร์อื่น ๆ บนแพลตฟอร์มอื่น ๆ แต่ใน Windows IIS เป็นผู้ชนะ นักพัฒนาที่ต้องการแปลง ASP.NET MVC เป็น nodejs ควรหยุดและคิดสองครั้งก่อนดำเนินการต่อ
อัปเดต (5/17/2012) Tomcat (บน windows) ดูเหมือนจะเอาชนะ IIS hand down เร็วกว่า IIS ประมาณ 3 เท่าในการทำ html คงที่
แมวตัวผู้
index.html at http://localhost:8080/test/
<p>hello, world!</p>
ผลคราว
httpbench.exe http://localhost:8080/test/
Completed 10000 requests.
Completed 20000 requests.
Completed 30000 requests.
Completed 40000 requests.
Completed 50000 requests.
Completed 60000 requests.
Completed 70000 requests.
Completed 80000 requests.
Completed 90000 requests.
Completed 100000 requests.
Total requests sent: 100000
Concurrent threads: 1000
Total completed requests: 100000
Failed requests: 0
Sum total of thread times (seconds): 31
Total time taken by this program (seconds): 5
Total bytes: 2000000
ข้อสรุปที่อัปเดต: ฉันใช้โปรแกรมเบนช์มาร์กหลายครั้ง Tomcat ดูเหมือนจะเป็นเซิร์ฟเวอร์ที่เร็วที่สุดในการกำหนดสถานะ HTML บน WINDOWS
อัปเดต (5/18/2012) ก่อนหน้านี้ฉันมีคำขอทั้งหมด 100,000 คำขอโดยมี 10,000 คำขอพร้อมกัน ฉันเพิ่มเป็น 1,000,000 คำขอทั้งหมดและ 100,000 คำขอพร้อมกัน IIS ออกมาในฐานะผู้ชนะกรีดร้องด้วย Nodejs ที่เลวร้ายที่สุด ฉันทำตารางผลลัพธ์ด้านล่าง:
.