Date对象

源码下载

  最初接触编程,没有接触过非常讲究时间控制的领域,往往对时间没有概念,单片机编程,嵌入式开发,操作系统,无人及姿态控制往往会关注毫秒ms、微秒us级的时间概念。 什么是并行,什么是串行,什么是并发。计算机的CPU是逐条执行指令的,每条指令都要花费一定时间,只不过短小的程序执行的太快,几个毫秒ms,甚至微秒,没有时间的感觉。 本节课利用Javascript内置的对象Date对象,来测试一段代码的执行时间。

  Date对象需要通过new和构造函数Date()创建,创建完成后可以调用对象的大量内置默认支持属性和方法。Javascript语言引入Date对象的目的就是为了处理编程中的时间问题, 该对象依赖Javascript程序的运行环境,可以通过浏览器解析或者nodejs解释器。

  下面的代码示例是利用Javascript内置对象Date测试程序性能。

8        //测试for循环100万次计算加法运算时间
9        let S = 0;
10       let T0 = new Date();//创建对象Date,返回此刻时间赋值给变量T0
11       for(let i = 0; i<1000;i++){    //外循环1000
12               for(let i = 0; i<1000;i++){   //内循环1000
13                   S +=1;
14               }
15           }
16       let T1 = new Date();//创建对象Date,返回此刻时间赋值给变量T1
17       document.write(T1-T0);//求解T1-T0时间差,便是for运行时间,单位:ms  

体验测试

  不改变程序多次刷新浏览器查看运行时间变化,是稳定,还是波动。可以尝试更改for循环程序中的循环次数控制参数1000,刷新浏览器查看时间变化。

代码解析

  代码比较简单,直接来看第十行创建Date对象的代码let T0 = new Date();执行该语句后, 从对象的角度看创建了一个对象,这样的话可以通过d对象调用Date的相关方法和属性。 该对象也是一个是时间值,这个主要体现在利用运算符运算的时候,比如一个字符串类型数据和数字类型数据进行==比较运算, Javascript系统会首先把它们转换成同一种数据类型再进行比较, 两个对象进行减法计算,首先要做的就是把对象类型数据转化为数字类型。 可能很多教程说它是时间,那是字符串格式时间,还是数值类型的时间。使用typeof关键字测试他就是对象, 那么对象通过什么样的机制,能够转化成数字类型数据,如果不明白,先不用管,先记住Date的用法。随着学习的深入,尝试去使用各种类型的构造函数自然会明白。 T0是当前的时间,也是一个对象。T0是执行for循环的开始时间,T1是for循环执行结束的时间。 两个变量时间差就是for循环的执行时间,在浏览器网页上显示的时间数值是整数,单位是:ms。

Math对象方法

toString()

  执行语句new Date();返回的是一个对象,从数据的角度看,是对象类型数据,值就是时间,Date对象提供了方法toString()可以把对象类型数据 转化为字符串类型数据。

getDate()

  通过该方法可以从对象获得本月第几号的日期,比如今天是3月13号,那么T0.getDate()的返回值是一个数字类型数据13

getMonth()

  同getDate()方法使用规则,只是返回的数据是今天的月份。

方法总结表格

方法 返回 数据类型
getHours() number
getMinutes() number
getSeconds() number
getFullYear() number
getMonth() number
getDay() number

扩展

时间单位

相邻单位进制是1000,比如1s=10^3ms,时间级别依次下降

名称 毫秒 微秒 纳秒
单位 s ms us ns

  CPU的频率级别GHz,执行一条指令的时间级别是纳秒ns级,单片机的执行速度在us级别,一般一条Javascript语句会被解释器编译成几条指令

  下面做一个假设,CPU执行一条指令3ns,for循环结构被编译后假设执行一次是3条指令,100万次,就是3X10^6条指令,那么执行时间就是9X10^6ns,换算单位就是9ms

  以上数字全为假设,具体值有偏差,但是在数量级的层面基本是符合实际的,有兴趣的话可以多了解CPU结构和操作系统