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进行了优化?

仍是我理解有误。

相关文章
相关标签/搜索