| .NET VS Node.JS 到底誰快 訊光科技 / 蔡宏旻   前言
 訊光在發展Node.JS之前就從網路的各種測試報告與文章中得知,Node.JS在單純作為網站服務的性能上會比.NET下的IIS效能還好,而且用戶的量越大,效果也越明顯。基於Node.JS的事件驅動與非阻塞式的I/O架構來思考,是可以理解為何會較快的原因,但是,若以EEP平台來思考,並非專門用來處理網站的功能,而需要再配合Application處理後端商業邏輯及資料庫的數據存取,這樣,Node.JS就會比較快嗎?如果快,會快多少呢?這些都令人充滿問號...
 
 隨著EEP Node.JS平台開發完成,就可以實際的案例來做個效能比較,就是以同一個應用案例(前端一模一樣),來分別測試EEP .NET與EEP Node.JS,並記錄測試的成果加以比較,供大家參考。
 
 
 測試環境說明
 
 
 ●Server端主機規格:CPU 3.2GHz雙核,記憶體4GB,HD 500G 5400轉,作業系統Windows 7,.NET版本 4.0,IIS版本6.1。使用兩台主機,一台主機安裝好EEP2012 Application Server及Microsoft IIS,使用HeavyLoad的測試軟體做CPU及記憶體的消耗記錄;Database 則使用MS-SQL 2012,安裝在另一台上面,避免干擾測試結果。 此Server同時安裝了IIS + EEP Application Server 及 Node.JS + EEP Node.JS,並分開測試。
 ●Client端測試機規格:CPU 2.5GHz雙核,記憶體3GB,作業系統Windows 7,Browser為IE10。Client 端使用10台主機,使用LoadRunner壓力測試軟體,每台分別模擬25個 User,總共同時模擬250個USER同時作業。
 ●測試示意圖
 
 
  
 
 測試方法及準備
   ● 測試主機Server每次測試前重新啟動,避免累積測試干擾。●Client端壓力測試,啟動100個Users同一時間進行新增資料的壓力測試,同時啟動150個Users同一時間進行資料查詢測試。.NET與Node.JS的前端都是用EEP的JQuery模組所開發,開發的頁面內容完全一樣來達到測試準確性。
 ●新增資料測試方案,模擬單一表單資料新增,從Login登入到主畫面,進入新增作業,連續新增3筆資料後登出應用程式。(100個Users同時進行)。
 ●查詢資料測試方案,模擬單一表單資料查詢,資料量為10000筆資料,隨機查詢1筆資料結果。從Login登入到主畫面,進入查詢作業,隨機查詢3次資料後登出應用程式。
 ●測試取得主機 Server的CPU與記憶體平均負載狀況,Client端的平均回應時間及逾時錯誤數目。
 
 
 .NET測試結果
 
 首先針對EEP .NET進行測試,結果如下:
 
 ●10台Client測試機模擬登錄操作,每台主機模擬25個User,測試三次。
 
| Client端測試機 | 第一次測試結果 | 第二次測試結果 | 第三次測試結果 |  
| 總體 反應時間
 | 平均 反應時間
 | 錯誤 數目
 | 總體 反應時間
 | 平均 反應時間
 | 錯誤 數目
 | 總體 反應時間
 | 平均 反應時間
 | 錯誤 數目
 |  
| A | 60 | 6 | 0 | 59 | 5.9 | 0 | 61 | 6.1 | 0 |  
| B | 60 | 6.1 | 0 | 60 | 6 | 0 | 62 | 6.2 | 0 |  
| C | 61 | 6.1 | 0 | 60 | 6 | 0 | 62 | 6.2 | 0 |  
| D | 60 | 6 | 0 | 59 | 5.9 | 0 | 60 | 6.0 | 0 |  
| E | 58 | 5.8 | 0 | 56 | 5.6 | 0 | 58 | 5.8 | 0 |  
| F | 59 | 5.9 | 0 | 58 | 5.8 | 0 | 60 | 6.0 | 0 |  
| G | 59 | 5.9 | 0 | 56 | 5.6 | 0 | 59 | 5.9 | 0 |  
| H | 60 | 6.0 | 0 | 54 | 5.4 | 0 | 61 | 6.1 | 0 |  
| I | 59 | 5.9 | 0 | 57 | 5.7 | 0 | 60 | 6.0 | 0 |  
| J | 58 | 5.8 | 0 | 56 | 5.6 | 0 | 59 | 5.9 | 0 |  
| 平均 | 59.4 | 59.4 | 0 | 57.4 | 5.74 | 0 | 60.0 | 6.0 | 0 |  Client端總平均回應時間為 5.89秒。 
 主機端的CPU與記憶體消耗:(EEP .NET A/P Server + IIS)。
 
