遭遇php的in_array低性能问题

当使用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实现单链表的实例代码”的攻略: 简介 单链表是一种常用的数据结构,它是由节点组成的一系列元素的集合。每个节点包含了指向下一个节点的指针(或者称为链接)。单链表的好处是可以很方便地在任意位置插入或删除元素,但访问节点的时间复杂度是O(n)。 我们使用PHP代码来实现一个单链表类,名为LinkedList,其中包含下列方法: __constr…

    PHP 2023年5月23日
    00
  • 详解Window7 下开发php扩展

    以下是详解”Windows7下开发PHP扩展”的完整攻略,该过程包含两条示例说明。 步骤1:安装必须工具 在开始进行PHP扩展开发之前,需要确保你的电脑上安装了以下工具: Visual Studio 2017或以上版本 PHP(预编译DLL文件) PHP开发包(一般来说PHP版本与预编译DLL文件要匹配) 步骤2:下载和解压PHP源码 首先需要从PHP官网上…

    PHP 2023年5月23日
    00
  • PHP编实现程动态图像的创建

    下面我将为您详细讲解PHP实现动态图像的创建的攻略。 一、前置知识 在学习本文之前,需要具备以下知识:- PHP基础语法知识- HTTP协议基础知识- 图像文件格式知识(如 PNG、JPEG、GIF 等) 二、动态图像的创建 PHP中可以通过GD库来创建动态图像。GD库是一个用于图像处理的PHP扩展库,可以创建、处理和输出多种类别的图像。 1. 安装GD库 …

    PHP 2023年5月27日
    00
  • php数组函数序列之next() – 移动数组内部指针到下一个元素的位置,并返回该元素值

    PHP数组函数之next() 在PHP里有一系列用于操作数组的函数,其中之一是next()函数。本文将详细讲解next()函数的用法及注意点。 概述 next()函数指从当前指针所在位置向后移动一位,并返回该数组元素的值。如果next()的参数是一个空数组或指向数组末尾,则返回false。 语法如下: mixed next ( array &$arr…

    PHP 2023年5月26日
    00
  • PHP4实际应用经验篇(5)

    PHP4实际应用经验篇(5) 1. 数据库事务处理的应用 在实际应用中,我们经常需要对一批操作进行事务性处理,即对这批操作进行统一提交或撤销。在PHP中,我们可以使用MySQL数据库的事务处理功能完成这个需求,具体步骤如下: 开启事务处理 使用mysqli_begin_transaction()语句开启MySQL事务处理。 $mysqli->begin…

    PHP 2023年5月30日
    00
  • PHP中读取文件的几个方法总结(推荐)

    来给你详细讲解一下PHP中读取文件的几个方法总结。 1. file_get_contents()方法 基本用法 file_get_contents()方法是PHP内置的一个函数,用于读取文件内容,并返回一个字符串。 $file_path = ‘test.txt’; $content = file_get_contents($file_path); echo …

    PHP 2023年5月26日
    00
  • php获取’/’传参的值简单方法

    PHP获取URL参数是非常常见的操作,对于参数的获取,不仅限于通过?符号传参。有时候也需要通过 / 路径传参,例如 /article/123。 下面是通过 PHP 获取 / 传参的方法: 首先,通过 $_SERVER[‘REQUEST_URI’] 获取完整 URL,然后使用 explode() 或 preg_split() 函数按照 / 将 URL 拆分为数…

    PHP 2023年5月26日
    00
  • php数组函数序列之array_keys() – 获取数组键名

    首先,需要明确什么是PHP中的数组。数组是一种保存多个值的有序集合的数据结构,在PHP中可以通过以下方式定义一个数组: $array = array("foo" => "bar", "bar" => "foo"); 其中,键和值之间可以用”=>”或者”:”分隔,…

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