Date对象
源码下载
最初接触编程,没有接触过非常讲究时间控制的领域,往往对时间没有概念,单片机编程,嵌入式开发,操作系统,无人及姿态控制往往会关注毫秒ms、微秒us级的时间概念。
什么是并行,什么是串行,什么是并发。计算机的CPU是逐条执行指令的,每条指令都要花费一定时间,只不过短小的程序执行的太快,几个毫秒ms,甚至微秒,没有时间的感觉。
本节课利用Javascript内置的对象Date对象,来测试一段代码的执行时间。
Date对象需要通过new和构造函数Date()创建,创建完成后可以调用对象的大量内置默认支持属性和方法。Javascript语言引入Date对象的目的就是为了处理编程中的时间问题,
该对象依赖Javascript程序的运行环境,可以通过浏览器解析或者nodejs解释器。
下面的代码示例是利用Javascript内置对象Date测试程序性能。
//测试for循环100万次计算加法运算时间9 let S =0;10 let T0 =newDate();//创建对象Date,返回此刻时间赋值给变量T0for(let i =0;i<1000;i++){//外循环1000for(let i =0;i<1000;i++){//内循环100013 S +=1;14 }
15 }
16 let T1 =newDate();//创建对象Date,返回此刻时间赋值给变量T117 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()可以把对象类型数据
转化为字符串类型数据。
应用案例
//T0对象转字符串
let str = T0.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结构和操作系统