• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧
您的位置:首页 > CMS教程 >建站教程 > 详解PHP中高精度计时器HRTime扩展

详解PHP中高精度计时器HRTime扩展

作者:站长图库 字体:[增加 减小] 来源:互联网

站长图库向大家介绍了高精度计时器,HRTime扩展等相关知识,希望对您有所帮助

不知道大家还记得在学校的时候体育测试时老师带的秒表吗?当枪声想起时,我们开始跑步,这时秒表启动,当我们跑过终点后,老师会按下按扭记录我们的成绩,这就是一个典型的定时器的应用。今天我们要学习的内容其实就是和这个体育测验的秒表类似的一个功能扩展,它就是 PHP 的 HRTime 扩展。

时钟节拍

首先我们要了解一下什么叫做系统的时钟节拍。当 Linux 系统启动之后,会同时启动一个时钟节拍器,以纳秒为单位进行计时,而我们的 HRTime 扩展的真实名称是 高精度时间 扩展。也就是说,它正是基于操作系统的时钟节拍器,能够以纳秒为单位进行计时。

1秒=1000毫秒=1000000微妙=1000000000纳秒,这是秒、毫秒、微秒和纳秒的关系,看出来它的精度有多高了吧。1秒等于10亿纳秒,这样我们就可以获得一个非常精确的时间间隔计数。

HRTime 扩展直接在 PECL 进行下载安装就可以了,和其他的普通扩展没有什么区别。

获取系统时钟节拍信息 Ticks

我们先来看看如何获取操作系统的时钟节拍,也就是这个 Ticks 。关于它的内容在学习操作系统的时候相信已经有不少的同学接触过了,这里我们看看使用 HRTime 扩展如何获取。

print_r(hrtime());// Array// (//     [0] => 3758//     [1] => 407409171// ) echo hrtime(true), PHP_EOL;// 3758407428932

hrtime() 这个函数在 PHP7 之后已经集成在默认 PHP 环境中了。它不需要 HRTime 扩展就可以使用。这个函数在没有参数的情况下返回的是一个数组,第 0 项是系统启动到现在的秒数,第 1 项就是对应的纳秒计数。如果给它的参数设置一个 true 的话,它将直接返回将秒和纳秒拼接起来的实际纳秒时间戳。

echo HRTime\PerformanceCounter::getFrequency(), PHP_EOL; // 1000000000echo HRTime\PerformanceCounter::getTicks(), PHP_EOL; // 3758428256236echo HRTime\PerformanceCounter::getTicksSince(1212), PHP_EOL; // 3758428257494 $a = HRTime\PerformanceCounter::getTicks();echo HRTime\PerformanceCounter::getTicksSince($a), PHP_EOL; // 412

接下来的这三个函数就是 HRTime 扩展中的 PerformanceCounter 对象的静态函数了。PerformanceCounter 对象的意思是性能计数器,getFrequency() 表示的是计时器频率(以滴答Ticks/秒为单位),可以看出,它返回的就是纳秒单位,也就是 10亿 。getTicks() 返回的是当前的时钟节拍时间,可以看出它和 hrtime(true) 函数的结果是一样的,都是返回的系统启动后的时钟节拍时间。getTicksSince() 方法则是根据指定的纳秒数返回时间间隔,类似于 date_diff() 的感觉,其实就像我们的 time() - time() 这样的操作。通过这个方法就可以获得一段代码两次运行的时间间隔,而且是以纳秒为单位哦。

定时器功能

接下来就是我们文章的重点内容了,也就是定时器功能的实现。上面已经说过,使用 getTickSince() 其实也能做到监控一段代码的运行时间间隔,不过下面将学习到的内容将更加强大。

$c = new HRTime\StopWatch; $c->start();for ($i = 0; $i < 1024*1024; $i++);echo 'isRunning: ', $c->isRunning(), PHP_EOL; // isRunning: 1$c->stop(); echo 'Time NS: ', $c->getLastElapsedTime(HRTime\Unit::NANOSECOND), PHP_EOL;echo 'Time US: ', $c->getLastElapsedTime(HRTime\Unit::MICROSECOND), PHP_EOL;echo 'Time MS: ', $c->getLastElapsedTime(HRTime\Unit::MILLISECOND), PHP_EOL;echo 'Time S: ', $c->getLastElapsedTime(HRTime\Unit::SECOND), PHP_EOL;// Time NS: 6929888// Time US: 6929.888// Time MS: 6.929888// Time S: 0.006929888 echo 'Ticks: ',$c->getLastElapsedTicks(), PHP_EOL;// Ticks: 6929888 echo 'isRunning: ',$c->isRunning(), PHP_EOL;//

