【C#篇】关于Thread.Sleep(1),实际耗时15.6212ms的问题

news2024/11/25 11:22:36

问题描述:

睡眠线程耗时测试:

DateTime startTime = DateTime.Now;

Thread.Sleep(1);

DateTime endTime = DateTime.Now;

TimeSpan tp = endTime - startTime;

txtMsg.AppendText("睡眠线程耗时测试:"+ (tp.TotalMilliSeconds-1)+ “ms” + Enviroment.NewLine);

运行发现,耗时14.6212ms。初步判断,开启Thread.Sleep()方法有一个耗时,这个耗时为14.6212ms。

为了进一步验证这一判断。

写了一个控制台程序,程序中写了一个循环,然后控制每次循环执行的持续时间,分别为2ms,3ms,4ms,5ms.

按照如下代码执行,发现平均耗时均为15.6212ms.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;

namespace testhuahan
{
    class Program
    {
        static void Main(string[] args)
        {
            int count=Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("执行中......");

            DateTime starttime = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                Thread.Sleep(1);
            }
            DateTime endtime = DateTime.Now;
            TimeSpan tp = endtime - starttime;
            Console.WriteLine("开始时间:"+starttime);
            Console.WriteLine("结束时间:"+endtime);
            Console.WriteLine("总计耗时:"+tp.TotalMilliseconds);
            Console.WriteLine("总计耗时:"+tp.TotalMilliseconds);
            Console.WriteLine("平均耗时:" + tp.TotalMilliseconds/count);
            Console.ReadKey();
        }
    }
}

解决方案:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Threading;
using System.Runtime.InteropServices;

