遭遇php的in_array低性能问题

yizhihongxing

当使用in_array()函数来查找一个值是否在一个数组中存在时,如果该数组中的元素数量较多,该函数的性能会受到影响。本攻略将详细讲解如何遭遇php的in_array()低性能问题以及优化的方法,包含以下几个方面:

  1. 性能分析
  2. 优化方案

性能分析

查看API文档

在使用in_array()函数之前,我们需要先了解这个函数的使用方式和限制条件。可以查看官方文档或者使用get_defined_functions()来获取到PHP中的所有函数列表。

使用phpbench工具

phpbench是一个用于基准测试和性能分析的工具,它可以帮助我们更加准确地分析出代码的性能问题。

下面是一个使用phpbench来测试in_array()函数性能的示例:

<?php
require_once 'vendor/autoload.php';

$array = range(1,100000);

echo 'in_array() test case:' . "\n";
$phpbench = new \PhpBench\Benchmark\Metadata\Annotations\PhpBench();
$phpbench->setIterations(10);
$phpbench->setWarmup(3);
$phpbench->setMax(5);
$phpbench->setRevs(50);
$phpbench->setOutputTimeUnit('milliseconds', 0);
$phpbench->setOutputMode('aggregate');
$phpbench->setOutput('table');
class InArrayTest
{
    /**
     * @Subject
     */
    public function benchInArray()
    {
        in_array(50000, $array);
    }
}

运行phpbench,可以得到类似下面的测试结果:

+------------------+----------------+----------------+----------------+----------------+
| benchmark        | subject        | revs           | mem            | time           |
+------------------+----------------+----------------+----------------+----------------+
| InArrayBench\InA | benchInArray   | 50             | 65,864.00b     | 0.02±0.00ms    |
| rrayTest         |                |                |                |                |
+------------------+----------------+----------------+----------------+----------------+

2 subjects encountered, 2 subjects successful, 0 assertions passed, 0 skipped, 0 errors, 0 failures

从测试结果来看,in_array函数相对于第一种快速查找方式,其性能较低,所以需要考虑优化方案。

优化方案

使用isset或者array_key_exists

相对于in_array()函数,issetarray_key_exists()函数在判断一个值是否在数组中存在时有较高的性能,并且比较不容易出现低性能问题。

以下是使用array_key_exists()的示例:

<?php
$array = range(1,100000);
echo 'array_key_exists() test case:' . "\n";
$phpbench = new \PhpBench\Benchmark\Metadata\Annotations\PhpBench();
$phpbench->setIterations(10);
$phpbench->setWarmup(3);
$phpbench->setMax(5);
$phpbench->setRevs(50);
$phpbench->setOutputTimeUnit('milliseconds', 0);
$phpbench->setOutputMode('aggregate');
$phpbench->setOutput('table');
class ArrayKeyExistsTest
{
    /**
     * @Subject
     */
    public function benchArrayKeyExists()
    {
        array_key_exists(50000, $array);
    }
}

运行phpbench,可以得到类似下面的测试结果:

+------------------+-----------------+----------------+----------------+----------------+
| benchmark        | subject         | revs           | mem            | time           |
+------------------+-----------------+----------------+----------------+----------------+
| ArrayKeyExistsBe | benchArrayKeyEx | 50             | 65,864.00b     | 0.00±0.00ms    |
| nch\ArrayKeyExis | ists           |                |                |                |
| Test             |                 |                |                |                |
+------------------+-----------------+----------------+----------------+----------------+

2 subjects encountered, 2 subjects successful, 0 assertions passed, 0 skipped, 0 errors, 0 failures

使用哈希表

相对于数组来说,哈希表是一种更为快速的数据结构,使用哈希表来存储需要查询的元素,可以在查询时获得更好的性能,以下是使用哈希表的示例:

<?php 
$array = array_flip(range(1, 100000));

echo 'hash table test case:' . "\n";
$phpbench = new \PhpBench\Benchmark\Metadata\Annotations\PhpBench();
$phpbench->setIterations(10);
$phpbench->setWarmup(3);
$phpbench->setMax(5);
$phpbench->setRevs(50);
$phpbench->setOutputTimeUnit('milliseconds', 0);
$phpbench->setOutputMode('aggregate');
$phpbench->setOutput('table');
class HashTableTest
{
    /**
     * @Subject
     */
    public function benchHashTable()
    {
        isset($array[50000]);
    }
}

运行phpbench,可以得到类似下面的测试结果:

+------------------+----------------+----------------+----------------+----------------+
| benchmark        | subject        | revs           | mem            | time           |
+------------------+----------------+----------------+----------------+----------------+
| HashTableBench\H | benchHashTable | 50             | 65,864.00b     | 0.00±0.00ms    |
| ashTableTest     |                |                |                |                |
+------------------+----------------+----------------+----------------+----------------+

2 subjects encountered, 2 subjects successful, 0 assertions passed, 0 skipped, 0 errors, 0 failures

使用SplFixedArray

如果数组的元素数量确定且较大,使用SplFixedArray可以获得更好的性能提升。

以下是使用SplFixedArray的示例:

<?php 
$array = new SplFixedArray(100000);
for ($i = 0; $i < 100000; $i++) {
    $array[$i] = $i+1;
}
echo 'spl fixed array test case:' . "\n";

