gpt4 book ai didi

php - 与 PHP 5.6 相比,我在 PHP 7 中面临更多的内存消耗

转载 作者:IT王子 更新时间:2023-10-29 00:01:50 26 4
gpt4 key购买 nike

当我做基准测试时,我发现 PHP 7 使用的内存比 PHP 5.6 多。

所以,我做了一个测试。我运行的脚本仅包含:

  $a=10;

以下是我在没有任何模块的情况下使用 PHP CLI 时使用的内存的结果 (php -n)

php 5.6 = 222600 Bytes
php 7.0 = 350448 Bytes

* PHP 5.6.23 (cli) (built: Jun 22 2016 12:13:15)
Copyright (c) 1997-2016 The PHP Group
Zend Engine v2.6.0, Copyright (c) 1998-2016 Zend Technologies

* PHP 7.0.9 (cli) (built: Jul 20 2016 10:47:41) ( NTS )
Copyright (c) 1997-2016 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2016 Zend Technologies

环境是

  • 操作系统:窗口 10
  • 服务器:IIS(虽然我使用的是 CLI,而不是服务器),具有快速 cgi
  • 机器:64 位
  • php-5.6.23-nts-Win32-VC11-x64
  • php-7.0.9-nts-Win32-VC14-x64

谁能解释我为什么得到这个结果?


附加测试

按照@gordon 的建议使用此代码,

$i=0;
while ($i++ < 100000) ;

php 5.6:227408 字节

php 7.0:386640 字节

我用这段代码确定了内存使用情况:

echo PHP_EOL;
echo "Memory Usage :".memory_get_usage();
echo PHP_EOL;
echo "Real Memory Usage :".memory_get_usage(true);
echo PHP_EOL;
echo "Real Peak Memory Usage :".memory_get_peak_usage(true);
echo PHP_EOL;
echo "Peak Memory Usage :".memory_get_peak_usage();

最佳答案

要了解问题的答案 - 您需要了解 PHP5 和 PHP7 如何分配内存。

PHP5 假设 Zend Engine 结构“按请求”分配内存。

PHP7 中,它在这方面进行了一些优化,因此在“按 block ”分配内存方面

  • 开始时它分配大块内存
  • 在应用内分配时,它分配小块以避免碎片

这种差异可以很好地提高性能(因为引擎不需要在每次需要时在运行时分配内存并节省一些碎片时间),但它增加了“非常小”程序的内存消耗,它的大小低于“ block 大小”。

是的,PHP7 在大型程序上非常节省内存。

您可以在下面的图片中查看所有这些差异:

PHP memory allocation for large programs PHP memory allocation for small programs

使用基准构建的图形:1.php

<?php

ini_set('memory_limit', '5G');
$a=range(1,$argv[1]);

echo PHP_EOL;
echo "Memory Usage :".memory_get_usage();
echo PHP_EOL;
echo "Real Memory Usage :".memory_get_usage(true);
echo PHP_EOL;
echo "Real Peak Memory Usage :".memory_get_peak_usage(true);
echo PHP_EOL;
echo "Peak Memory Usage :".memory_get_peak_usage();
echo PHP_EOL;

bench.sh

// Small programs
(for i in $(seq 0 5 5000);do php5 dev/Tools/mem/1.php $i|cut -f 2 -d:|sed -r 's/^$/;/g'|sed -r 's/([0-9]+)$/\1,/g'|tr -d '\n'; echo $i; done)|tr -d '\n'|sed -r 's/$/]/g'|sed -r 's/^;/[/g'>php5.m
(for i in $(seq 0 5 5000);do php dev/Tools/mem/1.php $i|cut -f 2 -d:|sed -r 's/^$/;/g'|sed -r 's/([0-9]+)$/\1,/g'|tr -d '\n'; echo $i; done)|tr -d '\n'|sed -r 's/$/]/g'|sed -r 's/^;/[/g'>php7.m
//Large Programs
(for i in $(seq 0 50 100000);do php5 dev/Tools/mem/1.php $i|cut -f 2 -d:|sed -r 's/^$/;/g'|sed -r 's/([0-9]+)$/\1,/g'|tr -d '\n'; echo $i; done)|tr -d '\n'|sed -r 's/$/]/g'|sed -r 's/^;/[/g'>php5.m
(for i in $(seq 0 50 100000);do php dev/Tools/mem/1.php $i|cut -f 2 -d:|sed -r 's/^$/;/g'|sed -r 's/([0-9]+)$/\1,/g'|tr -d '\n'; echo $i; done)|tr -d '\n'|sed -r 's/$/]/g'|sed -r 's/^;/[/g'>php7.m

Octave 抽屉

php7;php7=ans;
php5;php5=ans;
plot(php5(:,5)',[php5(:,1:4)';php7(:,1:4)']');
legend("PHP5 mgu", "PHP5 rmu", "PHP5 rpmu", "PHP5 pmu","PHP7 mgu", "PHP7 rmu", "PHP7 rpmu", "PHP7 pmu");

阅读更多

  1. 官方 PHP7/PHP-NG 介绍: https://drive.google.com/file/d/0B3UKOMH_4lgBUTdjUGxIZ3l1Ukk/view
  2. 官方 PHP7/PHP-NG 内部变化说明: https://wiki.php.net/phpng-int
  3. 官方扩展程序迁移指南: https://wiki.php.net/phpng-upgrading
  4. 来自@NikiC 的好文章: http://nikic.github.io/2015/05/05/Internal-value-representation-in-PHP-7-part-1.htmlhttp://nikic.github.io/2015/06/19/Internal-value-representation-in-PHP-7-part-2
  5. PHP5 内部细节:http://www.phpinternalsbook.com/
  6. Badoo PHP5->PHP7 成功案例详情:https://techblog.badoo.com/blog/2016/03/14/how-badoo-saved-one-million-dollars-switching-to-php7/

关于php - 与 PHP 5.6 相比,我在 PHP 7 中面临更多的内存消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39740398/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com