请教高人关于 C# 时间精确度的问题?

Oo凌轩oO 2014-12-13 05:06:43
我想用精确的时间计算,需要精确到毫秒级别,代码运行后发下有误差。请教高人怎么实现。

static System.Diagnostics.Stopwatch stw = new System.Diagnostics.Stopwatch();
static int testNum = 0;
stw.Start();
while (true)
{
System.TimeSpan startTime = stw.Elapsed;

if (testNum % 100 == 0)
{

//TODO do something

Console.WriteLine(string.Format("循环{0}次,用时{1}秒。\r\n", testNum, stw.Elapsed.TotalSeconds));
}

while ((stw.Elapsed - startTime).TotalMilliseconds <= 10)
{
System.Threading.Thread.Sleep(5);
}
testNum++;
}

结果如图:
...全文
531 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
yanghh4 2018-10-31
  • 打赏
  • 举报
回复
https://download.csdn.net/download/linxi0093/9526112 新人,没分,可否给发个下载链接?谢谢兄弟
Oo凌轩oO 2016-12-09
  • 打赏
  • 举报
回复
引用 14 楼 u010705087 的回复:
[quote=引用 13 楼 linxi0093 的回复:] 增加了对时间的修正后误差可以大大减小,如下图,虽然误差率偏高,但是基本满足我的需求了。结贴拿经验。
不要sleep不行吗[/quote] 不要就不能控制10ms循环一次了
u010705087 2016-01-29
  • 打赏
  • 举报
回复
引用 13 楼 linxi0093 的回复:
增加了对时间的修正后误差可以大大减小,如下图,虽然误差率偏高,但是基本满足我的需求了。结贴拿经验。
不要sleep不行吗
Oo凌轩oO 2014-12-17
  • 打赏
  • 举报
回复
增加了对时间的修正后误差可以大大减小,如下图,虽然误差率偏高,但是基本满足我的需求了。结贴拿经验。
superliu1122 2014-12-14
  • 打赏
  • 举报
回复
不知道楼主要实现什么功能,如果是要精确的控制代码执行的时机和时间的话,我觉得楼主需要一个实时操作系统,windows不适合你,至少标准的windows不适合
threenewbee 2014-12-14
  • 打赏
  • 举报
回复
要精确到毫秒,可以用StopWatch类,或者用GetTickCount API 前者msdn自己查,后者参考 http://www.cnblogs.com/jxsoft/archive/2011/10/17/2215366.html
  • 打赏
  • 举报
回复
引用 6 楼 github_22161131 的回复:
windows系统定时器精度默认是15.625ms,所以一般的办法不行。想要到10ms或者更高的精度需要通过api调整系统定时器到1ms精度,然后使用Socket.Poll来等待,这是能找到的最精确的方式,但是因为操作系统本身非实时,最后真正要每隔10ms执行任务估计很困难。所以最好先想想需求的必要性,再尝试实现。
如果这么干了,电脑上别的大量应用程序的性能会大大降低。windows上跑的是大量复杂的应用,同一时间有上千个线程进行抢先多任务调度,操作系统也很复杂。它不是只有几个非常简单的进程,它不能过分地修改定时器精度。
  • 打赏
  • 举报
回复
windows不是“实时操作系统” --> windows桌面或者服务器版不是“实时操作系统” 要纠结定时中断的“误差”,那你应该使用工业控制使用windows版。
  • 打赏
  • 举报
回复
引用 4 楼 linxi0093 的回复:
引用
不知道楼主要实现什么功能,如果是要精确的控制代码执行的时机和时间的话,我觉得楼主需要一个实时操作系统,windows不适合你,至少标准的windows不适合
我要实现的是每10毫秒运行一次代码(准备写在//TODO do something,现在还没完成),这个应该不需要实时操作系统来实现吧。
windows不是“实时操作系统”,定时器误差在50毫秒都是正常的。
Oo凌轩oO 2014-12-14
  • 打赏
  • 举报
回复
引用
windows系统定时器精度默认是15.625ms,所以一般的办法不行。想要到10ms或者更高的精度需要通过api调整系统定时器到1ms精度,然后使用Socket.Poll来等待,这是能找到的最精确的方式,但是因为操作系统本身非实时,最后真正要每隔10ms执行任务估计很困难。所以最好先想想需求的必要性,再尝试实现。
代码用的System.Diagnostics.Stopwatch计时类,精度能达到毫秒级别。跟踪发现 System.Threading.Thread.Sleep(1); 停顿时间在1.2-1.5ms,所以导致我的计时精度不能确定在10ms级别。不知道您有没有好的解决方法。
Oo凌轩oO 2014-12-14
  • 打赏
  • 举报
回复
引用
到底什么样的需求需要严格的10毫秒执行一次?这种级别的时间经度和cpu时钟有很大关系了,1楼版主的给你的方法可以精确计时(高精度下也和cpu时钟相关),但并不可以控制时间。你最好考虑下你的需求是否真的需要10毫秒精度。即便你间隔时间内保证,你的代码执行时间是否能每次精确在毫秒级内完成?
首先,确认需求10ms精度,其次确认代码代码执行时间能每次在10ms内完成。 我给的代码跟踪发现 System.Threading.Thread.Sleep(1); 停顿时间在1.2-1.5ms,所以导致我的计时精度不能确定在10ms级别。
winnowc 2014-12-14
  • 打赏
  • 举报
回复
windows系统定时器精度默认是15.625ms,所以一般的办法不行。想要到10ms或者更高的精度需要通过api调整系统定时器到1ms精度,然后使用Socket.Poll来等待,这是能找到的最精确的方式,但是因为操作系统本身非实时,最后真正要每隔10ms执行任务估计很困难。所以最好先想想需求的必要性,再尝试实现。
wjq 2014-12-14
  • 打赏
  • 举报
回复
到底什么样的需求需要严格的10毫秒执行一次?这种级别的时间经度和cpu时钟有很大关系了,1楼版主的给你的方法可以精确计时(高精度下也和cpu时钟相关),但并不可以控制时间。你最好考虑下你的需求是否真的需要10毫秒精度。即便你间隔时间内保证,你的代码执行时间是否能每次精确在毫秒级内完成?
Oo凌轩oO 2014-12-14
  • 打赏
  • 举报
回复
引用
不知道楼主要实现什么功能,如果是要精确的控制代码执行的时机和时间的话,我觉得楼主需要一个实时操作系统,windows不适合你,至少标准的windows不适合
我要实现的是每10毫秒运行一次代码(准备写在//TODO do something,现在还没完成),这个应该不需要实时操作系统来实现吧。
Oo凌轩oO 2014-12-14
  • 打赏
  • 举报
回复
引用
要精确到毫秒,可以用StopWatch类,或者用GetTickCount API 前者msdn自己查,后者参考 http://www.cnblogs.com/jxsoft/archive/2011/10/17/2215366.html
经过测试发现是System.Threading.Thread.Sleep(5);停止的时间不准确导致每次运行时间有差异的,不知道您有什么好办法能不能控制这个休眠时间?
Oo凌轩oO 2014-12-14
  • 打赏
  • 举报
回复
引用
windows不是“实时操作系统” --> windows桌面或者服务器版不是“实时操作系统” 要纠结定时中断的“误差”,那你应该使用工业控制使用windows版。
工业控制,windows版指的是什么,如果它还是在windows系统运行,它能精确控制中断的“误差”,C#不能实现吗?

110,533

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