- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
请注意,我正在询问一些使用诸如 System.Threading.Timer 之类的东西每 15 毫秒调用一次回调函数的频率。我不是在问如何使用 System.Diagnostics.Stopwatch 甚至 QueryPerformanceCounter 之类的东西来准确计时一段代码。
此外,我已阅读相关问题:
Accurate Windows timer? System.Timers.Timer() is limited to 15 msec
这两者都没有为我的问题提供有用的答案。
另外,推荐MSDN文章,Implement a Continuously Updating, High-Resolution Time Provider for Windows ,是关于计时而不是提供连续的滴答流。
话虽如此。 。 .
存在大量有关 .NET 计时器对象的不良信息。例如,System.Timers.Timer
被宣传为“针对服务器应用程序优化的高性能计时器”。而 System.Threading.Timer 在某种程度上被认为是二等公民。传统观点认为,System.Threading.Timer
是 Windows Timer Queue Timers 的包装器。而 System.Timers.Timer
则完全是另一回事。
现实情况大不相同。 System.Timers.Timer
只是一个围绕 System.Threading.Timer
的薄组件包装器(只需使用 Reflector 或 ILDASM 来查看 System.Timers.Timer
内部) code> 并且您将看到对 System.Threading.Timer 的引用),并且有一些代码将提供自动线程同步,因此您不必这样做。
System.Threading.Timer
,事实证明不是计时器队列计时器的包装器。至少在 2.0 运行时中不是这样,它是从 .NET 2.0 到 .NET 3.5 使用的。使用共享源 CLI 几分钟后发现,运行时实现了自己的计时器队列,该队列与计时器队列计时器类似,但从未真正调用 Win32 函数。
.NET 4.0 运行时似乎也实现了自己的计时器队列。我的测试程序(见下文)在 .NET 4.0 下提供了与在 .NET 3.5 下类似的结果。我已经为计时器队列计时器创建了自己的托管包装器,并证明我可以获得 1 毫秒的分辨率(具有相当好的准确性),因此我认为我不太可能错误地读取 CLI 源代码。
我有两个问题:
首先,是什么原因导致运行时执行定时器队列的速度如此之慢?我无法获得超过 15 毫秒的分辨率,并且精度似乎在 -1 到 +30 毫秒的范围内。也就是说,如果我要求 24 毫秒,我将得到间隔 23 到 54 毫秒的刻度。我想我可以花更多时间研究 CLI 源来找到答案,但我想这里有人可能知道。
第二,我意识到这个问题很难回答,为什么不使用定时器队列定时器呢?我意识到 .NET 1.x 必须在 Win9x 上运行,而 Win9x 没有这些 API,但它们自 Windows 2000 以来就已存在,如果我没记错的话,这是 .NET 2.0 的最低要求。是因为 CLI 必须在非 Windows 机器上运行吗?
我的计时器测试程序:
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Threading;
namespace TimerTest
{
class Program
{
const int TickFrequency = 5;
const int TestDuration = 15000; // 15 seconds
static void Main(string[] args)
{
// Create a list to hold the tick times
// The list is pre-allocated to prevent list resizing
// from slowing down the test.
List<double> tickTimes = new List<double>(2 * TestDuration / TickFrequency);
// Start a stopwatch so we can keep track of how long this takes.
Stopwatch Elapsed = Stopwatch.StartNew();
// Create a timer that saves the elapsed time at each tick
Timer ticker = new Timer((s) =>
{
tickTimes.Add(Elapsed.ElapsedMilliseconds);
}, null, 0, TickFrequency);
// Wait for the test to complete
Thread.Sleep(TestDuration);
// Destroy the timer and stop the stopwatch
ticker.Dispose();
Elapsed.Stop();
// Now let's analyze the results
Console.WriteLine("{0:N0} ticks in {1:N0} milliseconds", tickTimes.Count, Elapsed.ElapsedMilliseconds);
Console.WriteLine("Average tick frequency = {0:N2} ms", (double)Elapsed.ElapsedMilliseconds / tickTimes.Count);
// Compute min and max deviation from requested frequency
double minDiff = double.MaxValue;
double maxDiff = double.MinValue;
for (int i = 1; i < tickTimes.Count; ++i)
{
double diff = (tickTimes[i] - tickTimes[i - 1]) - TickFrequency;
minDiff = Math.Min(diff, minDiff);
maxDiff = Math.Max(diff, maxDiff);
}
Console.WriteLine("min diff = {0:N4} ms", minDiff);
Console.WriteLine("max diff = {0:N4} ms", maxDiff);
Console.WriteLine("Test complete. Press Enter.");
Console.ReadLine();
}
}
}
最佳答案
也许此处链接的文档对此进行了一些解释。有点干,所以我只是快速浏览了一下:)
引用简介:
The system timer resolution determines how frequently Windows performs two main actions:
- Update the timer tick count if a full tick has elapsed.
- Check whether a scheduled timer object has expired.
A timer tick is a notion of elapsed time that Windows uses to track the time of day and thread quantum times. By default, the clock interrupt and timer tick are the same, but Windows or an application can change the clock interrupt period.
The default timer resolution on Windows 7 is 15.6 milliseconds (ms). Some applications reduce this to 1 ms, which reduces the battery run time on mobile systems by as much as 25 percent.
原文来自:Timers, Timer Resolution, and Development of Efficient Code (docx).
关于.net - 为什么 .NET 计时器的分辨率限制为 15 毫秒?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3744032/
我有一个 ServiceBusQueue(SBQ),它获取大量消息负载。我有一个具有 accessRights(manage) 的 ServiceBusTrigger(SBT),它不断轮询来自 SBQ
在下面给出的结果集中,有 2 个唯一用户 (id),并且查询中可能会出现更多此类用户: 这是多连接查询: select id, name, col1Code, col2Code, col2Va
我正在用 Python 2.7.3 编写一个带有 GRequests 的小脚本和 lxml 可以让我从各种网站收集一些收藏卡价格并进行比较。问题是其中一个网站限制了请求的数量,如果我超过它,就会发回
我想知道何时实际使用删除级联或删除限制以及更新级联或更新限制。我对使用它们或在我的数据库中应用感到很困惑。 最佳答案 在外键约束上使用级联运算符是一个热门话题。 理论上,如果您知道删除父对象也将自动删
下面是我的输出,我只想显示那些重复的名字。每个名字都是飞行员,数字是飞行员驾驶的飞机类型。我想显示驾驶不止一架飞机的飞行员的姓名。我正在使用 sql*plus PIL_PILOTNAME
我正在评估不同的移动框架,我认为 nativescript 是一个不错的选择。但我不知道开发过程是否存在限制。例如,我对样式有限制(这并不重要),但我想知道将来我是否可以有限制并且不能使用某些 nat
我正在尝试使用 grails 数据绑定(bind)将一些表单参数映射到我的模型中,但我认为在映射嵌入式集合方面可能存在一些限制。 例如,如果我提交一些这样的参数,那么映射工作正常: //this wo
是否可以将 django 自过滤器起的时间限制为 7 天。如果日期超过 7 天,则不应用过滤器 最佳答案 timesince 的源代码位于 django/django/utils/timesince.
我想在我的网站上嵌入一个 PayPal 捐赠按钮。但问题是我住在伊朗——这个国家受到制裁,人们不使用国际银行账户或主要信用卡。 有什么想法吗?请帮忙! 问候 沮丧 最佳答案 您可以在伊朗境内使用为伊朗
这是我的查询 select PhoneNumber as _data,PhoneType as _type from contact_phonenumbers where ContactID = 3
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个答案) 关闭
我的一个项目的 AndroidManifest.xml 变得越来越大(> 1000 行),因为我必须对某些文件类型使用react并且涵盖所有情况变得越来越复杂。我想知道 list 大小是否有任何限制。
在使用 Sybase、Infomix、DB2 等其他数据库产品多年后使用 MySQL 5.1 Enterprise 时;我遇到了 MySQL 不会做的事情。例如,它只能为 SELECT 查询生成 EX
这个问题在这里已经有了答案: What is the maximum number of parameters passed to $in query in MongoDB? (4 个回答) 关闭5年
通常我们是在{$apache}/conf/httpd.conf中设置Apache的参数,然而我们并没有发现可以设置日志文件大小的配置指令,通过参考http://httpd.apache.org/do
我正在搜索最大的 Android SharedPreferences 键值对,但找不到任何好的答案。其次,我想问一下,如果我有一个键,它的字符串值限制是多少。多少字符可以放入其中。如果我需要频繁更改值
我目前正在试验 SoundCloud API,并注意到我对/tracks 资源的 GET 请求一次从不返回超过 200 个结果。关于这个的几个问题: 这个限制是故意的吗? 有没有办法增加这个限制? 如
我正在与一家名为 Dwolla 的金融技术公司合作,该公司提供了一个 API,用于将银行信息附加到用户并收取/发送 ACH 付款。 他们需要我将我的 TLS 最低版本升级到 1.2(禁用 TLS 1.
我在 PHP 中有一个多维数组,如下所示: $array = Array ( [0] => Array ( [bill] => 1 ) [1] => Array ( [
我在获取下一个查询的第一行时遇到了问题: Select mar.Title MarketTitle, ololo.NUMBER, ololo.Title from Markets mar JOIN(
我是一名优秀的程序员,十分优秀!