Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Ujian prestasi dan pengoptimuman mod tunggal dalam PHP

Ujian prestasi dan pengoptimuman mod tunggal dalam PHP

PHPz
PHPzasal
2023-10-15 10:52:50902semak imbas

Ujian prestasi dan pengoptimuman mod tunggal dalam PHP

Pengujian prestasi dan pengoptimuman mod tunggal dalam PHP

Pengenalan:
Mod singleton ialah Corak reka bentuk biasa, iaitu digunakan untuk memastikan bahawa hanya satu contoh kelas boleh dijana. Dalam PHP, mod tunggal boleh membantu kami mengelak daripada membuat kelas beberapa kali, dengan itu meningkatkan prestasi program. Artikel ini akan memperkenalkan cara untuk menguji dan mengoptimumkan corak tunggal dalam PHP dan memberikan contoh kod khusus.

  1. Pengenalan kepada Singleton Pattern
    Corak singleton ialah corak reka bentuk ciptaan adalah untuk memastikan kelas hanya mempunyai satu contoh dan menyediakan akses global kepada titik itu . Dalam PHP, kita boleh melaksanakan corak tunggal dengan:
class Singleton
{
    private static $instance;

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

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

        return self::$instance;
    }

    // 其他方法
}

Dengan menjadikan pembina peribadi, kita boleh menghalang kelas daripada dijadikan instantiated secara luaran. Kaedah getInstance() bertanggungjawab untuk mendapatkan contoh unik kelas Singleton dan mewujudkannya apabila diperlukan. Setiap kali kaedah getInstance() dipanggil, objek contoh yang sama dikembalikan.

  1. Ujian Prestasi
    Sebelum menggunakan corak tunggal, kita perlu menguji sama ada prestasinya benar-benar lebih baik daripada membuat seketika kelas. Berikut ialah contoh ujian prestasi mudah:
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();

Dalam kod di atas, kami menguji masa pelaksanaan untuk menginstant kelas melalui mod tunggal dan membuat instantiat kelas masing-masing. Keputusan pelaksanaan akan memberikan kita rujukan untuk menentukan sama ada untuk menggunakan mod tunggal untuk meningkatkan prestasi.

  1. Pengoptimuman Prestasi
    Walaupun mod tunggal boleh meningkatkan prestasi dalam beberapa kes, masalah prestasi mungkin berlaku dalam beberapa kes khas. Berikut ialah beberapa cadangan untuk membantu kami mengoptimumkan prestasi corak tunggal:

3.1 Instalasi malas
Dalam contoh di atas, kami menunggu sehingga kali pertama kami memanggil getInstance() Segerakan kelas Singleton. Pendekatan ini dipanggil instantiation malas. Ini mengelakkan instantiasi tidak sah, yang amat penting dalam projek besar.

3.2 Keselamatan berbilang benang
Apabila menggunakan mod tunggal dalam persekitaran berbilang benang, isu keselamatan benang perlu dipertimbangkan. Kami boleh menyelesaikan masalah ini dengan mengunci:

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;
    }
}

Dalam kod di atas, kami menambah pembolehubah statik $lock dan menggunakannya untuk memastikan bahawa apabila berbilang benang mengakses kaedah getInstance() pada masa yang sama, Hanya satu benang boleh melakukan operasi instantiasi.

Kesimpulan:
Mod tunggal boleh meningkatkan prestasi dalam kebanyakan kes, tetapi mungkin terdapat isu prestasi dalam beberapa kes khas. Kita perlu menjalankan ujian prestasi berdasarkan keadaan sebenar dan mengoptimumkan pelaksanaan corak tunggal. Dengan melengahkan instantiasi dan penguncian, kami boleh meningkatkan prestasi dan keselamatan benang bagi mod tunggal.

Rujukan:

  • Corak Reka Bentuk: Elemen Perisian Berorientasikan Objek Boleh Digunakan Semula oleh Erich Gamma, Richard Helm, Ralph Johnson dan John Vlissides.#🎜🎜
  • Corak Reka Bentuk PHP oleh Stephan Schmidt.
Di atas adalah pengenalan kepada ujian prestasi dan pengoptimuman mod tunggal dalam PHP.

Atas ialah kandungan terperinci Ujian prestasi dan pengoptimuman mod tunggal dalam PHP. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn