PHP自定义函数数组去重性能测试

2018-09-26 16:44:00
小熊
原创
11878
摘要:前几天我们测试了PHP的系统函数array_unique的去重性能,基于该函数的实现原理机制,性能有点不太乐观,今天,我们写了一个自定义去重函数并测试一下它的性能。

一、原理

php有一个键值互换的方法array_flip,我们可以使用这个方法去重,因为键值互换,原来重复的值会变为相同的键。 
然后再进行一次键值互换,把键和值换回来则可以完成去重。

二、array_flip函数解析

array_flip()

(PHP 4, PHP 5, PHP 7)

array_flip — 交换数组中的键和值。

说明

array array_flip ( array $array )

array_flip() 返回一个反转后的 array,例如 array 中的键名变成了值,而 array 中的值成了键名。

注意:

  1. array 中的值需要能够作为合法的键名(例如需要是 integer 或者 string)。如果类型不对,将出现一个警告,并且有问题的键/值对将不会出现在结果里。

  2. 如果同一个值出现多次,则最后一个键名将作为它的值,其它键会被丢弃。

参数:

array

要交换键/值对的数组。

返回值:

成功时返回交换后的数组,如果失败返回 NULL。

举例:

$input = array("a" => 1, "b" => 1, "c" => 2);
$flipped = array_flip($input);
print_r($flipped);

输出为:

Array
(
   [1] => b
   [2] => c
)

三、方法实现并测试性能

  1. 创建100000个随机元素的数组。

for($i=0; $i<100000; $i++)
{   
     $arr[] = mt_rand(1,99);
}

2.记录开始去重时间。

$starttime = getMicrotime();

3.使用键值互换去重。

$arr = array_flip($arr);
$arr = array_flip($arr);

4.记录去重结束时间。

$endtime = getMicrotime();

5.获取使用内存。

/**
 * 获取使用内存
 * @return float
 * @author itbear
 * @link   www.beatmoon.com
 */
function getUseMemory()
{
    $use_memory = round(memory_get_usage(true)/1024,2).'kb';   
    return $use_memory;
}

6.获取microtime

/**
 * 获取microtime
 * @return float
 * @author itbear
 * @link   www.beatmoon.com
 */
function getMicrotime()
{
    list($usec, $sec) = explode(' ', microtime());    
    return (float)$usec + (float)$sec;
}

7.输出结果。

echo 'unique count:'.count($arr).'<br>';
echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>';
echo 'use memory:'.getUseMemory();

8.完整代码。

for($i=0; $i<100000; $i++)
{   
     $arr[] = mt_rand(1,99);
}
$starttime = getMicrotime();
$arr = array_flip($arr);
$arr = array_flip($arr);
$endtime = getMicrotime();
echo 'unique count:'.count($arr).'<br>';
echo 'run time:'.(float)(($endtime-$starttime)*1000).'ms<br>';
echo 'use memory:'.getUseMemory();
/**
 * 获取使用内存
 * @return float
 * @author itbear
 * @link   www.beatmoon.com
 */
function getUseMemory()
{
    $use_memory = round(memory_get_usage(true)/1024,2).'kb';   
    return $use_memory;
}
/**
 * 获取microtime
 * @return float
 * @author itbear
 * @link   www.beatmoon.com
 */
function getMicrotime()
{
    list($usec, $sec) = explode(' ', microtime());    
    return (float)$usec + (float)$sec;
}

9.运行结果。

unique count:99

run time:2.3479461669922ms

use memory:2048kb

10.结果截图。

PHP自定义函数数组去重与系统去重函数array_unique()性能比较

11.测试100次,计算平均值

略(可使用程序循环100次计算得出。)

总结:

  1. 根据前面的系统函数array_unique()性能比较,差距还是比较大的。

  2. 文章见《 PHP一维数组去重函数array_unique()去重效率测试》。

文章分类
联系我们
联系人: 小熊
电话: 18037578880
Email: admin@cnsite.org
QQ: 929410000
微信: itseor
微博: itseoer
网址: www.beatmoon.com