zoukankan      html  css  js  c++  java
  • node的第一步,hello,以及小技巧和CPU使用情况。到底能用几个核心?

    安装了啥的就不说了,百度一下有很多。

    Windows环境。Linux不会,所有就不说了。

    1、  hello Word

    node的hello Word很简单,就一行。

              

    console.log("Hello world");

    打开记事本,写这么一行,然后保存关闭(文件名hello),再把扩展名(.txt)改成.js。代码就写好了。

    然后打开“运行”,输入cmd,打开“dos窗口”好像叫命令行窗口。

    输入 node hello.js ,然后就能看的运行效果了。

    然后有几个小问题,第一个就是编码问题,弄不好会出现乱码。

    在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,然后显示运行结果,然后窗口不会关闭。如果我们要修改代码的话,可以修改代码,然后保存文件,然后在这个窗口里面按任意键,就可以重新编译且运行修改后的代码。

    这样编写和调试就会比较简单了。

      

    2、  精确计时时间的问题。

    一般情况下,我们可以用

    new Date()).getTime()
    

    来得到时间,这个可以精确到毫秒,但是实际运行的时候,由于只能16毫秒左右取一次时间,所以用这种方法只能精确到16毫秒。如果想要更精确需要用其他方法。

    为啥要更精确呢,因为我想看看在node里面执行一段代码到底需要多少时间,越精确越好。比如从数据库里读取数据到底要多少毫秒?执行一个函数需要多少时间?

    找了一下,发现了一种方法

    function time(){
    
        var diff = process.hrtime();
    
        return diff[0] * 1000 + diff[1] / 1e6; // nano second -> ms
    
    }

    这个可以精确到0.00000000000毫秒。

    3、  运行效果

    先看看(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毫秒才能取值一次。

    4、  运行效率问题

    大家有没有发现问题?只是循环了100次,就需要138毫秒,这个是不是太慢了?

    每次循环也没干啥是呀。这个node的效率是不是有问题?

    这个嘛,问题出在 console.log() 上面,每次循环都要输出显示,我们可以简单验证一下,把每次循环都要输出的那一行注释掉,只保留每100次的输出。

     

    这样,循环100次需要的时间,从100多豪秒,变成了0.1毫秒到0.5毫秒,波动范围比较大。但是这也是一千倍的差距。至于为啥多出来个显示功能,就变得这么慢,我也不太清楚。

    5、  CPU的使用率

    话说node不是单线程串行运行的吗?运行死循环的时候我特意看了一下CPU的使用情况。

    我的CPU比较弱,I5,6200U,双核心四线程,显示四个核,好吧至少算是两个核吧。

     

    运行后,四个核的使用率都上来了,并不是预想的一核工作三核围观的情况

    总使用率只有38.8%,并没有火力全开。看来在Windows家庭版里面,node的优先级并不高,没能获取更多的资源。

    总体感觉还是挺奇怪的。只是一个简单的循环,没有回调函数,没有子进程,为啥四个核都用上了呢?

    把所有的输出都注释掉,还是四核都使用了,只是使用率低了一点,毕竟不用输出了。

     

    难道最新版的node改进了吗,可以利用多核心的CPU了?

    还是Windows对node进行了优化?

    还是我理解有误。

  • 相关阅读:
    data guard switchover切换异常
    oracle dataguard
    建立信任关系
    sqlplus 打印很乱,而且很短就换行
    老友记英语
    每天读一遍
    extern的用法
    linux信号处理
    http server v0.1_http_parse.c
    http server v0.1_http_webapp.c
  • 原文地址:https://www.cnblogs.com/jyk/p/10648069.html
Copyright © 2011-2022 走看看