DateTime.UtcNow.Ticks有时跳跃了一个显着的数额

DateTime.UtcNow.Ticks有时跳跃了一个显着的数额,第1张

概述DateTime.UtcNow.Ticks有时跳跃了一个显着的数额

在一个打印出DateTime.UtcNow.Ticks的值的紧密循环的testing应用程序中,我注意到这个值会每隔一个小时跳过一次。 仔细查看以下示例数据:

1:52:14.312 PM - 633614215343125000 1:52:14.359 PM - 633614215343593750 1:52:14.421 PM - 633614215344218750 1:52:14.468 PM - 633614215344687500 1:52:14.515 PM - 633614215998593750 <-- WAY different

三angular洲是653906250滴答(65.390秒)。 我能想出的唯一原因是windows Time服务正在从我的脚下进行一些同步。

有没有专家可以证实这一点?

在一个小时左右的时间里漂stream一分钟左右,对我来说似乎很糟糕,但是在这里呢?

GetwindowRect在一个应用程序上返回错误的值,所有其他应用程序都是正确的

单实例.NET核心应用程序(或使crontab只运行我的应用程序的一个实例)

推荐linux + Java书籍,为.NET开发者提供资源

检查另一个进程在.NET中是否具有pipe理员权限

Registry.SetValue不适用于x86

如何为商业windows应用程序创buildtesting环境?

制作autorun应用程序的最佳解决scheme?

版本控制的生产环境

解决windows 7中registry *** 作限制的解决方法?

原始打印设置DevMode选项(方向,副本,边距,默认来源等)

其实,只要用这个循环运行一些测试:

static DateTime past = DateTime.UtcNow; static voID PrintTime() { while (stopLoop == 0) { DateTime Now = DateTime.UtcNow; Console.Writeline("{0} - {1} d: {2}",Now,Now.Ticks,Now - past); Program.past = Now; Thread.Sleep(2000); } }

如果我在两次呼叫之间改变系统的时钟时间,三角洲会相应跳转。 所以如果你有时间同步运行或者其他一些影响系统时间的进程,那么就会在输出中反映出来。

埃姆…

你怎么能这样测量时间,当你不能确定你在这段时间内没有调用某个阻塞的系统调用(比如,可能是Console.Writeline)?

为了进行“工作测试”,您必须至少确保:

没有其他人在你的机器上运行

进程/线程优先级设置为高或类似的东西

调用NO系统调用…只执行计算任务

将线程关联设置为特定的cpu,以免在cpu之间切换

即使你这样做, *** 作系统会不时(例如在windows双核桌面 *** 作系统15毫秒)抢占你的线程….而你仍然可以看到UTC跳跃式的时间 – 邮票。

从用户空间到内核空间(在抢占/系统调用期间),并且在没有做任何实质的内核工作的情况下,将需要约1000个cpu周期…

如果你的进程处于等待状态(通过调用一些阻塞IO),甚至可能会更糟糕…

所以我真的没有得到你的“测试”。 海事组织这是完全正常的。

你可以发布代码来显示你如何生成这些数据吗? 并提供有关您正在运行的机器的详细信息?

使用以下,我没有得到你所得到的。

for (int i = 0; i < 10; i++) { Console.Writeline(DateTime.Now.TolongTimeString().ToString() + " - " + DateTime.UtcNow.Ticks.ToString()); Thread.Sleep(10); }

Esteban是正确的,系统时钟的改变会导致连续轮询之间的增量时间的改变。 windows时间服务是否每小时进行一次这些更改? 在一个小时内漂流一分钟?

为了在你的机器上发现这种情况,如果你跟踪检查之间的变化,你可以设置一个条件断点,这个变化的变化非常大。

long delta = 0; long ticks = 0; long lastTicks = DateTime.UtcNow.Ticks; while (true) { ticks = DateTime.UtcNow.Ticks; delta = ticks - lastTicks; lastTicks = ticks; // Conditional breakpoint: delta > 100000000 Is True Console.Writeline("{0} - {1}",ticks,delta); }

原始输出被捕获在DeBUGVIEw中。 我的托管应用程序正在调用OutputDeBUGString调用,只需从线程中的紧密循环中输出DateTime.UtcNow.Ticks(也称为Thread.Sleep(1))即可。

\ JLECOURSXP的系统信息:

正常运行时间:6天6小时22分53秒

内核版本:Microsoft windows XP,多处理器免费

产品类型:专业

产品版本:5.1

服务包:3

内核内部版本号:2600

注册组织:

注册车主:设置

安装日期:6/15/2007,3:35:29 PM

IE版本:7.0000

系统根目录:C: windows

处理器:2

处理器速度:2.9 GHz

处理器类型:Intel(R)Pentium(R)D cpu

物理内存:3070 MB

视频驱动程序:RADEON 9250 - 辅助

总结

以上是内存溢出为你收集整理的DateTime.UtcNow.Ticks有时跳跃了一个显着的数额全部内容,希望文章能够帮你解决DateTime.UtcNow.Ticks有时跳跃了一个显着的数额所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1286097.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-09
下一篇 2022-06-09

发表评论

登录后才能评论

评论列表(0条)

保存