//================================================================================================

20130806_第一次修改    
     
     
     
     
    ccb_david
//================================================================================================

   
休息了一个礼拜,开始自己课后的学习,想起数据结构课程设计里有同学实现了缓慢画点的功能,于是通过联系本人得到了他的源程序。仔细查看他的程序后,在其中发现了一个我以前没接触过的sleep函数,于是我也对了解sleep函数做了一些资料的查找。

   
首先我自己也进行了试验,发现确实在视觉上能减缓画点的速度,那么实现这个功能的实现形式是怎样的呢?为此我询问了我的老师,他告诉我sleep函数的主要功能是让系统暂停这个应用的运行(使用CPU)。由于这个回答比较简洁,为了了解更多关于sleep函数的信息,我在网上查找了一些资料。

首先sleep函数在不同的操作系统下参数的内容是不一样的:
Dos: 

sleep(1); //停留1秒 

delay(100);
//停留100毫秒

Windows: 

Sleep(100); //停留100毫秒 

Linux: 

sleep(1); //停留1秒 

usleep(1000); //停留1毫秒 


其次在windows里Sleep函数的“S”是大写的,其他的都是小写。

接着我查看了sleep函数在WINBASE.H的定义,定义如下:
WINBASEAPI
VOID
WINAPI
Sleep(
    DWORD
dwMilliseconds
    );

通过定义我们知道Sleep函数里参数是双字型参数,且单位为毫秒。




为了测试是否真如资料中所讲Sleep函数的精度能够保证,我编写下面的程序用于测试其精度。

由于我们需要使用for循环,为了循环本身可能存在的误差,我们先将一次循环大致需要的时间计算出来。
检测循环时间源码部分:
#include<iostream>
using namespace std;
#include <windows.h>

#pragma comment(lib, "Winmm.lib")

int main()
{
   
timeBeginPeriod(1);

    int max,min;
    max=0;
    min=500;

    for(int
i=0;i<100;i++)
    {
      DWORD
timeBegin = timeGetTime();//开始时间(毫秒级)

     
for(int j=0; j<100000000;
j++);//用于测算循环一亿次需要花费的时间

      DWORD
timeOver = timeGetTime();//结束时间(毫秒级)

      if(
timeOver-timeBegin > max )
     
  max=timeOver-timeBegin;
      if(
timeOver-timeBegin < min )
     
  min=timeOver-timeBegin;
    }

   
cout<<"max
="<<max<<endl;
   
cout<<"min
="<<min<<endl;

    return 0;
}
经过运行我们可以得到循环一亿次for循环大概花费的时间在222-249毫秒之间,这样估计大约一次for循环花费的时间是2.22-2.49
ns,基本可以排除循环所带来的误差。


检测sleep函数延迟时间源码部分:
#include<iostream>
using namespace std;
#include <windows.h>

#pragma comment(lib, "Winmm.lib")

int main()
{
  timeBeginPeriod(1);//设置定时器的分辨率

  int a[100];
  int x0,y0;
  int x1,y1;
  x1=y1=100;
  x0=y0=0;

  while(x1)//为数组a赋初始值
  {
    a[x0]=0;
    x0++;
    x1--;
  }

  for(int i=0;i<100;i++)
  {
    DWORD timeBegin =
timeGetTime();//开始时间(毫秒级)

    Sleep(50);

    DWORD timeOver =
timeGetTime();//结束时间(毫秒级)

   
a[i]=timeOver-timeBegin;
  }

  //为了保证输出流不影响测试,我们将输出放在测试循环外
  while(y1)//将所有数组里记录的数据全部输出
  {
   
cout<<"第"<<y0+1<<"次用时:"<<a[y0]<<"
毫秒。"<<endl;
    y0++;
    y1--;
  }

  return 0;
}
经过运行我们可以得到100个输出,其中只有1个输出为51其他均为50,根据这些数据,我们可以基本认为,sleep函数的精度基本上可以说在1毫秒左右。

*注:如果讲究严谨,我们还需要考虑三个赋值运算与一个减法运算。但是通过汇编语言层面我们可以知道,赋值与减法运算在寄存器内部进行操作,所以在这个测试中我们基本可以排除赋值运算与减法运算对我们本次测试的影响。





即使有一天在技术上我已经是个能手,请记住自己应有的责任和保持一个真诚交流、始终渴望追求技术的心。
 
     
     
     
     
     
     
     
     
     
     
     
----------ccb_warlock

