鱼C论坛

 找回密码
 立即注册
查看: 1619|回复: 14

[已解决]time模块仅支持到0.001s如何解决

[复制链接]
发表于 2020-6-15 19:10:19 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
import time
timeofmusic = 0
def GetTime():
    global timeofmusic
    while True:
        time.sleep(0.000001)
        timeofmusic += 0.000001
        timeofmusic = round(timeofmusic,6)
        print(timeofmusic)
GetTime()

import time
timeofmusic = 0
def GetTime():
    global timeofmusic
    while True:
        time.sleep(0.001)
        timeofmusic += 0.000001
        timeofmusic = round(timeofmusic,6)
        print(timeofmusic)
GetTime()
的运行结果是一样的,做的程序需要精确至小数点后六位,请问该怎么办才可以使等待时间精度更高
最佳答案
2020-6-15 20:34:09
本帖最后由 赚小钱 于 2020-6-15 20:35 编辑
赚小钱 发表于 2020-6-15 20:07
哎呀,看错了。原来是到毫秒级别。那 golang 妥妥的支持啊。我的垃圾 cpu 能到 18 微秒。

以下是原回复 ...


Rust 就更惨了

  1. use std::{thread, time};

  2. fn main() {
  3.     (0..10).for_each(|_| {
  4.         let now = time::Instant::now();
  5.         let nanosecond = time::Duration::from_nanos(1);
  6.         thread::sleep(nanosecond);
  7.         let elapsed = now.elapsed();
  8.         println!("elapsed: {:?}", elapsed);
  9.     });
  10. }
复制代码


elapsed: 351.352µs
elapsed: 919.306µs
elapsed: 997.252µs
elapsed: 551.586µs
elapsed: 209.966µs
elapsed: 151.802µs
elapsed: 101.815µs
elapsed: 1.816756ms
elapsed: 1.056801ms
elapsed: 986.285µs

因为 rust 在库函数中调用的 libc,所以,与 c 的表现是一致的。而 golang 是自己实现的,所以精度更高。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-6-15 19:24:47 | 显示全部楼层
最简单的办法:换一门语言
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 19:25:22 | 显示全部楼层
本帖最后由 永恒的蓝色梦想 于 2020-6-15 19:30 编辑
  1. from time import time
  2. from sys import stdout

  3. begin=time()

  4. while True:
  5.     stdout.write(f"{time()-begin:.6f}\n")
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 19:25:46 | 显示全部楼层
赚小钱 发表于 2020-6-15 19:24
最简单的办法:换一门语言

C 同样不支持。GoLang 支持嘛?
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 19:25:48 | 显示全部楼层
额,你是想要sleep精确到小数点后六位,还是说其他的

不好意思没怎么看懂你的题目
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 19:32:59 | 显示全部楼层


我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的...

与每时每刻你的电脑运行状态还有很大的关系
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-15 20:03:04 | 显示全部楼层
赚小钱 发表于 2020-6-15 19:24
最简单的办法:换一门语言

LOL
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-15 20:03:35 | 显示全部楼层
Twilight6 发表于 2020-6-15 19:32
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的.. ...

thx
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-15 20:04:24 | 显示全部楼层
Twilight6 发表于 2020-6-15 19:32
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的.. ...

是sleep哈,抱歉没解释清楚
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-15 20:04:55 | 显示全部楼层
Twilight6 发表于 2020-6-15 19:32
我觉得精确到这么小已经就不用在继续精确下去了,因为越精确对环境的要求越大,产生的误差也是一样的.. ...

啊呀,回复错了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 20:06:24 | 显示全部楼层

哈哈 没事,你回我三次了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 20:07:27 | 显示全部楼层
本帖最后由 赚小钱 于 2020-6-15 20:11 编辑

哎呀,看错了。原来是到毫秒级别。那 golang 妥妥的支持啊。我的垃圾 cpu 能到 18 微秒。

以下是原回复,懒得修改了。

永恒的蓝色梦想 发表于 2020-6-15 19:25
C 同样不支持。GoLang 支持嘛?


结果比较遗憾。时间精度达不到 μs 的级别。锁,系统调用的时间开销比较大。我去试一下 rust。
  1. package main

  2. import (
  3.         "fmt"
  4.         "time"
  5. )

  6. func main() {
  7.         var (
  8.                 totalTime time.Duration
  9.                 count     int
  10.         )
  11.         c := make(chan time.Duration, 10)

  12.         go func() {
  13.                 for i := 0; i < 10; i++ {
  14.                         start := time.Now()
  15.                         time.Sleep(time.Microsecond)
  16.                         c <- time.Since(start)
  17.                 }
  18.                 close(c)
  19.         }()

  20.         for value := range c {
  21.                 totalTime += value
  22.                 count++
  23.                 fmt.Printf("elapsed %s\n", value)
  24.         }
  25.         fmt.Printf("avg: %s\n", totalTime/time.Duration(count))
  26. }
