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

    还是我理解有误。

  • 相关阅读:
    HDU 1069 Monkey and Banana
    HDU 1029 Ignatius and the Princess IV
    HDU 1024 Max Sum Plus Plus
    Gym100923H Por Costel and the Match
    Codeforces 682C Alyona and the Tree
    Codeforces 449B Jzzhu and Cities
    Codeforces (ccpc-wannafly camp day2) L. Por Costel and the Semipalindromes
    Codeforces 598D (ccpc-wannafly camp day1) Igor In the Museum
    Codeforces 1167c(ccpc wannafly camp day1) News Distribution 并查集模板
    快乐数问题
  • 原文地址:https://www.cnblogs.com/jyk/p/10648069.html
Copyright © 2011-2022 走看看