【问题标题】:windows API: how expensive is it to call an API function?windows API:调用一个 API 函数有多贵?
【发布时间】:2010-01-04 20:30:03
【问题描述】:

调用 API 函数是否被视为昂贵的操作? (将其与作为我的应用程序一部分的函数调用进行比较时)
我知道某些 API 函数会导致内核模式的飞跃,但对所有这些函数都是如此吗?

更具体:调用GetThreadId 函数的成本是多少?

【问题讨论】:

  • 您的意思是系统调用,而不是 API 调用。 API 调用可能属于用户空间库,如果做得好,函数序言和结语通常是 4 - 1 字节指令 + 调用和 ret 指令......通常:D

标签: winapi


【解决方案1】:

任意线程的GetThreadId 需要内核切换,因此它比从用户模式检索缓存数据的GetCurrentThreadId 更昂贵。

API 的成本很大程度上取决于 API 本身的性质。从用户模式检索缓存值的 API 非常便宜,而转换到内核模式的 API 则要昂贵得多,大约为微秒。读取或写入磁盘的 API 可能会花费数十毫秒。在网络上运行的 API 可能需要几秒钟或几分钟的时间。

【讨论】:

    【解决方案2】:

    价格适中。有一个用户/内核模式转换,但在内核中,它只是一个简单的内存读取。取消引用句柄,从结构中获取 ID。

    更具体:您认为有哪些可行的替代方案?

    编辑:除非它是您所追求的当前线程 ID。 GetCurrentThreadId() 完全是用户模式,因此非常非常便宜。

    【讨论】:

      【解决方案3】:

      并非所有人都这样。对于大多数 API 调用,它只是对 DLL 中某些内容的调用,不需要模式转换。在这种情况下,每次调用将是几到几十纳秒。

      【讨论】:

      • (+1) 澄清:P
      猜你喜欢
      • 2011-06-01
      • 1970-01-01
      • 2011-01-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-08
      • 2020-07-15
      • 2018-08-20
      相关资源
      最近更新 更多