JIT 挂钩

pypyjit 模块中有一些挂钩,可以帮助你了解 pypy 的 JIT 在运行你的程序时在做什么。

dont_trace_here(next_instr, is_being_profiled, pycode)
get_jitcell_at_key(next_instr, is_being_profiled, pycode)
get_stats_asmmemmgr()

返回 JIT 后端当前使用的原始内存,以一对 (已分配的总内存,正在使用的内存) 表示。

residual_call(callable, *args, **keywords)

用于测试。调用 callable(…),但不让 JIT 跟踪调用。

set_compile_hook(callable, operations=True)

设置一个编译挂钩,每次编译循环时都会调用它。

该可调用对象将使用 pypyjit.JitLoopInfo 对象调用。有关详细信息,请参阅其文档。

请注意,jit 挂钩不是可重入的。这意味着如果 jit 挂钩内部的代码本身被 jitted,它将被编译,但 jit 挂钩不会为此调用。

如果 operations=False,则没有操作列表可用。如果挂钩应该非常轻量级,这很有用。

set_abort_hook(hook)

设置一个挂钩(可调用对象),每次由于某种原因中止跟踪时都会调用它。

该挂钩将使用以下签名调用:hook(jitdriver_name, greenkey, reason, oplist)

Reason 是一个字符串,其他参数的含义与 JitLoopInfo 对象上的属性相同。

set_trace_too_long_hook(hook)

设置一个挂钩(可调用对象),每次我们由于跟踪过长而中止跟踪时都会调用它。

该挂钩将使用以下签名调用:hook(jitdriver_name, greenkey)

enable_debug()

开始为 get_stats_snapshot 记录调试计数器。

目前已禁用。

disable_debug()

停止为 get_stats_snapshot 记录调试计数器。

目前已禁用。

get_stats_snapshot()

获取特定时间点的 JIT 状态。请注意,这是急切的 - 属性访问不是懒惰的,如果您需要新的统计信息,则需要再次调用此函数。您可能希望调用 enable_debug 以获取更多信息。它返回一个 JitInfoSnapshot 实例。

class JitInfoSnapshot

描述当前快照的类。可用的属性

  • counters - 内部 JIT 整数计数器
  • counter_times - 内部 JIT 浮点计数器,特别是用于跟踪和 JIT 后端的耗时
  • loop_run_times - 循环运行次数的计数器,仅在调用 enable_debug 时有效。
class JitLoopInfo

包含有关已编译循环的信息的类。可用的属性

  • operations - 操作列表,如果请求
  • jitdriver_name - 与此循环关联的 jitdriver 的名称
  • greenkey - 循环被编译的键(例如代码位置、是否正在分析、python jitdriver 的 pycode 元组)
  • loop_no - 循环基数
  • bridge_no - 失败描述符的 ID
  • type - “入口桥”、“循环”或“桥”
  • asmaddr - 汇编程序所在的原始内存中的地址
  • asmlen - 与汇编程序关联的原始内存的长度

重置 JIT

releaseall()

将所有当前机器代码对象标记为准备释放。它们将在下一次 GC 时被释放(除非它们当前正在某个线程的堆栈中使用)。执行 pypyjit.releaseall(); gc.collect() 是一个重锤,它将 JIT 大致强制回到新启动的 PyPy 的状态。

set_param(*args, **keywords)

配置可调 JIT 参数,参数名称列在 JIT 帮助 中。

  • set_param(name=value, ...) 作为关键字参数
  • set_param("name=value,name=value") 作为用户提供的字符串
  • set_param("off") 禁用 JIT
  • set_param("default") 恢复所有默认值