namespace testhuahan
{
    class Program
    {
        //--------------------------------------
        [DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
        public static extern uint MM_BeginPeriod(uint uMilliseconds);
        [DllImport("winmm.dll", EntryPoint = "timeEndPeriod")]
        public static extern uint MM_EndPeriod(uint uMilliseconds);
        //---------------------------------------
        static void Main(string[] args)
        {
            MM_BeginPeriod(1);//-----------------------
            int count=Convert.ToInt32(Console.ReadLine());
            Console.WriteLine("执行中......");

            DateTime starttime = DateTime.Now;
            for (int i = 0; i < count; i++)
            {
                Thread.Sleep(1);
            }
            DateTime endtime = DateTime.Now;
            TimeSpan tp = endtime - starttime;
            Console.WriteLine("开始时间:"+starttime);
            Console.WriteLine("结束时间:"+endtime);
            Console.WriteLine("总计耗时:"+tp.TotalMilliseconds);
            Console.WriteLine("总计耗时:"+tp.TotalMilliseconds);
            Console.WriteLine("平均耗时:" + tp.TotalMilliseconds/count);
            Console.ReadKey();
            MM_EndPeriod(1);//--------------------------
        }
    }
}

运行结果:

这样,开启Thread.Sleep()方法的耗时变为0.833234ms。

需要设置循环的时间间隔为2ms,3ms,4ms,5ms等要求时,便不会再出现十几毫秒,相差太大的情况了。

以下是参考的“Thread.Sleep精度问题”的博客:

Thread.Sleep的精度默认在15ms左右,如果需要类似 Thread.Sleep(1)的精细控制,需要调用特定的平台API实现

[DllImport("winmm.dll", EntryPoint = "timeBeginPeriod")]
public static extern uint MM_BeginPeriod(uint uMilliseconds);

[DllImport("winmm.dll", EntryPoint = "timeEndPeriod")]
public static extern uint MM_EndPeriod(uint uMilliseconds);

MM_BeginPeriod(1);
Thread.Sleep(1);
MM_EndPeriod(1);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/383654.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Android jetpack Compose使用及性能优化小结

大概在两年前在星河集团的左邻右家项目中&#xff0c;我就接触到了jetpack Compose&#xff0c;并且还项目中在逻辑简单的页面&#xff0c;使用了compose去实现。当时觉得很新颖&#xff0c;实践中也感觉到&#xff0c;这种响应式的&#xff0c;与当时的Vue/微信小程序/Flutter…

JDK动态代理详解

1.什么是动态代理 可能很多小伙伴首次接触动态代理这个名词的时候&#xff0c;或者是在面试过程中被问到动态代理的时候&#xff0c;不能很好的描述出来&#xff0c;动态代理到底是个什么高大上的技术。不方&#xff0c;其实动态代理的使用非常广泛&#xff0c;例如我们平常使用…

考研复试——计算机网络

文章目录计算机网络1. 说下计算机网络体系结构2. 说一下每层协议有哪些&#xff1f;3. 数据在各层之间是如何传输的呢&#xff1f;4. [从浏览器地址栏输入 url 到显示主页的过程&#xff1f;](https://blog.csdn.net/weixin_46351593/article/details/115386029)5. 说说 HTTP 常…

Guitar Pro8中文版打谱编曲软件

许多打谱编曲软件中都有吉他乐器的插件&#xff0c;插入音轨即可使用&#xff0c;除此以外&#xff0c;还有一款专门针对吉他的音乐软件&#xff0c;就是Guitar Pro。Guitar Pro是吉他类音乐软件中比较有代表性的&#xff0c;从开发至今不断更新优化&#xff0c;目前的软件版本…

如何远程访问公司的电脑?

是否可以从其他地方远程访问公司的电脑&#xff1f;答案是肯定的。一个可靠的远程桌面工具可以让您从另一台设备远程访问您的工作电脑&#xff0c;无论位置如何&#xff0c;无论您是在咖啡厅、酒店还是家中&#xff0c;您都可以从另一台电脑或移动设备远程访问您工作的电脑以处…

【算法基础】深度优先搜索(DFS) 广度优先搜索(BFS)

一、DFS & BFS 1. 深度优先搜索DFS 深度优先搜索属于图算法的一种,英文缩写为DFS即Depth First Search.其过程简要来说是对每一个可能的分支路径深入到不能再深入为止,而且每个节点只能访问一次。 2. 广度优先搜索BFS 广度优先搜索较之深度优先搜索之不同在于,深度…

TCP内部的十大核心机制

文章目录1、确认应答机制2、超时重传机制3、连接管理机制1、三次握手2、四次挥手4、滑动窗口机制5、流量控制机制6、拥塞控制7、延时应答机制8、捎带应答机制9、面向字节流10、特殊情况1、确认应答机制 TCP是可靠传输&#xff0c;那么TCP协议能够实现可靠传输的核心机制就是确…

Anker推出Security SmartTrack卡,详谈苹果Find My技术

Anker 旗下品牌 Eufy 近日在欧洲、美国市场推出了 Security SmartTrack 卡。其工作原理和苹果 AirTag 类似&#xff0c;允许用户通过手机定位追踪到绑定的物品。 Security SmartTrack卡通过蓝牙连接&#xff0c;范围为 260 英尺&#xff08;约 80 米&#xff09;。采用防水设…

跨境数据传输是日常业务中经常且至关重要的组成部分

跨境数据传输是日常业务中经常且至关重要的组成部分。在过去的20年中&#xff0c;由于全球通信网络和业务流程的发展&#xff0c;全球数据流的模式已迅速发展。随着数据从数据中心移到数据中心和/或跨边界移动&#xff0c;安全漏洞已成为切实的风险。有可能违反国家和国际数据传…

INOBITEC PRO DICOM VIEWER 2.9.0 Crack

inobitec dicom高级 3D 重建&#xff0c;以 OBJ、STL、PLY 格式导出表面&#xff0c;先进的多计划重建&#xff0c;添加标记和标记线&#xff0c;将系列与高级工具相结合&#xff0c;具有多种选择的虚拟内窥镜检查&#xff0c;从视口录制视频&#xff08;仅限 64 位版本&#x…

CSS的6个新特性

1、容器查询&#xff08;Container Queries&#xff09; 容器查询container类似于媒体查询media&#xff0c;区别在于查询所依据的对象不同。媒体查询依据的是浏览器的视窗大小&#xff0c;容器查询依据的是元素的父元素或者祖先元素的大小。 有关容器查询的属性一共有三个&a…

vue2的动画和过渡效果

文章目录过渡 & 动画Transition 组件基于 CSS 的过渡效果CSS 过渡类名 class为过渡效果命名CSS 过渡 transition实例1&#xff1a;实例2&#xff1a;CSS 动画自定义过渡的类名同时使用 transition 和 animation深层级过渡与显式过渡时长性能考量JavaScript 动画可复用过渡效…

STM32 HAL库硬I2C的TOF050C模块

前言最近在倒腾毕业设计&#xff0c;需要用到TOF050C&#xff0c;但是现有的案例都是软IIC&#xff0c;并且还是基于STM32F103的&#xff0c;笔者用的STM32F767&#xff0c;没有GPIO->CRH寄存器。问题来了&#xff0c;如果我每次都要去看寄存器手册属实费时间&#xff0c;这…

案例08-让软件的使用者成为软件的设计者

一&#xff1a;背景介绍 对于需求的开发每天可能都会有上线的情况&#xff0c;为了防止每次上线拉取代码或者修改配置而引发的冲突以及发生了冲突应该找谁一起确定一下代码留下那一部分的情况。所以在开发的群中会有一个表格来记录每个需求上线修改的环境、是否修改数据库、是否…

【论文阅读】Research on video adversarial attack with long living cycle

论文链接&#xff1a;添加链接描述 Method OPTIMIZATION PROBLEM DESCRIPTION XXX是浮点数域中的对抗视频示例&#xff0c;XcX_cXc​表示encoded的视频对抗示例。设EXˆ−XE Xˆ−XEXˆ−X表示在对抗中增加的扰动&#xff0c;EcXc−XE_c Xc − XEc​Xc−X表示视频压缩编码损…

【线性筛+DP】最大和

看错题了&#xff0c;呃呃&#xff0c;其实就是个简单DP最大和 - 蓝桥云课 (lanqiao.cn)题意&#xff1a;思路&#xff1a;设dp[i]为以1为终点的最大和&#xff0c;然后枚举状态和决策就行了主要是线性筛的应用&#xff0c;它可以预处理出一个数的最小质因子是多少Code&#xf…

如何用BurpSuite抓取手机数据包

文章目录前言准备工具Burp Suite物理机或虚拟机(移动设备)手机抓包网络环境开启burp并设置代理手机配置代理安装Burp证书开始抓包踩坑后记前言 最近挖了一波src&#xff0c;挖来挖去发现有很多公众号或者app没有测试&#xff0c;这就需要Burp能够抓取手机的数据包了&#xff0…

九州云出席全球人工智能开发者先锋大会,圆桌论道开源未来

2月25日-26日&#xff0c;2023年全球人工智能开发者先锋大会&#xff08;GAIDC&#xff09;在临港成功召开。本届盛会以“向光而行的开发者”为主题&#xff0c;汇集政府职能部门领导、国内外知名专家学者、具有国际影响力的开源创业者&#xff0c;聚焦前瞻探索、开源开放、人才…

Linux gcc/g++编译链接头文件和库(动态库.so 和 静态库.a)

最近在学习log4cpp库时&#xff0c;使用g去编译&#xff0c;却发现自己不会链接...&#xff0c;这哪能行&#xff0c;于是网上钻研&#xff0c;终于解决&#xff0c;现在记录下来分享给遇到同样问题的人。 gcc和g类似&#xff0c;这里就以g为例&#xff01; 刚好用到的log4cpp…

测开:vue入门(1)

目录 一、背景 二、介绍 三、创建项目 3.1 创建vue项目 方式二&#xff1a;直接在html页面中&#xff0c;引入vue 3.2 直接在html页面中&#xff0c;引入vue 3.2.1 引入在线的vue&#xff08;方式一&#xff09; 3.2.2 将vue 下载到本地&#xff08;方式二&#xff09; …