我们需要实例化一个 StopWatch 对象,然后调用它的 start() 方法,这样一个定时器就启动了。StopWatch 的英文涵义本身就是定时器的意思,所以这个对象是专门为定时器的操作所服务的。通过 isRunning() 方法我们可以判断当前定时器是否运行,其实就是判断当前是否是在一个 start() 方法之后,如果不在 start() 和 stop() 范围中,那么它将返回 false 。在测试代码中,我们运行一个 1024*1024 的空循环,然后再使用 stop() 方法结束定时器。

从代码中可以看出,getLastElapsedTime() 就是获得我们上面的那个 start() 到 stop() 之间的代码运行耗时的时间间隔信息,它的参数可以指定为秒、毫秒、微秒、纳秒。本身这个方法的意思就是获取获取最后一个间隔的运行时间。getLastElapsedTicks() 则是获得最后一次间隔的时钟节拍信息。既然有【最后一次】这四个字,那么也就说明这个对象是可以多次调用的来分段计时的。并且,它还是可以将多段不同的计时进行汇总,获得全部的时间间隔信息的。

// 不在计时范围内for ($i = 0; $i < 1024*1024; $i++); $c->start();for ($i = 0; $i < 1024*1024; $i++);$c->stop(); echo 'Time NS: ', $c->getLastElapsedTime(HRTime\Unit::NANOSECOND), PHP_EOL;echo 'Time US: ', $c->getLastElapsedTime(HRTime\Unit::MICROSECOND), PHP_EOL;echo 'Time MS: ', $c->getLastElapsedTime(HRTime\Unit::MILLISECOND), PHP_EOL;echo 'Time S: ', $c->getLastElapsedTime(HRTime\Unit::SECOND), PHP_EOL;// Time NS: 7154010// Time US: 7154.01// Time MS: 7.15401// Time S: 0.00715401 echo 'All Time NS: ', $c->getElapsedTime(HRTime\Unit::NANOSECOND), PHP_EOL;echo 'All Time US: ', $c->getElapsedTime(HRTime\Unit::MICROSECOND), PHP_EOL;echo 'All Time MS: ', $c->getElapsedTime(HRTime\Unit::MILLISECOND), PHP_EOL;echo 'All Time S: ', $c->getElapsedTime(HRTime\Unit::SECOND), PHP_EOL;// All Time NS: 14083898// All Time US: 14083.898// All Time MS: 14.083898// All Time S: 0.014083898 echo 'All Ticks: ', $c->getElapsedTicks(), PHP_EOL;// All Ticks: 14083898

在这段代码中,我们在两段计时测试代码中插入了一个循环测试代码,它不会计入到计时数据中。接着,我们重新 start() 开始一个新的计时,在最后,我们通过 getElapsedTime() 和 getElapsedTicks() 两个方法获得总的计时时间,可以看出上面的 6929888 加上这次的 7154010 结果正好是 14083898 。中间的那一段没有在定时器中的循环代码没有计入到总的计时时间中。

总结

是不是很有意思,它的作用真的和我们的体育老师所用的那个秒表一模一样,老师们的秒表也都是可以按多次记录第1名到最后1名的全部跑步成绩,并且最后还有一个总的时间,而在代码中我们也是完全相似的操作。这个扩展对于精细的性能调试非常有用,而且也能够针对一些需要这种高精度时间差的业务进行相关的开发。



分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

  • 详解PHP中高精度计时器HRTime扩展

相关文章

  • 发外链的pr比较高的论坛,不过要手工
  • Laravel怎么判断是否登录
  • Dedecms文章审核后给会员增加积分或者金币的办法
  • Photoshop制作超酷的哥特字体教程
  • Photoshop CS6制作飞溅的彩色液体字
  • 教你使用PHP数据库迁移工具“Phinx”
  • 一起来聊聊JavaScript函数柯里化
  • Js实现动态的仿百度“元宵节汤圆”特效
  • 20+个值得收藏的PHP常用小技巧
  • 解决TP获取微信用户信息出现10003错误问题

文章分类

  • dedecms
  • ecshop
  • z-blog
  • UcHome
  • UCenter
  • drupal
  • WordPress
  • 帝国cms
  • phpcms
  • 动易cms
  • phpwind
  • discuz
  • 科汛cms
  • 风讯cms
  • 建站教程
  • 运营技巧

最近更新的内容

    • Illustrator制作超酷的3D符号效果图
    • Photoshop合成抽象风格的人物插画教程
    • CDR制作冰块立体字
    • PHP怎么上传图片改文件名
    • 25个你可能不知道的PS常用快捷键
    • 在微信小程序中用户登录和登录状态维护
    • 说说PHP太空船运算符的使用场景
    • PhotoShop图层样式制作透明质感玻璃文字效果教程
    • 浅谈怎么使用小程序实现一个变速大转盘
    • SQL语句中的with as该怎么用

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有