C++ windows系统调用
在Linux上,C++ windows系统调用,c++,windows,operating-system,system-calls,C++,Windows,Operating System,System Calls,在Linux上,getpid()似乎是最简单的系统调用,可以用来最好地测量系统调用所花费的时间。有没有人能告诉我一个简单的windows系统调用,我可以用来测量切换到内核模式和返回内核模式所花费的时间 我在谷歌上搜索了一下,在MSDN网站上找到了一个Windows系统调用列表,但它们都提到打开文件,这似乎很奇怪: 我使用的是64位Windows 7。我的建议(这只是基于直觉)是尝试以下操作 CloseHandle(NULL) 或 理由是这应该是禁止的。然而,我没有任何证据支持这一点 更新
getpid()
似乎是最简单的系统调用,可以用来最好地测量系统调用所花费的时间。有没有人能告诉我一个简单的windows系统调用,我可以用来测量切换到内核模式和返回内核模式所花费的时间
我在谷歌上搜索了一下,在MSDN网站上找到了一个Windows系统调用列表,但它们都提到打开文件,这似乎很奇怪:
我使用的是64位Windows 7。我的建议(这只是基于直觉)是尝试以下操作
CloseHandle(NULL)
或
理由是这应该是禁止的。然而,我没有任何证据支持这一点
更新 在Win8.1 x64上进行一点基准测试表明(未记录的)
NtDisplayString(NULL)
函数更快,其次是半记录的NtAllocateLocallyUniqueId(&some\luid)
。您必须使用GetProcAddress
从NTDLL动态加载它们;签名如下:
NTSTATUS NTAPI PNtAllocateLocallyUniqueId(PLUID LUID);
NTSTATUS NTAPI PNtDisplayString(PUNICODE_STRING DisplayString);
很抱歉,
getpid()
如何提供任何与计时相关的数据?我使用时间(0),这似乎有点简单。在我7岁的Dell上,Linux 12.04达到每秒13.2兆次(0),但每秒只有12.3兆次getpid()。很抱歉,这不是Win 7的答案。如果您能设法从用户模式调用它,我认为PsGetProcessExitTime
是我能找到的最简单的函数。@RedAlert“调用最简单的系统调用,以最好地测量系统调用所用的时间”@Mehrdad已包含但无法访问该函数。GetStartupInfo将是另一个合理的猜测,或者在没有模拟的情况下(甚至可能是在模拟的情况下)恢复为self。对于其中任何一个,您都需要某种方法来检查内核模式转换是否确实发生了;Windows API尽可能地优化了这些功能。@HarryJohnston:我不明白为什么GetStartupInfo
需要内核模式转换。你说得很对,这些信息可能是在进程创建过程中复制到用户空间的。但你永远不知道。:-)
NTSTATUS NTAPI PNtAllocateLocallyUniqueId(PLUID LUID);
NTSTATUS NTAPI PNtDisplayString(PUNICODE_STRING DisplayString);