BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / java / #30756同步于 2014/6/30
该镜像源已超过 30 天没有更新,可能在源站已被删除。
Java机器人发帖

java中的高精度计时

kiseki100
2014/6/30镜像同步18 回复
想使用System.nanoTime()来获得一个精确度较高的时间段(毫秒级),因为nanoTime()精确度是纳秒级的,虽然在纳秒层面上精确度不一定保证,但理论上毫秒级的精度是能保证的。 下面是本人写的一小段代码: long s = System.nanoTime(); System.out.println("start:"+s); long end = 0L; while(true) { end = System.nanoTime(); if(end-s >= 1000000L); {System.out.println(end); System.out.println(end-s); break;} } 这里就是想获得一个1ms的时间段,但是输出的距离1000000还差挺远的。。。 捉急啊。。。求各位大神指点
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Wiccc机器人#1 · 2014/7/1
你的意思是说输出的都是1000111,1000222,1000333这样吗。。
kiseki100机器人#2 · 2014/7/1
对,这应该是比较理想的情况吧 【 在 Wiccc 的大作中提到: 】 : 你的意思是说输出的都是1000111,1000222,1000333这样吗。。
Wiccc机器人#3 · 2014/7/1
可能需要独立做一个时频单元(硬件) 高精度需要高成本的 不能独占资源运行就是你得到的结果 或者用凑合这个System.currentTimeMillis() 有没有大神再指导下
kiseki100机器人#4 · 2014/7/1
我之前查过currenttimemills这个精度没有nanotime高啊,没试过,我担心毫秒级情况下波形还是会有抖动。。。 之前是用timetask机制写的,但是测试的时候波形有抖动,老师也希望找一个稳定下来的办法。。。 弄了很久了,很捉急~ 【 在 Wiccc 的大作中提到: 】 : 可能需要独立做一个时频单元(硬件) : 高精度需要高成本的 : 不能独占资源运行就是你得到的结果 : ...................
michael2008机器人#5 · 2014/7/1
在c层面是可以嵌入汇编得到硬件所能支持的最高精度(当然硬件波动不可避免,起码能从CPU时钟可以得到的精度还是能达到的)。 其实我都没去查System.nanoTime()到底靠谱不靠谱,因为你写的代码实在不靠谱。测时间到纳秒级别能print到console么,这个时间你得考虑到,Java这种蜗牛语言,你还是先把输出的结果存数组里面再最后测试完事儿打印看看结果再说,可以算算CPU的频率,估计下执行代码的量级来估算你数组里面应该存储的数值的差值是多少。注意到有时CPU核切换可能引起较大波动。
nuanyangyang机器人#6 · 2014/7/1
可以说说楼主想做什么具体的事情吗? 毕竟一个进程可以随时被操作系统暂停,把cpu让给别的进程用。尤其是这种忙等待最容易成为操作系统“踢”出cpu的目标。这么精确的计时恐怕普通的机器做不到。
michael2008机器人#7 · 2014/7/1
额,你要的结果就是这个吧: http://blog.csdn.net/elky1982/article/details/4677365
michael2008机器人#8 · 2014/7/1
其实,还有终极解法,这个如果解决不了,就需要单独的时钟发生器通过CPU中断的方式去用低层的汇报或者c来实现了(其实没必要,又不是实时系统) 参考下这个吧,jni实现,说白了就是用c来做咯,Java套个壳子: http://www.doc88.com/p-756293252994.html
kiseki100机器人#9 · 2014/7/1
额,大神好~~~ 其实我是在做一个android的东西,要实现led灯的高频率闪烁,保证接收的波形不会抖动。 我知道我写的东西不太靠谱啊,您觉得底层改动还应该怎么做啊?之前老师也建议我尝试中断的方式做,是不是要改动源码啊?我还不太会底层驱动的东西,还请多多指教~~ 【 在 michael2008 的大作中提到: 】 : 在c层面是可以嵌入汇编得到硬件所能支持的最高精度(当然硬件波动不可避免,起码能从CPU时钟可以得到的精度还是能达到的)。 : 其实我都没去查System.nanoTime()到底靠谱不靠谱,因为你写的代码实在不靠谱。测时间到纳秒级别能print到console么,这个时间你得考虑到,Java这种蜗牛语言,你还是先把输出的结果存数组里面再最后测试完事儿打印看看结果再说,可以算算CPU的频率,估计下执行代码的量级来估算你数组里面应该存储的数值的差值是多少。注意到有时CPU核切换可能引起较大波动。