压力测试
压测脚本中创建了一个 PyDict ,分别读写 PHP 代码和 Python 代码执行 1000万次。
PHP 版本:PHP 8.2.3 (cli) (built: Mar 17 2023 15:06:57) (NTS)Python 版本:Python 3.11.5- 操作系统:
Ubuntu 20.04 GCC 版本:gcc version 9.4.0 (Ubuntu 9.4.0-1ubuntu1~20.04.2)
请注意此测试需要构造一个
1000万元素的HashTable,需要至少2G以上内存空间才可以运行
PHP
<?php$dict = new PyDict();const COUNT = 10000000;$n = COUNT;$s = microtime(true);while ($n--) {$dict['key-' . $n] = $n * 3;}echo 'dict set: ' . round(microtime(true) - $s, 6) . ' seconds' . PHP_EOL;$c = 0;$n = COUNT;$s = microtime(true);while ($n--) {$c += $dict['key-' . $n];}echo 'dict get: ' . round(microtime(true) - $s, 6) . ' seconds' . PHP_EOL;
Python
import timemy_dict = {}COUNT = 10000000n = COUNTstart_time = time.time()for i in range(n):my_dict["key-" + str(i)] = i * 3elapsed_time = time.time() - start_timeprint(f"dict set: {elapsed_time:.6f} seconds")n = COUNTtotal = 0start_time_get = time.time()for i in range(n):total += my_dict["key-" + str(i)]elapsed_time_get = time.time() - start_time_getprint(f"dict get: {elapsed_time_get:.6f} seconds")
PHP 数组
<?phpini_set('memory_limit', '2G');$dict = [];const COUNT = 10000000;$n = COUNT;$s = microtime(true);while ($n--) {$dict['key-' . $n] = $n * 3;}echo 'array set: ' . round(microtime(true) - $s, 6) . ' seconds' . PHP_EOL;$c = 0;$n = COUNT;$s = microtime(true);while ($n--) {$c += $dict['key-' . $n];}echo 'array get: ' . round(microtime(true) - $s, 6) . ' seconds' . PHP_EOL;
结果对比
(base) htf@swoole-12:~/workspace/python-php/docs/benchmark$ php dict.phpdict set: 4.663758 secondsdict get: 3.980076 seconds(base) htf@swoole-12:~/workspace/python-php/docs/benchmark$ php array.phparray set: 1.578963 secondsarray get: 0.831129 seconds(base) htf@swoole-12:~/workspace/python-php/docs/benchmark$ python dict.pydict set: 5.321664 secondsdict get: 4.969081 seconds(base) htf@swoole-12:~/workspace/python-php/docs/benchmark$
以 Python 测试为基准:
| 脚本名称 | Set | Get |
|---|---|---|
| dict.php | 114% | 125% |
| array.php | 337% | 599% |
phpy以PHP代码写入PyDict的性能比原生Python高14%,读取性能高25%PHP写入PHP Array的性能比Python 写入 Dict高237%,读取高出了近500%
