做过电子商务的朋友都知道,用户对秒杀活动中开始的时间点非常敏感,如果因为时间误差导致用户没有秒到,不免会带来骂声一片,即时可能只是1秒的误差。那么时间误差究竟是怎么产生的?下面先说明下客户端倒计时的实现,再分析一下哪里产生的误差。
倒计时的实现
实现的方式也非常简单,因为客户端的时间是不可靠的,所以当前的时间必须要从服务器获取,这点是没有疑问的。而后根据服务器返回的系统时间和活动的开始时间做一个差值,最后开始倒计时。
这样的实现看起来非常完美,完全没有问题。但是在实际的应用当中,当把几台手机设备摆在一起的时候,问题就出现了:有的手机快一些,有的手机慢一些。这个问题最早还是用户发现的,用户比较疯狂,想用几个手机一起抢东西,结果就发现了这个问题,暴汗啊。
误差产生的分析
先分析一下从获取系统时间到显示倒计时这样的一个过程。
在系统响应刚刚完成的时候,这个时候时间和系统时间最为接近,可以说是相等的。但是经过网络传输这步后,误差就开始产生了,用GO语言测试从北京取回数据到厦门网络好一点的时候几十毫秒,差一点几百毫秒,这个误差不算小了。
在客户端取到系统时间后,又要经过很多处理,最后才显示出来,这样几百毫秒又过去了。经过观察我们发现iphone 4总是会比iphone 5,iphone 5s倒计时慢些,估计就和设备的性能有关系。
网络传输的时间和显示倒计时的时间加在一起,误差就不小了,肉眼能识别出来了。
解决办法分析
主要思路是要计算出网络传输的时间和渲染代码的执行时间,最近将系统时间加上这边的两个时间,再补上一个常量。
当前系统时间 = 服务器系统时间+网络传输时间+渲染时间+常量(可选)
在执行过程中,必然有无法计算到的时间部分,可以用常量补差,这个常量我估算在10ms内。
关于实现方面,网络传输时间还没想到方法计算,渲染时间还是比较容易,只要执行的开始结尾处设定开始和结束时间就可以计算出来。
转载请注明出处:https://stgod.com/1878/