$phpbench = new \PhpBench\Benchmark\Metadata\Annotations\PhpBench();
$phpbench->setIterations(10);
$phpbench->setWarmup(3);
$phpbench->setMax(5);
$phpbench->setRevs(50);
$phpbench->setOutputTimeUnit('milliseconds', 0);
$phpbench->setOutputMode('aggregate');
$phpbench->setOutput('table');
class SplFixedArrayTest
{
    /**
     * @Subject
     */
    public function benchSplFixedArray()
    {
        isset($array[50000]);
    }
}

运行phpbench,可以得到类似下面的测试结果:

+------------------+------------------+----------------+----------------+----------------+
| benchmark        | subject          | revs           | mem            | time           |
+------------------+------------------+----------------+----------------+----------------+
| SplFixedArrayBen  | benchSplFixedArr | 50             | 65,864.00b     | 0.00±0.00ms    |
| ch\SplFixedArray | ayTest           |                |                |                |
+------------------+------------------+----------------+----------------+----------------+

2 subjects encountered, 2 subjects successful, 0 assertions passed, 0 skipped, 0 errors, 0 failures

综上所述,我们可以通过上述方案来优化in_array()函数的性能问题。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:遭遇php的in_array低性能问题 - Python技术站

(0)
上一篇 2023年5月26日
下一篇 2023年5月26日

相关文章

  • PHP运行时强制显示出错信息的代码

    当PHP代码出现错误时,默认情况下,PHP会自动隐藏错误信息,以保护服务器的安全。但有时候,开发人员需要看到完整的错误信息,以便更快地定位和解决问题。下面是完整的攻略过程。 步骤一:开启错误级别显示 PHP有多个错误级别,可以通过设置php.ini文件中的error_reporting参数来设置。我们可以如下修改php.ini文件(以Linux系统为例): …

    PHP 2023年5月23日
    00
  • php PATH_SEPARATOR判断当前服务器系统类型实例

    在PHP中,PATH_SEPARATOR是系统路径分隔符,Linux和Unix系统上的路径分隔符为“:”,Windows系统上的路径分隔符为“;”。可以通过PATH_SEPARATOR来判断当前运行PHP的服务器系统类型。 具体实现方式是,使用PATH_SEPARATOR常量来拆分路径,如果返回的是一个字符串,就说明运行PHP的服务器系统类型是Windows…

    PHP 2023年5月30日
    00
  • php需登录的文件上传管理系统

    下面是关于“php需登录的文件上传管理系统”完整攻略的讲解。 什么是php需登录的文件上传管理系统? 首先,我们需要了解“php需登录的文件上传管理系统”是什么。这是一个基于php语言开发的系统,需要用户登录才能使用其中的文件上传和管理功能。用户可以上传文件,对已上传的文件进行管理(包括预览、下载、删除等操作)。 系统搭建流程 接下来,我将详细讲解如何搭建这…

    PHP 2023年5月24日
    00
  • php生成不重复随机数、数组的4种方法分享

    PHP生成不重复随机数、数组的4种方法分享 在PHP编程过程中,经常会使用随机数或数组,但是如果需要生成不重复的随机数或数组就需要一些特殊的处理,本篇文章就来详细讲解PHP生成不重复随机数、数组的4种方法分享。 方法一 array_unique+array_rand 这种方法先生成一个包含所有可能值的数组,再随机从中选取元素,使用array_unique()…

    PHP 2023年5月26日
    00
  • 如何把php5.3版本升级到php5.4或者php5.5

    以下是把PHP5.3升级到PHP5.4或PHP5.5的攻略: 1. 确认当前PHP版本 如果你不确定你的服务器上已经安装的PHP版本,可以使用以下命令: php -v 这个命令会输出PHP版本信息。如果你的版本是5.3.x,那么你就需要升级了。 2. 将依赖关系解决掉 在升级PHP之前,你需要先解决相关依赖关系。在Ubuntu上,你可以使用以下命令: sud…

    PHP 2023年5月23日
    00
  • php获取文件扩展名的3种方法实例

    下面是“php获取文件扩展名的3种方法实例”的完整使用攻略,包括问题原因、解决方法和两个示例说明。 问题原因 在PHP中,获取文件扩展名是一项常见任务。但是,由于文件名的格式和扩展名的位置可能会有所不同,因此需要使用不同的方法来获取文件扩展。 解决方法 以下是获取文件扩展名的3种方法: 使用pathinfo()函数 pathinfo()函数可以返回文件路径的…

    PHP 2023年5月12日
    00
  • Json_decode 解析json字符串为NULL的解决方法(必看)

    Json_decode 解析json字符串为NULL的解决方法(必看) 问题描述 在使用 json_decode() 函数将 JSON 字符串解析为 PHP 变量时,如果出现 JSON 字符串为 NULL 的情况,解析后也会返回 NULL,这时无法正确获取 JSON 中的数据。 解决方法 为了解决此问题,可以使用 json_last_error() 函数获取…

    PHP 2023年5月26日
    00
  • PHP反向代理类代码

    以下是详细讲解“PHP反向代理类代码”的完整攻略: 1. 什么是反向代理 在介绍反向代理类的代码之前,先来了解一下什么是反向代理。 反向代理是指代理服务器接收到客户端请求后,将请求转发到内部服务器获取资源,并将响应结果返回给客户端的一种代理方式。相比于正向代理,反向代理更常用于 Web 服务器的负载均衡、缓存、安全过滤等。 2. PHP实现反向代理 要实现一…

    PHP 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部