数码资讯
PHP遇到in_array低性能问题
PHP的性能得到了改善。但是,如果使用不当,或漫不经心,或可能会步上PHP内部实现的坑。我看到在过去的几天里,一个性能问题。 事情是这样的,一个同事,一个反馈接口,每一次我们需要回到5秒长,我们一起审查代码,惊讶地发现,即使在循环(约900倍)称为读取缓存,以及关键的缓存并没有改变,所以我们把这个代
选购提示
关注价格、性能、续航、售后和真实使用场景,理性比较后再下单。
PHP的性能得到了改善。但是,如果使用不当,或漫不经心,或可能会步上PHP内部实现的坑。我看到在过去的几天里,一个性能问题。
事情是这样的,一个同事,一个反馈接口,每一次我们需要回到5秒长,我们一起审查代码,惊讶地发现,即使在循环(约900倍)称为读取缓存,以及关键的缓存并没有改变,所以我们把这个代码移到外面循环,再次测量,返回的时间降到2秒,唉!比我们高1倍,但显然不是我们能接受的结果!
看来性能问题的代码量不是很大。在排除了IO问题之后,我们编写了一段测试代码,很快就解决了这个问题。
复制代码代码如下所示:
< PHP
$1800;
$ =数组();
对于($ = 0;$ j 2000;$ + +){
$ }{ $ };
}
($ i = 0;$ i < 3000;$ + +){
如果(in_array($ Y,X元)){
继续;
}
}
>
壳为时间 / usr / / / PHP本地bin / php test.php
真正的0m1.132s
用户0m1.118s
系统0m0.015s
是的,我们使用的是字符串类型的数字,这是它从缓存中出来的方式!所以这里是一个特殊的传递一个字符串(如果它是一个号码,你不会有这样的问题,您可以验证它自己)。我们可以看到,花了1的时间,只有3000个周期,在系统中当我们使用strace注定不会得到什么信息。
壳元信息TTT O XXX / usr / / / PHP本地bin / php test.php
壳少XXX
我们只看到两个系统调用之间的延迟非常大,但不知道该怎么办这与它无关。幸运的是,在Linux调试工具strace和ltrace例外(当然,DTrace,改成,不在本文的讨论范围)。
参考:strace用来跟踪进程的系统调用和信号产生的过程,并ltrace用于跟踪过程调用库函数的情况(通过IBM developerWorks)。
为了排除干扰因素,我们把X元直接阵列(0)在避免过多的malloc调用影响result.implement形式
壳ltrace美元C / usr / / / PHP本地bin / php test.php
例如,图2
我们看到__strtol_internal库函数的调用是很频繁的,达到94%,太夸张了,然后我检查什么是__strtol_internal库函数,原来是strtol别名,只是将字符串转换生长成型,可以猜到PHP引擎已经被发现,这是一个字符串类型的数字,所以希望他们为整数相比,这种转换过程消耗了太多的时间,我们进行了一次:
复制代码代码如下所示:
壳ltrace美元E__strtol_internal / usr / / / PHP本地bin / php test.php
您可以轻松地捕获许多调用,如以下图片。我们在这里找到了问题。in_array宽松的比较将两个字符串为长整型,然后比较它,但我们不知道性能将会丢失。
我们知道问题的症结所在,在很多的解决方案,最简单的是真正的第三参数in_array,这也是一个严格的比较,比较的类型,从而避免PHP幻想型的转换,跑得真快,代码如下:
复制代码代码如下所示:
< PHP
$1800;
$ =数组();
对于($ = 0;$ j 2000;$ + +){
$ }{ $ };
}
($ i = 0;$ i < 3000;$ + +){
如果(in_array($ Y,X元,真)){
继续;
}
}
>
复制代码代码如下所示:
壳为时间 / usr / / / PHP本地bin / php test.php
真正的0m0.267s
用户0m0.247s
系统0m0.020s
好多倍的速度!!!!你可以看到系统的时间几乎是没有太大的变化。我们再次ltrace,或X元直接分配,malloc调用干扰消除,因为我们的实际应用从缓存中伸出来,所以它不存在在示例代码在本周期的情况记忆。
重新执行
复制代码代码如下所示:
壳ltrace美元C / usr / / / PHP本地bin / php test.php
如下:
__ctype_tolower_loc占据了大部分时间!库函数__ctype_tolower_loc干什么将字符串转换为小写是一个简单的理解。这是否意味着in_array比较字符串的大小写不敏感事实上,这叫有in_array我们感觉联系不大,对in_array实施,或看到PHP源代码,可能理解更透彻了,好了,不说了,欢迎与我交流,写的不对的地方请指正。
——分割线————————2013.08.29
晚上把下面的PHP 5.4.10源代码,感兴趣的in_array真大啊,哈哈。 / / /阵列EXT标准。C位于第一千二百四十八线,可以看到他所谓的php_search_array功能,以下array_serach此次调整,只是最后一个参数!一个in_array跟踪后,在松散的比较,他最终调用的zendi_smart_strcmp功能(它是一个智能功能)进行了比较。 / / zend_operators Zend。C,我们使用了大量的开关ltrace作为一个整体的操作是,is_numeric_string_ex行为了。
功能is_numeric_string_ex定义。 / / zend_operators Zend。H.一束判断在前转型后,我们把在232排strtol。这就是我们在文章中提到的系统功能。它把字符串转换成整数,这是真的。
事情是这样的,一个同事,一个反馈接口,每一次我们需要回到5秒长,我们一起审查代码,惊讶地发现,即使在循环(约900倍)称为读取缓存,以及关键的缓存并没有改变,所以我们把这个代码移到外面循环,再次测量,返回的时间降到2秒,唉!比我们高1倍,但显然不是我们能接受的结果!
看来性能问题的代码量不是很大。在排除了IO问题之后,我们编写了一段测试代码,很快就解决了这个问题。
复制代码代码如下所示:
< PHP
$1800;
$ =数组();
对于($ = 0;$ j 2000;$ + +){
$ }{ $ };
}
($ i = 0;$ i < 3000;$ + +){
如果(in_array($ Y,X元)){
继续;
}
}
>
壳为时间 / usr / / / PHP本地bin / php test.php
真正的0m1.132s
用户0m1.118s
系统0m0.015s
是的,我们使用的是字符串类型的数字,这是它从缓存中出来的方式!所以这里是一个特殊的传递一个字符串(如果它是一个号码,你不会有这样的问题,您可以验证它自己)。我们可以看到,花了1的时间,只有3000个周期,在系统中当我们使用strace注定不会得到什么信息。
壳元信息TTT O XXX / usr / / / PHP本地bin / php test.php
壳少XXX
我们只看到两个系统调用之间的延迟非常大,但不知道该怎么办这与它无关。幸运的是,在Linux调试工具strace和ltrace例外(当然,DTrace,改成,不在本文的讨论范围)。
参考:strace用来跟踪进程的系统调用和信号产生的过程,并ltrace用于跟踪过程调用库函数的情况(通过IBM developerWorks)。
为了排除干扰因素,我们把X元直接阵列(0)在避免过多的malloc调用影响result.implement形式
壳ltrace美元C / usr / / / PHP本地bin / php test.php
例如,图2
我们看到__strtol_internal库函数的调用是很频繁的,达到94%,太夸张了,然后我检查什么是__strtol_internal库函数,原来是strtol别名,只是将字符串转换生长成型,可以猜到PHP引擎已经被发现,这是一个字符串类型的数字,所以希望他们为整数相比,这种转换过程消耗了太多的时间,我们进行了一次:
复制代码代码如下所示:
壳ltrace美元E__strtol_internal / usr / / / PHP本地bin / php test.php
您可以轻松地捕获许多调用,如以下图片。我们在这里找到了问题。in_array宽松的比较将两个字符串为长整型,然后比较它,但我们不知道性能将会丢失。
我们知道问题的症结所在,在很多的解决方案,最简单的是真正的第三参数in_array,这也是一个严格的比较,比较的类型,从而避免PHP幻想型的转换,跑得真快,代码如下:
复制代码代码如下所示:
< PHP
$1800;
$ =数组();
对于($ = 0;$ j 2000;$ + +){
$ }{ $ };
}
($ i = 0;$ i < 3000;$ + +){
如果(in_array($ Y,X元,真)){
继续;
}
}
>
复制代码代码如下所示:
壳为时间 / usr / / / PHP本地bin / php test.php
真正的0m0.267s
用户0m0.247s
系统0m0.020s
好多倍的速度!!!!你可以看到系统的时间几乎是没有太大的变化。我们再次ltrace,或X元直接分配,malloc调用干扰消除,因为我们的实际应用从缓存中伸出来,所以它不存在在示例代码在本周期的情况记忆。
重新执行
复制代码代码如下所示:
壳ltrace美元C / usr / / / PHP本地bin / php test.php
如下:
__ctype_tolower_loc占据了大部分时间!库函数__ctype_tolower_loc干什么将字符串转换为小写是一个简单的理解。这是否意味着in_array比较字符串的大小写不敏感事实上,这叫有in_array我们感觉联系不大,对in_array实施,或看到PHP源代码,可能理解更透彻了,好了,不说了,欢迎与我交流,写的不对的地方请指正。
——分割线————————2013.08.29
晚上把下面的PHP 5.4.10源代码,感兴趣的in_array真大啊,哈哈。 / / /阵列EXT标准。C位于第一千二百四十八线,可以看到他所谓的php_search_array功能,以下array_serach此次调整,只是最后一个参数!一个in_array跟踪后,在松散的比较,他最终调用的zendi_smart_strcmp功能(它是一个智能功能)进行了比较。 / / zend_operators Zend。C,我们使用了大量的开关ltrace作为一个整体的操作是,is_numeric_string_ex行为了。
功能is_numeric_string_ex定义。 / / zend_operators Zend。H.一束判断在前转型后,我们把在232排strtol。这就是我们在文章中提到的系统功能。它把字符串转换成整数,这是真的。
声明:本文内容用于数码产品信息整理与选购参考,具体价格、库存、售后政策以官方渠道和电商页面实时信息为准。