かまてく ブログ

今日の努力は、明日の経験! - Kamakura Shinsho Engineer Blog

PHPでのメモリ管理(バージョンによるメモリ消費の違い)Part 2

前回(PHPでのメモリ管理(バージョンによるメモリ消費の違い) - かまてっく ブログ)の続きです。

PHPのver5系とver7系では、メモリ管理が大きく変化していました。 今回も、バージョンでの差異を見ていきます。

1000文字の文字列×100個の配列を作成します。

memory_test.php

<?php
echo "文字列を直接指定して配列を作成する\n";
$before_memory = memory_get_usage();
for( $i = 0;$i < 100;$i++ ){
    $a[] = "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
        ;
}
$after_memory = memory_get_usage();
$used_memory = $after_memory-$before_memory;
echo "使用メモリ before[{$before_memory}] after[{$after_memory}]:after - before = {$used_memory}\n";

実行結果がこちら

$ php -v
PHP 5.3.29 (cli) (built: May 12 2015 22:42:19) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
$ php memory_test.php 
文字列を直接指定して配列を作成する
使用メモリ before[627144] after[744784]:after - before = 117640
$ php -v
PHP 7.1.27 (cli) (built: Mar  8 2019 18:22:16) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.27, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans
$ php memory_test.php 
文字列を直接指定して配列を作成する
使用メモリ before[354872] after[363120]:after - before = 8248

やはり、今回もver7系がメモリ効率がかなり良くなっていることがわかります。 10倍以上の差が出ています。 ver5系では、100kb(100000bytes)のデータに対して 約110kb(117640bytes)とデータに対してほぼ同量のメモリを消費しています。 ver7系では、データに対してメモリ消費が少ないです。 (この辺りは、スタックが関連しているのでは?と推測しています。)

今回は、変数を利用するパターンも実行してみました。

memory_test2.php

<?php
echo "変数に文字列を代入して、それを配列にする\n";
$s =    "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    . "1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890"
    ;

$before_memory = memory_get_usage();
for( $i = 0;$i < 100;$i++ ){
    $a[] = $s;
}
$after_memory = memory_get_usage();
$used_memory = $after_memory-$before_memory;
echo "使用メモリ before[{$before_memory}] after[{$after_memory}]:after - before = {$used_memory}\n";

実行結果がこちら

$ php -v
PHP 5.3.29 (cli) (built: May 12 2015 22:42:19) 
Copyright (c) 1997-2014 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2014 Zend Technologies
$ php memory_test2.php 
変数に文字列を代入して、それを配列にする
使用メモリ before[628544] after[638936]:after - before = 10392
$ php -v
PHP 7.1.27 (cli) (built: Mar  8 2019 18:22:16) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.1.0, Copyright (c) 1998-2018 Zend Technologies
    with Zend OPcache v7.1.27, Copyright (c) 1999-2018, by Zend Technologies
    with Xdebug v2.5.5, Copyright (c) 2002-2017, by Derick Rethans
$ php memory_test2.php 
変数に文字列を代入して、それを配列にする
使用メモリ before[355000] after[363248]:after - before = 8248

ver7系では変化がありませんでした。 ver5系では変数を利用した方がメモリ効率が良くなっています。 なんと、前回の空配列を100個作るよりメモリ消費は少ないです。

ver5系では、配列の作り方でメモリ消費が大きく変化するようです。

鎌倉新書では正社員を積極採用しています!

(WEBデザイナー)デザインからコンセプト設計まで■賞与実績4ヶ月分■

仕事内容 【仕事内容】 ■ポータルサイト(お墓・葬儀・仏壇)のWebサイト構築のためのWebデザインの設計からコーディング業務まで担って頂きます。 特に事業側のコンセプトを理解しながら、LPやサイトのデザイン設計を提案できる方を求めています。 【提供できる価値・経験】 ■細かく数字を見て、サービスをグロースさせていく経験 1週間単位でスプリントを組んで、数多くの機能をリリースさせていく開発プロセスを導入しています。 数多くのトライ&エラーを行い、きっちり効果を分析していくことで、サービスを着実に成長させるプロセスが身につきます。 また、事業側のWebディレクターとも密にコミュニケーションを取りながら、事業会社ならではの一体感を持ったクリエイティブワークを実践しています。 ■今後大きく成長するマーケットにおけるサービス開発に携わることができる経験 世界一の高齢化社会である日本においてライフエンディング業界は大きなポテンシャルを持っています。 その業界に必要なサービスを提供することで、大きなユーザーの需要を満たすサービスを提供するやりがいと経験を得ることができます。 また、今の日本社会で必要とされているサービスを提供しているという社会貢献も大きなやりがいとして持つことができます。 【デザインの特徴】 ■企画構想段階から関わり、ユーザー視点に立ったUIの設計、ビジュアルデザイン ■色彩学、構成学、視覚生理学などの知識を生かしたデザイン ■プロジェクトの成功に貢献するデザイン(目的を本質的に達成するデザイン) ■問題点や課題、目的をしっかり理解し、解決するデザイン 応募資格 【必須(MUST)】 ■Webサービスのデザイン・コーディング経験 ■WebサービスやスマートフォンアプリのUI・情報設計の経験 ■Photoshop、Illustratorなどの画像処理ソフトを使用したビジュアルデザイン業務 【歓迎(WANT)】 ■情報の可視化 ■部分遷移、画面遷移を含むプロトタイプ構築経験 ■デザインコンセプトの言語化 ■ユーザー体験の設計業務 ■デザインのトーン&マナー設計 ■プロダクト改善経験 ▼求める人物像 ・自発的に施策を立案・実行できるマインドを持つ方 ・成長環境の中で自分を試してみたい方 ・数字の分析に強い方 ・コミュニケーション能力 ・課題発見力、解決力 続きを見る