| 次數 | 測試前 CPU平均%
 | 測試中 CPU最高
 | 測試中 CPU平均
 | 測試前 可用記憶體
 | 測試後 可用記憶體
 | 消耗記憶體 |  
| 1 | 10% | 85% | 51% | 1468MB | 1326MB | 142MB |  
| 2 | 10% | 75% | 48% | 1451MB | 1286MB | 165MB |  
| 3 | 10% | 88% | 53% | 1472MB | 1301MB | 171MB |  
| 平均 |  | 82% | 50.6% |  |  | 159.3MB |  Server端第一次結果(Update Chart every 3 seconds)。
 
 
  
 Server端第二次結果(Update Chart every 3 seconds)。
 
 
  
 
 (第三次結果略)。
 
 
 Node.JS測試結果
 
 接著針對EEP Node.JS測試結果如下:
 
 ●10台Client測試機模擬登錄操作,每台主機模擬25個User,測試三次。
 
| Client端測試機 | 第一次測試結果 | 第二次測試結果 | 第三次測試結果 |  
| 總體 反應時間
 | 平均 反應時間
 | 錯誤 數目
 | 總體 反應時間
 | 平均 反應時間
 | 錯誤 數目
 | 總體 反應時間
 | 平均 反應時間
 | 錯誤數目 |  
| A | 43 | 4.3 | 0 | 43 | 4.3 | 0 | 44 | 4.4 | 0 |  
| B | 43 | 4.3 | 0 | 43 | 4.3 | 0 | 43 | 4.3 | 0 |  
| C | 43 | 4.3 | 0 | 43 | 4.3 | 0 | 43 | 4.3 | 0 |  
| D | 43 | 4.3 | 0 | 43 | 4.3 | 0 | 45 | 4.5 | 0 |  
| E | 43 | 4.3 | 0 | 43 | 4.3 | 0 | 43 | 4.3 | 0 |  
| F | 43 | 4.3 | 0 | 43 | 4.3 | 0 | 43 | 4.3 | 0 |  
| G | 41 | 4.1 | 0 | 38 | 3.8 | 0 | 39 | 3.9 | 0 |  
| H | 33 | 3.3 | 0 | 37 | 3.7 | 0 | 38 | 3.8 | 0 |  
| I | 41 | 4.1 | 0 | 38 | 3.8 | 0 | 40 | 4.0 | 0 |  
| J | 40 | 4 | 0 | 37 | 3.7 | 0 | 41 | 4.1 | 0 |  
| 平均 | 41.3 | 4.13 | 0 | 40.8 | 4.08 | 0 | 41.9 | 4.19 | 0 |  Client端總平均回應時間為 4.13秒。
 主機端的CPU與記憶體消耗:(EEP Node.JS Server)。
 
| 次數 | 測試前 CPU平均%
 | 測試中 CPU最高
 | 測試中 CPU平均
 | 測試前 可用記憶體
 | 測試後 可用記憶體
 | 消耗記憶體 |  
| 1 | 10% | 95% | 67.14% | 1164MB | 1109MB | 55MB |  
| 2 | 10% | 100% | 75% | 1306MB | 1223MB | 83MB |  
| 3 | 10% | 95% | 69.5% | 1185MB | 1125MB | 60MB |  
| 平均 |  | 96.6% | 70.5% |  |  | 66MB |  Server端第一次結果(Update Chart every 3 seconds)。
 
 
   
 Server端第二次結果(Update Chart every 3 seconds)。
 
 
  
 
 (第三次結果略)。
 
 
 
 測試結果比較
 
 
|  | Client端反應時間 | Server端CPU平均 | 消耗記憶體 |  
| EEP.NET | 5.89秒 | 50.6% | 159.3MB |  
| EEP Node.JS | 4.13秒 | 70.5% | 66MB |  
| 結果 | 快了29% | 高了39% | 降了58.5% |  
 結論
 
 從上表以.NET JQuery及Node.JS JQuery相同介面去分別測試了EEP.NET及EEP Node.JS的Server後所得的數據,得知EEP Node.JS比EEP .NET+IIS的表現還好一點,但並不是想像中有倍數的效能,其實.NET與IIS在CPU的表現反而比Node.JS來得好,這是當初意想不到的結果,當然主要是因為EEP是跟資料庫系統較為緊密的系統,非單純只是個網站系統,也許測試的數據也會大不同。另外針對耗用記憶體方面就與事先預測差不多,畢竟Node.JS是個輕量化的運行環境,會比IIS龐大的架構節省很多記憶體。
 
 目前EEP Node.JS已經內建了多執行序(Multi-Thread)的機制在內,目的就是要來面臨高併發數與多工的處理,畢竟在商業領域當中,多工是必備的條件,暫時我們研發團隊還沒有針對EEP Node.JS的核心特別去優化,年底之前我們會全面優化一次,也許測試出來的數據會更為亮麗,值得大家去期待一下。
 
 |