在线秒表
精确的在线秒表,支持计圈、分段时间、键盘快捷键和一键复制成绩列表。使用单调时钟,后台标签页被节流也不会走偏。
不会走偏的秒表。 用按钮或键盘开始、暂停和计圈。每一圈同时记录本圈用时和累计总时,整份列表可以一次性复制出去。
空格开始 / 暂停,L 计圈,R 重置。
还没有记录任何圈次。
精确的在线秒表,支持计圈、分段时间、键盘快捷键和一键复制成绩列表。使用单调时钟,后台标签页被节流也不会走偏。
不会走偏的秒表。 用按钮或键盘开始、暂停和计圈。每一圈同时记录本圈用时和累计总时,整份列表可以一次性复制出去。
空格开始 / 暂停,L 计圈,R 重置。
还没有记录任何圈次。
做秒表最直觉的方式是每次定时器触发就往计数器上加一个固定值。这也是错误的方式,因为浏览器里的定时器并不保证按时触发。切到别的标签页,间隔会被节流到每秒一次甚至完全暂停;合上笔记本,它就彻底停了。用这种方式做出来的计数器会丢时间,而且丢了就再也补不回来。
本秒表的做法是记录开始的那一刻,然后在每次重绘时用当前时刻减去它。没有任何东西在累加,因此也就没有任何误差可以累积。标签页被节流时显示会停止刷新,但底层时钟照常前进,你切回来后的第一帧显示的就是正确的已用时间,而不是一个在你离开期间落后了的数字。
这里使用的是 performance.now(),它从页面加载开始计数,并且只会向前走。这一点很重要,因为墙上时钟——也就是 Date.now() 报告的时间——是会跳变的。NTP 校正会微调它,夏令时切换会移动它,用户改一下系统时间就能让它在任意方向上跳几个小时。
从墙上时钟读数的秒表会完整继承这些跳变。如果一次 NTP 同步恰好发生在测量过程中,你记录的间隔就是错的,而界面上不会有任何迹象提示你。单调时钟没有这种失效模式:它不与任何东西同步,无法被调整,它唯一测量的就是流逝的时间。
每一行记录两个数字。累计是从开始到该圈的时间,本圈是距上一圈的时间。它们回答的是不同的问题,搞清楚自己在看哪一个很有必要。
给跑者计八圈时,本圈时间告诉你他是在保持配速、掉速还是在冲刺——这是每一圈的表现。累计时间告诉你他相对于全程目标成绩处在什么位置。只看累计时很难发现掉速,因为每个数字都包含了它之前的全部时间;只看本圈又会丢掉整体结果。两个都显示,你就能在同一张表里同时读出配速和进度,导出的内容也保留了这两列,方便粘贴到任何地方。