【发布时间】:2013-12-25 21:16:59
【问题描述】:
注意:我更喜欢 C++(下面的代码是 C++),但如果有人设法用 any 通用语言执行以下操作,我可以。
这是一个想法:
a) 计时器启动。
b) 函数的执行时间总是不到 0.1 秒。
c) 程序休眠直到与开始的时间差正好 0.1 秒。
d) 永远重复。
如果睡眠时间略高于 0.1 秒,比如 0.105 秒,我每秒损失 0.005 秒。这种不准确性会在我的应用程序中产生成本,因为我在一天内丢失:0.005*3600*24 = 432 秒。
我的应用程序是实时的;我失去的时间并不重要。
执行:
a) 步骤很简单,只需设置一个变量x = std::chrono::high_resolution_clock::now();
b) 运行函数
c)
while((std::chrono::high_resolution_clock::now()-x).count() < 1000000)
std::this_thread::sleep_for(std::chrono::nanoseconds(1));
d) 只是循环
总结:
a) 我明白,无论如何,我每秒至少会损失 1 纳秒。
b) 阅读这些文章后:first、second 我意识到,有可能让我的应用程序每秒损失 30 微秒 = 0.00003 秒。这意味着,一天:0.00003*3600*24 = 2.592 秒/天。
c) 目前使用上面描述的最好的功能是每天损失 7 分钟。
我真正想做的事:
我被授予访问服务器的权限,但有一个限制:每 0.1 秒只允许一个请求。如果它需要更少,他们会禁止我。如果我的请求需要更长的时间,我下载的数据会更少。我的应用程序每 0.1 秒下载一个文件。如果由于延迟,我每天损失 432 秒,这意味着我可以再下载 4320 个文件。
问:如何在 CentOS 或任何其他操作系统上实现 CPU 屏蔽?
【问题讨论】:
-
我不知道 C++ 库中对此有什么支持,但是使用 Posix 计时器函数,您指定绝对到期时间,而不是增量(您也可以指定重复间隔) .这将立即解决您的问题。
-
按他们的时钟,这是 0.1 秒,而不是你的。你怎么这么确定他们在测量时间方面比你好得多?
-
每天损失 3 秒不到 0.0035%。你确定你需要最后的 0.0035% 吗?
-
Oli 抓住了我所暗示的观点。假设由于网络抖动,您一天下载了 863999 个文件,下一天下载了 864001 个文件。突然被封号了?典型 IP 连接上的成帧时间有太多的抖动。为什么这里有疯狂的公差?此外,谁定义了日期的界限,以及当他们的时钟漂移时会发生什么,即使你的时钟是完美的?
-
@Blazer:我完全相信不到 0.1 秒。但你似乎误解了乔和我的观点。你是说跑的快过0.1秒就被封号了;我们是说,无论您的循环有多准确,您都会始终在连接的另一端看到 (A) 方差和 (B) 漂移。什么样的服务在执行如此精确的约束? (换句话说,我不相信这是真正的限制;))