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

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. K-means 算法

    本学习笔记参考自吴恩达老师机器学习公开课 聚类算法是一种无监督学习算法.k均值算法是其中应用最为广泛的一种,算法接受一个未标记的数据集,然后将数据聚类成不同的组.K均值是一个迭代算法,假设我们想要将数 ...

  2. ES 入门之一 安装ElasticSearcha

    安装ElasticSearcha 学习ES也有快一个月了,但是学习的时候一直没有总结.以前没有总结是因为感觉不会的很多,现在对ES有一点了解了.索性就从头从安装到使用ES做一个详细的总结,也分享给其他 ...

  3. jquery获取iframe页面的元素

    $("#iframe_id").contents().find("#iframe_page_id").val(); 其中,iframe_id是页面引用的ifra ...

  4. PHP扩展开发 第一课 为什么要写扩展及hello world

    PHP扩展开发其实很简单.那为什么要扩展开发呢. 这里咱们以实际的案例进行对比. 第一步,进入 php源码包   http://www.php20.com/forum.php?m ... =159&a ...

  5. mysql 有哪些索引

    Mysql支持哪几种索引 从数据结构角度 1.B+树索引(O(log(n))):关于B+树索引,可以参考 MySQL索引背后的数据结构及算法原理 2.hash索引:a 仅仅能满足"=&quo ...

  6. PhpStorm2017版激活方法、汉化方法以及界面配置

    PhpStorm激活和汉化文件下载网址:http://pan.baidu.com/s/1nuHF1St(提取密码:62cg) PHPMailer的介绍 PhpStorm是一个轻量级且便捷的PHP ID ...

  7. 自动化运维工具——puppet详解(一)

    一.puppet 介绍 1.puppet是什么 puppet是一个IT基础设施自动化管理工具,它能够帮助系统管理员管理基础设施的整个生命周期: 供应(provisioning).配置(configur ...

  8. 【Codeforces 788C】The Great Mixing

    http://codeforces.com/contest/788/problem/C 显然如果有两杯一样的酒,把它们当作同一杯就好了.所以k<=1e6毫无意义. 若选的x杯酒的浓度分别为a,b ...

  9. 关于C#中函数的认识

    对于C#语言中的函数,大概分之为函数的声明及其调用. 函数的声明: 1.函数的声明是指给一段代码取名称. 2.函数的声明位置必须在类中. 3.函数声明的语法: 函数声明的语法:static void ...

  10. JavaScript tips ——搞定闰年

    前言 处理时间时,常常要考虑用户的输入是否合法,其中一个很典型的场景就是平闰年的判断,网上其实有很多类似的算法,但是其实不必那么麻烦,下面我讲讲的我的思路. 规则 公元年数可被4整除为闰年,但是整百( ...