搜索
查看: 642|回复: 9
打印 上一主题 下一主题

此贴已删

[复制链接]
跳转到指定楼层
楼主
发表于 2017-3-3 18:56:20 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 tc_初学C 于 2018-4-30 18:25 编辑

此贴已删
















沙发
发表于 2017-3-3 19:28:54 | 只看该作者
  1. void sleep(unsigned t)
  2. {
  3.     while(clock() < (t += clock()))
  4.         ;
  5. }
复制代码
精确到10ms是不对的
视机器而定精度
板凳
 楼主| 发表于 2017-3-3 19:35:37 | 只看该作者
4399APPLE 发表于 2017-3-3 19:28
精确到10ms是不对的
视机器而定精度

也对
[mw_shl_code=c,true]void mysleep(unsigned t);
void mysleep(unsigned t)
{ t += clock(); loop:; if(clock() < t) goto loop; }[/mw_shl_code]
地板
 楼主| 发表于 2017-3-3 19:42:50 | 只看该作者
4399APPLE 发表于 2017-3-3 19:28
精确到10ms是不对的
视机器而定精度

不过我试了一下你的代码 感觉不可靠
你试试这段代码:
[mw_shl_code=c,true]#include <stdio.h>
#include <stdlib.h>
#include <time.h>
void mysleep(unsigned t);
void sleep(unsigned t);
void sleep(unsigned t)
{
    while(clock() < (t += clock()))
        ;
}
void mysleep(unsigned t)
{ t += clock(); loop:; if(clock() < t) goto loop; }
int main()
{
        int i = 0;
    int t = clock() / 1000;
    while(i < 100)
    {
                i++;
        sleep(1);
    }
    printf("sleep:%ds\n",(clock() / 1000) - t / 1000);
    t = clock();
    i = 0;
    while(i < 100)
    {
                i++;
        mysleep(1);
    }
    printf("mysleep:%ds\n",(clock() / 1000) - t / 1000);
    getchar();
        return 0;
}[/mw_shl_code]


5#
发表于 2017-3-4 14:34:13 | 只看该作者
初学C 发表于 2017-3-3 19:42
不过我试了一下你的代码 感觉不可靠
你试试这段代码:
[mw_shl_code=c,true]#include

我的错。。。这种地方不应该这样子做的。。。
但是这两种sleep在理论上是相等的
---------------------------------------
TDM-GCC-64 5.1.0下
我的Sleep生成的ASM:
  1. _Z5sleepj:
  2. .LFB4:
  3.         pushq        %rbp
  4.         .seh_pushreg        %rbp
  5.         pushq        %rbx
  6.         .seh_pushreg        %rbx
  7.         subq        $40, %rsp
  8.         .seh_stackalloc        40
  9.         leaq        128(%rsp), %rbp
  10.         .seh_setframe        %rbp, 128
  11.         .seh_endprologue
  12.         movl        %ecx, -64(%rbp)
复制代码
你的Sleep生成的ASM:
  1. _Z5sleepj:
  2. .LFB4:
  3.         pushq        %rbp
  4.         .seh_pushreg        %rbp
  5.         movq        %rsp, %rbp
  6.         .seh_setframe        %rbp, 0
  7.         subq        $32, %rsp
  8.         .seh_stackalloc        32
  9.         .seh_endprologue
  10.         movl        %ecx, 16(%rbp)
  11.         call        clock
  12.         addl        %eax, 16(%rbp)
复制代码
只截取关键部分
可以看到你的用call调用clock
我的用了lea调用
在这种对于时间精度要求很高的场合自然就分出问题
6#
 楼主| 发表于 2017-3-4 18:12:15 | 只看该作者
4399APPLE 发表于 2017-3-4 14:34
我的错。。。这种地方不应该这样子做的。。。
但是这两种sleep在理论上是相等的
--------------------- ...

那么哪一个效率高呢?                                                  
7#
发表于 2017-3-4 19:06:34 | 只看该作者
初学C 发表于 2017-3-4 18:12
那么哪一个效率高呢?

你的                                            
8#
发表于 2017-3-5 16:29:09 | 只看该作者
4399APPLE 发表于 2017-3-4 14:34
我的错。。。这种地方不应该这样子做的。。。
但是这两种sleep在理论上是相等的
--------------------- ...

应该是
[mw_shl_code=c,true]{
    t+=clock();
        while(clock() < t )
        ;
}[/mw_shl_code]?

[mw_shl_code=c,true] while(clock() < (t += clock()))执行完空语句后两个clock应该都会增加?
        ;[/mw_shl_code]
9#
发表于 2017-3-5 17:31:58 | 只看该作者
初学C 发表于 2017-3-3 19:42
不过我试了一下你的代码 感觉不可靠
你试试这段代码:
[mw_shl_code=c,true]#include

这样一毫秒一毫秒的进入函数不是会比一次跑完一个千位数的误差差很多吗?
10#
发表于 2017-3-21 17:38:30 | 只看该作者
sleep单纯在用户空间根本没法真正实现,别花心思了

sleep(n)的真正含义是让当前线程放弃CPU至少n秒,或是放弃CPU直到下一个信号被送至线程,都是操作系统的事情
busy polling clock根本不会放弃CPU
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表