PHP のシングルトン モードのパフォーマンス テストと最適化

PHPz
リリース: 2023-10-15 10:56:01
オリジナル
913 人が閲覧しました

PHP のシングルトン モードのパフォーマンス テストと最適化

PHP でのシングルトン モードのパフォーマンス テストと最適化

はじめに:
シングルトン モードは一般的な設計パターンであり、A クラスが確実にパフォーマンスを発揮できるようにするために使用されます。インスタンスを 1 つだけ生成します。 PHP では、シングルトン モードを使用すると、クラスを複数回インスタンス化する必要がなくなり、プログラムのパフォーマンスが向上します。この記事では、PHP でシングルトン パターンをテストおよび最適化する方法を紹介し、具体的なコード例を示します。

  1. シングルトン パターンの概要
    シングルトン パターンは創造的なデザイン パターンであり、その目標は、クラスにインスタンスが 1 つだけ存在するようにし、そのインスタンスへのグローバル アクセス ポイントを提供することです。 PHP では、次の方法でシングルトン パターンを実装できます。
class Singleton
{
    private static $instance;

    private function __construct()
    {
        // 私有构造函数,防止类外实例化
    }

    public static function getInstance()
    {
        if (!self::$instance) {
            self::$instance = new self();
        }

        return self::$instance;
    }

    // 其他方法
}
ログイン後にコピー

コンストラクターをプライベートにすることで、クラスが外部でインスタンス化されるのを防ぐことができます。 getInstance() メソッドは、Singleton クラスの一意のインスタンスを取得し、必要に応じてインスタンス化する役割を果たします。 getInstance() メソッドが呼び出されるたびに、同じインスタンス オブジェクトが返されます。

  1. パフォーマンス テスト
    シングルトン パターンを使用する前に、クラスを直接インスタンス化するよりもそのパフォーマンスが本当に優れているかどうかをテストする必要があります。以下は簡単なパフォーマンス テストの例です。
class Test
{
    public function run()
    {
        $startTime = microtime(true);

        for ($i = 0; $i < 100000; $i++) {
            $singleton = Singleton::getInstance();
        }

        $endTime = microtime(true);
        $executionTime = round($endTime - $startTime, 4);

        echo "执行100000次单例模式实例化耗时:{$executionTime} 秒
";

        $startTime = microtime(true);

        for ($i = 0; $i < 100000; $i++) {
            $instance = new Singleton();
        }

        $endTime = microtime(true);
        $executionTime = round($endTime - $startTime, 4);

        echo "执行100000次类实例化耗时:{$executionTime} 秒
";
    }
}

$test = new Test();
$test->run();
ログイン後にコピー

上記のコードでは、シングルトン モードによるクラスのインスタンス化とクラスの直接インスタンス化の実行時間をそれぞれテストしました。実行結果は、パフォーマンスを向上させるためにシングルトン モードを使用するかどうかを判断するための参考になります。

  1. パフォーマンスの最適化
    シングルトン モードは場合によってはパフォーマンスを向上させることができますが、特殊な場合にはパフォーマンスの問題が発生する可能性があります。シングルトン パターンのパフォーマンスを最適化するのに役立ついくつかの提案を次に示します。

3.1 遅延インスタンス化
上記の例では、最初に getInstance() が呼び出されたときにのみシングルトン クラスをインスタンス化します。時間 。このアプローチは遅延インスタンス化と呼ばれます。これにより、無効なインスタンス化が回避されます。これは大規模なプロジェクトで特に重要です。

3.2 マルチスレッドの安全性
マルチスレッド環境でシングルトン モードを使用する場合は、スレッドの安全性の問題を考慮する必要があります。この問題は、ロックすることで解決できます。

class Singleton
{
    private static $instance;
    private static $lock;

    private function __construct()
    {
        // 私有构造函数,防止类外实例化
    }

    public static function getInstance()
    {
        if (!self::$instance) {
            self::$lock = true;
            if (!self::$instance) {
                self::$instance = new self();
            }
            self::$lock = false;
        }

        return self::$instance;
    }
}
ログイン後にコピー

上記のコードでは、静的変数 $lock を追加し、それを使用して、複数のスレッドが getInstance() メソッドに同時にアクセスするときに、スレッドが 1 つだけになるようにしました。インスタンス化操作を実行できます。

結論:
シングルトン モードでは、ほとんどの場合パフォーマンスが向上しますが、特殊なケースではパフォーマンスの問題が発生する可能性があります。実際の条件に基づいてパフォーマンス テストを実施し、シングルトン パターンの実装を最適化する必要があります。インスタンス化とロックを遅らせることで、シングルトン モードのパフォーマンスとスレッドの安全性を向上させることができます。

参考:

  • デザイン パターン: 再利用可能なオブジェクト指向ソフトウェアの要素 (Erich Gamma、Richard Helm、Ralph Johnson、John Vlissides 著)
  • PHP デザイン パターンStephan Schmidt 著.

上記は、PHP におけるシングルトン モードのパフォーマンス テストと最適化についての紹介です。

以上がPHP のシングルトン モードのパフォーマンス テストと最適化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート