鱼C论坛

 找回密码
 立即注册
查看: 1349|回复: 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 就更惨了
use std::{thread, time};

fn main() {
    (0..10).for_each(|_| {
        let now = time::Instant::now();
        let nanosecond = time::Duration::from_nanos(1);
        thread::sleep(nanosecond);
        let elapsed = now.elapsed();
        println!("elapsed: {:?}", elapsed);
    });
}

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 是自己实现的,所以精度更高。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-6-15 19:24:47 | 显示全部楼层
最简单的办法:换一门语言
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

begin=time()

while True:
    stdout.write(f"{time()-begin:.6f}\n")
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

C 同样不支持。GoLang 支持嘛?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

不好意思没怎么看懂你的题目
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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


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

与每时每刻你的电脑运行状态还有很大的关系
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

LOL
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

thx
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

是sleep哈,抱歉没解释清楚
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

啊呀,回复错了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

哈哈 没事,你回我三次了
想知道小甲鱼最近在做啥?请访问 -> 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。
package main

import (
        "fmt"
        "time"
)

func main() {
        var (
                totalTime time.Duration
                count     int
        )
        c := make(chan time.Duration, 10)

        go func() {
                for i := 0; i < 10; i++ {
                        start := time.Now()
                        time.Sleep(time.Microsecond)
                        c <- time.Since(start)
                }
                close(c)
        }()

        for value := range c {
                totalTime += value
                count++
                fmt.Printf("elapsed %s\n", value)
        }
        fmt.Printf("avg: %s\n", totalTime/time.Duration(count))
}
elapsed 31.615µs
elapsed 77.752µs
elapsed 14.408µs
elapsed 17.315µs
elapsed 6.637µs
elapsed 7.053µs
elapsed 5.847µs
elapsed 6.597µs
elapsed 6.563µs
elapsed 6.346µs
avg: 18.013µs

cpu 也不太行
processor       : 3
vendor_id       : AuthenticAMD
cpu family      : 21
model           : 96
model name      : AMD Opteron(tm) X3421 APU
stepping        : 1
microcode       : 0x6006118
cpu MHz         : 1563.177
cache size      : 1024 KB
physical id     : 0
siblings        : 4
core id         : 3
cpu cores       : 2
apicid          : 19
initial apicid  : 3
fpu             : yes
fpu_exception   : yes
cpuid level     : 13
wp              : yes
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
bugs            : fxsave_leak sysret_ss_attrs null_seg spectre_v1 spectre_v2 spec_store_bypass
bogomips        : 4192.27
TLB size        : 1536 4K pages
clflush size    : 64
cache_alignment : 64
address sizes   : 48 bits physical, 48 bits virtual
power management: ts ttp tm 100mhzsteps hwpstate cpb eff_freq_ro acc_power [13]
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

使用道具 举报

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

以下是原回复 ...


Rust 就更惨了
use std::{thread, time};

fn main() {
    (0..10).for_each(|_| {
        let now = time::Instant::now();
        let nanosecond = time::Duration::from_nanos(1);
        thread::sleep(nanosecond);
        let elapsed = now.elapsed();
        println!("elapsed: {:?}", elapsed);
    });
}

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 是自己实现的,所以精度更高。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

谢谢了,我还是老老实实用0.001s吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-20 16:33

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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