【问题标题】:windows system callwindows系统调用
【发布时间】:2014-09-22 17:43:30
【问题描述】:

在 Linux 上,getpid() 似乎是最简单的系统调用,可以用来最好地衡量系统调用所花费的时间。有人可以向我推荐一个简单的 Windows 系统调用,我可以用来测量切换到内核模式并返回所花费的时间吗?

我在谷歌上搜索并在 MSDN 网站上找到了一个 Windows 系统调用列表,但它们都提到了打开文件——这看起来很奇怪:

http://msdn.microsoft.com/en-us/library/t0wd4t32.aspx

我使用的是 Windows 7 64 位。

【问题讨论】:

  • 抱歉,getpid() 怎么给你计时相关的数据?
  • 我用的是time(0),看起来简单一些。在我 7 岁的戴尔上,Linux 12.04 每秒达到 13.2 兆次时间(0),但每秒只有 12.3 兆次 getpid()。抱歉,不是 Win 7 答案。
  • 如果你能设法从用户​​模式调用它,我认为PsGetProcessExitTime 是我能找到的最简单的函数。
  • @RedAlert “调用最简单的系统调用以最好地测量系统调用所花费的时间”
  • @Mehrdad 已包含 但无法访问该功能。

标签: c++ windows operating-system system-calls


【解决方案1】:

我的建议(这只是基于直觉)是尝试类似

CloseHandle(NULL)

WaitForMultipleObjectsEx(0, NULL, 0, 0, FALSE)

因为它应该是无操作的。但是,我没有任何证据支持这一点。


更新

在 Win8.1 x64 上进行的一些基准测试显示(未记录的)NtDisplayString(NULL) 函数更快,其次是半记录的 NtAllocateLocallyUniqueId(&some_luid)。您必须使用GetProcAddress 从 NTDLL 动态加载它们;签名是:

NTSTATUS NTAPI PNtAllocateLocallyUniqueId(PLUID LUID);
NTSTATUS NTAPI PNtDisplayString(PUNICODE_STRING DisplayString);

【讨论】:

  • GetStartupInfo 将是另一个合理的猜测,或者 RevertToSelf 在没有模拟时(或者甚至在模拟时)。对于其中任何一种,您都需要某种方法来检查内核模式转换是否实际发生; Windows API 会尽可能优化这些内容。
  • @HarryJohnston:我不明白为什么GetStartupInfo 需要内核模式转换。
  • 你说的很对,这些信息可能在进程创建期间被复制到用户空间。但你永远不知道。 :-)
猜你喜欢
  • 2011-02-15
  • 2014-01-31
  • 1970-01-01
  • 2017-08-27
  • 2015-01-11
  • 2011-08-02
  • 1970-01-01
  • 1970-01-01
  • 2021-09-22
相关资源
最近更新 更多