复制代码

  1. elapsed 31.615&micro;s
  2. elapsed 77.752&micro;s
  3. elapsed 14.408&micro;s
  4. elapsed 17.315&micro;s
  5. elapsed 6.637&micro;s
  6. elapsed 7.053&micro;s
  7. elapsed 5.847&micro;s
  8. elapsed 6.597&micro;s
  9. elapsed 6.563&micro;s
  10. elapsed 6.346&micro;s
  11. avg: 18.013&micro;s
复制代码


cpu 也不太行

  1. processor       : 3
  2. vendor_id       : AuthenticAMD
  3. cpu family      : 21
  4. model           : 96
  5. model name      : AMD Opteron(tm) X3421 APU
  6. stepping        : 1
  7. microcode       : 0x6006118
  8. cpu MHz         : 1563.177
  9. cache size      : 1024 KB
  10. physical id     : 0
  11. siblings        : 4
  12. core id         : 3
  13. cpu cores       : 2
  14. apicid          : 19
  15. initial apicid  : 3
  16. fpu             : yes
  17. fpu_exception   : yes
  18. cpuid level     : 13
  19. wp              : yes
  20. flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr pge mca cmov pat pse36 clflush mmx fxsr sse sse2 ht syscall nx mmxext fxsr_opt pdpe1gb rdtscp lm constant_tsc rep_good acc_power nopl nonstop_tsc cpuid extd_apicid aperfmperf pni pclmulqdq monitor ssse3 fma cx16 sse4_1 sse4_2 movbe popcnt aes xsave avx f16c lahf_lm cmp_legacy svm extapic cr8_legacy abm sse4a misalignsse 3dnowprefetch osvw ibs xop skinit wdt lwp fma4 tce nodeid_msr tbm topoext perfctr_core perfctr_nb bpext ptsc mwaitx cpb hw_pstate ssbd vmmcall fsgsbase bmi1 avx2 smep bmi2 xsaveopt arat npt lbrv svm_lock nrip_save tsc_scale vmcb_clean flushbyasid decodeassists pausefilter pfthreshold avic v_vmsave_vmload vgif overflow_recov
  21. bugs            : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
  22. bogomips        : 4192.27
  23. TLB size        : 1536 4K pages
  24. clflush size    : 64
  25. cache_alignment : 64
  26. address sizes   : 48 bits physical, 48 bits virtual
  27. power management: ts ttp tm 100mhzsteps hwpstate cpb eff_freq_ro acc_power [13]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 20:08:45 | 显示全部楼层
不知道是老师交代的任务,还是因为你里面有music,这个音频信号(44100次采样每秒)是超过千分之一精度的。如果你要做的是音频,这个只需要交给底层,他们会做的。老师应该大概率不会布置如此任务。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-6-15 20:34:09 | 显示全部楼层    本楼为最佳答案   
本帖最后由 赚小钱 于 2020-6-15 20:35 编辑
赚小钱 发表于 2020-6-15 20:07
哎呀,看错了。原来是到毫秒级别。那 golang 妥妥的支持啊。我的垃圾 cpu 能到 18 微秒。

以下是原回复 ...


Rust 就更惨了

  1. use std::{thread, time};

  2. fn main() {
  3.     (0..10).for_each(|_| {
  4.         let now = time::Instant::now();
  5.         let nanosecond = time::Duration::from_nanos(1);
  6.         thread::sleep(nanosecond);
  7.         let elapsed = now.elapsed();
  8.         println!("elapsed: {:?}", elapsed);
  9.     });
  10. }
复制代码


elapsed: 351.352&micro;s
elapsed: 919.306&micro;s
elapsed: 997.252&micro;s
elapsed: 551.586&micro;s
elapsed: 209.966&micro;s
elapsed: 151.802&micro;s
elapsed: 101.815&micro;s
elapsed: 1.816756ms
elapsed: 1.056801ms
elapsed: 986.285&micro;s

因为 rust 在库函数中调用的 libc,所以,与 c 的表现是一致的。而 golang 是自己实现的,所以精度更高。
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-6-15 20:39:38 | 显示全部楼层

谢谢了,我还是老老实实用0.001s吧
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-6-21 22:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表