node的第一步,hello,以及小技巧和CPU使用狀況。到底能用幾個核心?

安裝了啥的就不說了,百度一下有不少。javascript

 

Windows環境。Linux不會,全部就不說了。java

 

一、  hello Wordnode

 

node的hello Word很簡單,就一行。數據庫

          

console.log("Hello world");

 

打開記事本,寫這麼一行,而後保存關閉(文件名hello),再把擴展名(.txt)改爲.js。代碼就寫好了。函數

而後打開「運行」,輸入cmd,打開「dos窗口」好像叫命令行窗口。優化

輸入 node hello.js ,而後就能看的運行效果了。編碼

 

而後有幾個小問題,第一個就是編碼問題,弄很差會出現亂碼。spa

在Windows環境下,文件須要用utf8 ,若是是ansi的話,輸出漢字會出現亂碼。用記事本打開,「另存爲」能夠看到文件編碼。命令行

 

第二個就是執行方法太繁瑣,須要好幾個步驟,不夠「Windows」,那麼怎麼辦呢?咱們能夠用「批處理」來簡化。線程

 

仍是打開記事本,輸入 :

node hello.js

 

而後保存,仍是要改一下擴展名,此次要改爲.bat。(hello.bat)

而後咱們雙擊這個文件就能夠運行。

可是等等,怎麼窗口一閃就沒了?這是由於默認狀況下,執行完操做命令行窗口就會被關閉。因此咱們須要改進一下。

 

右鍵hello.bat,在彈出菜單裏選擇「編輯」,改一下代碼。

 

@echo off

echo 開啓控制檯

:time

title 如今時間是:%time%。這是node的hello Word

  

echo 編譯 hello.js

echo.

node hello.js

echo.

echo 執行完畢

echo.

pause

cls

goto time

 

 

簡單介紹一下,(更多批處理命令請自行百度)

pause 是暫停功能,窗口不會被關閉。

Cls是清屏。

Goto 就是傳說中的跳轉,跳到制定的位置。

 

保存後,咱們在雙擊運行這個批處理文件,會自動編譯hello.js,而後顯示運行結果,而後窗口不會關閉。若是咱們要修改代碼的話,能夠修改代碼,而後保存文件,而後在這個窗口裏面按任意鍵,就能夠從新編譯且運行修改後的代碼。

這樣編寫和調試就會比較簡單了。

  

二、  精確計時時間的問題。

通常狀況下,咱們能夠用

new Date()).getTime()

來獲得時間,這個能夠精確到毫秒,可是實際運行的時候,因爲只能16毫秒左右取一次時間,因此用這種方法只能精確到16毫秒。若是想要更精確須要用其餘方法。

 

爲啥要更精確呢,由於我想看看在node裏面執行一段代碼到底須要多少時間,越精確越好。好比從數據庫裏讀取數據到底要多少毫秒?執行一個函數須要多少時間?

 

找了一下,發現了一種方法

 

function time(){

    var diff = process.hrtime();

    return diff[0] * 1000 + diff[1] / 1e6; // nano second -> ms

}

 

這個能夠精確到0.00000000000毫秒。

 

 

三、  運行效果

先看看(new Date()).getTime()的運行狀況,咱們來寫個死循環來看看

 

var i=0;var j=0;

var star = (new Date()).getTime();  //普通計時

var star2 = time();  //精確計時

var star3 = time();  //精確計時


while (true){

    i++;j++;

    var t = time() - star2;

    //   循環次數       通常的時間                 精確的時間   每次循環須要的精確時間
var msg = i + '_' + (new Date()).getTime() + '_' + time() + '_' +t;

    //計算每循環100次須要的時間,運行結果可得,時間並不一致

    if (j==100){  //每循環100次輸出一次

        var t2 = (new Date()).getTime() - star;

        var t3 = time() - star3;

        console.log(msg + '_' + t2+ '_' + t3); //每百次用時

        star = (new Date()).getTime();

        star3 = time();

        j=0;

    }

    else {

        console.log(msg);

    }

    star2 = time();

}

 

運行效果,對了,按「ctrl+c」能夠中止死循環

 

 

(new Date()).getTime() 的取值,有一大串都是同樣的。

精確取值,每行都不同,精確到了小數點後7位。

而後再看一下兩次循環的時間差,這個就更厲害了,精確到了19位。並且幾乎每行數值都不同。

 

 

這是循環100次須要的時間。138毫秒。兩種計時方法在大於16毫秒的時候,偏差就比較小了,在15毫秒內。緣由仍是前者每16毫秒才能取值一次。

 

四、  運行效率問題

你們有沒有發現問題?只是循環了100次,就須要138毫秒,這個是否是太慢了?

每次循環也沒幹啥是呀。這個node的效率是否是有問題?

 

這個嘛,問題出在 console.log() 上面,每次循環都要輸出顯示,咱們能夠簡單驗證一下,把每次循環都要輸出的那一行註釋掉,只保留每100次的輸出。

 

 

 

這樣,循環100次須要的時間,從100多豪秒,變成了0.1毫秒到0.5毫秒,波動範圍比較大。可是這也是一千倍的差距。至於爲啥多出來個顯示功能,就變得這麼慢,我也不太清楚。

 

五、  CPU的使用率

話說node不是單線程串行運行的嗎?運行死循環的時候我特地看了一下CPU的使用狀況。

個人CPU比較弱,I5,6200U,雙核心四線程,顯示四個核,好吧至少算是兩個核吧。

 

 

 

運行後,四個核的使用率都上來了,並非預想的一核工做三核圍觀的狀況

 

總使用率只有38.8%,並無火力全開。看來在Windows家庭版裏面,node的優先級並不高,沒能獲取更多的資源。

 

整體感受仍是挺奇怪的。只是一個簡單的循環,沒有回調函數,沒有子進程,爲啥四個核都用上了呢?

 

把全部的輸出都註釋掉,仍是四核都使用了,只是使用率低了一點,畢竟不用輸出了。

 

 

難道最新版的node改進了嗎,能夠利用多核心的CPU了?

仍是Windows對node進行了優化?

仍是我理解有誤。

相關文章
相關標籤/搜索