在一个打印出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有时跳跃了一个显着的数额所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)