flaviovs/timeit

用于测量PHP代码执行速度的库和工具

v0.0.2 2018-11-30 06:59 UTC

This package is not auto-updated.

Last update: 2024-09-14 19:36:38 UTC


README

简介

本包包含一个库和工具,用于测量PHP代码的执行速度。您可以使用它来在分析和提高应用程序性能时测量替代代码。

要求

本包需要PHP 5.4或更高版本。

如何使用

您应该在PHP脚本中引入 src/Timer.php 来使用面向对象的接口。也提供了一个过程式接口 -- 要使用它,需要引入 src/functions.php

基本用法

要获取代码运行的计时,使用以下代码

$timer = new \TimeIt\Timer('pow(2, 5)');
$res = $timer->timeit();

返回的 $res 变量包含一个包含以下信息的三个元素数组

  • $res[0]:用于计算计时的轮次(迭代次数)。默认情况下,对象会计算出所需的迭代次数以给出尽可能准确的结果。

  • $res[1]:每次运行您的代码所花费的时间,以秒为单位。换句话说,这是运行您的代码一次的大致时间。

  • $res[2]:一个人类可读的、时间缩放的时间字符串表示形式,表示运行您的代码所需的时间(即 $res[1] 中的值)。例如,对于运行函数需要2秒的代码,将返回 2.00s。返回的字符串可能表示秒(s)、毫秒(ms)或微秒(us)。

如上所述,对象将根据您的代码速度计算轮次以返回适当的值(从10次迭代开始)。但是,您可以强制它使用任何数量的轮次。为此,将所需的轮次传递给 timeit() 方法

 $res = $timer->timeit(500);

您可以多次运行对象以获取多个结果。为此,调用 repeat() 方法

 $multi_res = $timer->repeat(500, 5);

这将调用 timeit(500) 五次。在上面的示例中,返回值将是一个包含每次运行结果的五元素多维数组,按执行速度升序排序(即,最快的先)。重复次数是可选的。默认为3。

参考

  • $timer->__construct($code, $setup = NULL) - 构造一个用于测量 $code 执行速度的 TimeIt\Timer 对象。代码可以是包含PHP代码的字符串,或任何其他可调用项(例如,匿名函数、使用数组指定的类/对象方法等)。

    $setup 可以包含应在每次对 $code 的速度评估之前只运行一次的设置代码。它可以用来设置代码运行所需的 环境。如果为 NULL,则不会运行任何设置代码。

  • $timer->timeit($rounds = NULL) - 测量代码执行速度,并返回包含结果的数组。有关返回数组结构的详细信息,请参阅上面的 基本用法。您可以在 $rounds 参数中指定轮次数量,或让对象确定适当的数量。

  • $timer->repeat($rounds = NULL, $repeat = 3) - 运行 timeit() 方法 $repeat 次以获取单独的执行速度样本。返回值是一个数组,其中包含 timeit() 返回的数组结构,按执行速度排序(最快的先)。

过程式接口

该库还提供了一个方便的过程式接口

  • timeit($code, $setup = NULL, $rounds = NULL) - 测量 $code 中代码的速度。有关其他参数的信息,请参阅上面提到的 参考 部分。

  • timeit_repeat($code, $setup = NULL, $rounds = NULL, $repeat = 3) - 对 $code 中的代码进行 $repeat 次速度测量。有关其他参数的信息,请参阅上面提到的 参考 部分。

  • timeit_str($code, $setup = NULL, $rounds = NULL, $repeat = 3) - 使用提供的参数运行 timeit_repeat(),并返回一个包含找到的 最佳 测量信息的可读字符串。

命令行脚本

bin/timeit 脚本提供了一个方便的界面,用于从命令行检查 PHP 代码的执行速度。运行脚本时传递 PHP 代码作为参数。您可以在同一运行中传递多个参数,这使得脚本成为帮助选择哪个代码表现最好的非常方便的方法。

示例

$ bin/timeit 'pow(5, 5)'
pow(5, 5): 100000 loops, best of 3: 9.21us per loop

$ bin/timeit 'pow(2, 5)' '2 * 2 * 2 * 2 * 2'
pow(2, 5): 100000 loops, best of 3: 8.51us per loop
2 * 2 * 2 * 2 * 2: 1000000 loops, best of 3: 4.10us per loop

警告:在将 PHP 代码传递给命令行的 timeit 脚本时,您必须格外小心,因为单引号和双引号(在 PHP 代码中非常常用)可能会与您的 shell 预期的引号冲突。脚本期望每个单独的 shell 参数包含一段代码,但如果您没有正确转义您的引号,shell 可能会以意想不到的方式分割参数。您可能还需要转义美元符号,以防止它们被 shell 解释。

示例

错误

$ bin/timeit '$a = 'foobar'; substr($a, 0, 1)'
PHP Notice:  Use of undefined constant foobar - assumed 'foobar' in /home/flaviovs/github/timeit/src/Timer.php(39) : eval()'d code on line 1
PHP Stack trace:
(...several errors...)

正确

$ bin/timeit '$a = "foobar"; substr($a, 0, 1)'

或者

$ bin/timeit "\$a = 'foobar'; substr(\$a, 0, 1)" # We must escape the "$"

注意事项

此库测量运行代码所需的 系统时间。这意味着不同的计算机、不同的 CPU 或甚至不同的 执行环境 可能会影响测量结果。

例如,您不应该期望在不同的计算机上进行测量时会得到相同的数字,也不应该在同一计算机的不同时间进行测量。例如,在重 I/O 的服务器上和在安静的时间测量相同的代码可能不会给出相同的结果。

法律

版权 2015-2016 Flávio Veloso

此软件包根据 Apache License 2.0 许可。有关详细信息,请参阅文件 LICENSE。

如果您在此软件中找到错误,请在 GitHub 上打开一个问题 https://github.com/flaviovs/timeit,或者将其发送给我,邮箱为 flaviovs at magnux dot com。