关于sleep函数的一些问题和资料的更多相关文章

  1. jQuery 2.0.3 源码分析Sizzle引擎 - 编译函数(大篇幅)

    声明:本文为原创文章,如需转载,请注明来源并保留原文链接Aaron,谢谢! 从Sizzle1.8开始,这是Sizzle的分界线了,引入了编译函数机制 网上基本没有资料细说这个东东的,sizzle引入这 ...

  2. probe函数何时调用的

    转自:http://blog.csdn.net/xiafeng1113/article/details/8030248 Linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名 ...

  3. 本函数用来改变目前 php 执行的目录到新的 directory 目录中

    chdir : 改变目录. dir : 目录类别类. closedir : 关闭目录 handle. opendir : 打开目录 handle. readdir : 读取目录 handle. rew ...

  4. c语言之函数指针

    一.基础研究 这里研究的内容是函数指针,需要我们在研究后构造程序来描述函数指针数组的用法和向函数传函数指针的方法. 指针有很多种:整型指针.结构体指针.数组指针等等,它们的本质是它们的值都是一个地址, ...

  5. C51函数的递归调用

    前几天在写C51程序时用到了递归,简单程序如下: void WRITE_ADD(uchar addr,uchar wbyte) { START(); //先发送起始信号 WRITE_BYTE(0xa0 ...

  6. 如何使用getopt()函数解析参数

    最近在写程序的过程中,把一部分时间都花费在程序对参数的处理上.今天听了学长说到getopt函数,才发现原来c里面还有一个专门解决参数处理的函数,查询了相关资料,这里简单总结一下. 使用int main ...

  7. linux中 probe函数的何时调用的?

    点击打开链接 linux中 probe函数何时调用的 所以的驱动教程上都说:只有设备和驱动的名字匹配,BUS就会调用驱动的probe函数,但是有时我们要看看probe函数里面到底做了什么,还有传递给p ...

  8. HashMap中的hash函数

    在写一个HashSet时候有个需求,是判断HashSet中是否已经存在对象,存在则取出,不存在则add添加.HashSet也是通过HashMap实现,只用了HashMap的key,value都存储一个 ...

  9. SQLITE3 使用总结(直接使用C函数)

    转载网址:http://blog.chinaunix.net/uid-8447633-id-3321394.html 前序: Sqlite3 的确很好用.小巧.速度快.但是因为非微软的产品,帮助文档总 ...

随机推荐

  1. MVC模式tp框架四中路由形式

    ①基本get形式 http://网址/index.php?m=分组&c=控制器&a=操作方法 该方法是最底层的get形式,传统的传递参数方式,不安全. ②pathinfo路径形式[默认 ...

  2. c语言贪吃蛇详解3.让蛇动起来

    c语言贪吃蛇详解3.让蛇动起来 前几天的实验室培训课后作业我布置了贪吃蛇,今天有时间就来写一下题解.我将分几步来教大家写一个贪吃蛇小游戏.由于大家c语言未学完,这个教程只涉及数组和函数等知识点. 上次 ...

  3. PHP 常用字符串函数

    1.查找字符位置函数 strpos($str,search,[int]):查找search在$str中的第一次位置从int开始: stripos($str,search,[int]):函数返回字符串在 ...

  4. 40.Linux应用调试-使用gdb和gdbserver

    1.gdb和gdbserver调试原理 通过linux虚拟机里的gdb,来向开发板里的gdbserver发送命令,比如设置断点,运行setp等,然后开发板上的gdbserver收到命令后,便会执行应用 ...

  5. 通过Javascript调用微软认知服务情感检测接口的两种实现方式

    这是今天在黑客松现场写的代码.我们的项目需要调用认知服务的情感识别接口.官方提供了一种方式,就是从一个远程图片进行识别.我另外写了一个从本地文件读取并上传进行识别的例子. 官方文档,请参考 https ...

  6. (一)—Linux安装与硬盘分区

    相信很多人对linux充满了喜爱,尤其是技术人员,玩惯了windows更想尝试一下这个系统.关于它的优点多多,当然,你的好你的坏,用过才明白!下面我这个菜鸟也来玩装个玩玩. 我不会那么冲动,上来就把自 ...

  7. Java内存模型—JMM

     有时候编译器.处理器的优化会导致runtime与我们设想的不一样,为此Java对编译器和处理器做了一些限制,JAVA内存模型(JMM)将这些抽象出来,这样编写代码时就无需考虑那么多底层细节,并保证& ...

  8. 读《淘宝技术这十年》 总结下web架构的发展

    关键词就两 分布式 缓存 分布式 数据库,应用服务器等的多节点部署,数据库的读写分离,剥离文件系统 缓存 数据缓存 静态页面缓存 php时代 最初LAMP起步 并将数据库做读写分离,拆分为主库+从库 ...

  9. 《Linux调优工具oprofile的演示分析》

    根据CPU架构oprofile采样的触发有两种模式:1) NMI模式: 利用处理器的performance counter功能, 指定counter的类型type和累进数量count. 比如 type ...

  10. 牛腩新闻公布系统--学习Web的小技巧汇总

    2014年11月10日,是个难忘的日子.这一天.小编的BS学习開始了.BS的开头,从牛腩新闻公布系统開始.之前学习的内容都是CS方面的知识,软考过后.開始学习BS,接触BS有几天的时间了,跟着牛腩老师 ...