Bagi mereka yang tidak dikenali dengan konsep ini, bekas suntikan ketergantungan adalah sekeping perisian yang secara automatik membina pokok objek. Sebagai contoh, pertimbangkan objek pengguna yang memerlukan contoh pangkalan data.
<span>$user = new User(new Database());</span>
<span>$user = $container->get('User');</span>
Terdapat beberapa bekas terkenal (dan tidak begitu terkenal) yang tersedia untuk PHP:
perkataan pada jerawat: walaupun jerawat diiklankan sebagai bekas suntikan ketergantungan, mengambil objek dari bekas selalu mengembalikan contoh yang sama, yang menjadikan jerawat sebagai pencari perkhidmatan dan bukannya bekas suntikan ketergantungan dan tidak dapat diuji.
aspek suntikan ketergantungan yang mana akan diukur?
Semua nombor masa pelaksanaan yang dibentangkan adalah purata 10 larian selepas membuang mana -mana yang melebihi 20% lebih perlahan daripada yang terpantas.
ujian 1 - Buat contoh objek
tanpa bekas suntikan ketergantungan, ini akan ditulis sebagai:
kod ujian (pada github): aura, dadu, ornodi, php-di, symfonydependencyinjection, zenddi
<span>$user = new User(new Database());</span>
Seperti yang anda lihat, terdapat dua kem yang jelas di sini. Aura, dadu dan orno kira-kira sepuluh kali lebih cepat daripada php-di, symfony dan zenddi.
Ini sangat menceritakan betapa ringannya setiap bekas dan pergi ke arah menjelaskan perbezaan penggunaan memori. Harus diingat bahawa banyak fail yang digunakan oleh Zenddi adalah fail kerangka biasa jadi jika anda menggunakan Rangka Kerja Zend, maka menggunakan Zenddi tidak akan menanggung overhead memori yang sama seperti fail mungkin akan digunakan semula di tempat lain dalam permohonan anda.
Begitu juga, php-di-di-sangat bergantung pada perpustakaan doktrin. Jika anda menggunakan doktrin dalam projek anda, maka overhead memori PHP-DI dikurangkan.Walau bagaimanapun, adalah baik untuk melihat bahawa symfonydependencyInjection, walaupun menjadi sebahagian daripada rangka kerja stack adalah sepenuhnya berdiri sendiri dan berfungsi tanpa sebarang kebergantungan dari projek -projek simfoni lain.
aura, dadu dan orno tidak mempunyai sebarang kebergantungan luaran dan ini membantu mengekalkan jumlah fail mereka.ujian 2 - mengabaikan autoloading
Sebagai fail pemuatan boleh memberi kesan kepada prestasi dan kedua-dua zend dan php-di memuatkan sejumlah besar fail, ujian yang sama telah dijalankan mengabaikan masa autoloader dengan terlebih dahulu membuat satu contoh kelas, memastikan mana-mana kelas yang diperlukan telah autoloaded sebelum mengukur masa.
Ini juga mungkin telah mencetuskan sebarang caching dalaman yang dilakukan oleh bekas tetapi rawatan yang sama digunakan untuk setiap bekas untuk memastikan ia adil
Kod PHP bersamaan:
kod ujian (pada github): aura, dadu, ornodi, php-di, symfonydependencyinjection, zenddi
<span>$user = new User(new Database());</span>
Seperti yang dijangkakan, penggunaan memori tidak berubah dan prestasi sedikit lebih baik kerana masa autoloader tidak diukur. Walau bagaimanapun, ini menunjukkan bahawa PHP-DI, walaupun memuatkan 42 fail mempunyai kesan yang tidak dapat dielakkan ke atas jumlah masa pelaksanaan dan prestasi relatif tetap sama, memuatkan berpuluh-puluh fail bukanlah penyebab php-di dan zenddi yang mempunyai prestasi yang agak perlahan.
Semua ujian ke hadapan akan mengabaikan masa autoloading untuk memastikan ia benar -benar prestasi bekas yang sedang diukur.
ujian 3 - Graf Objek Deep
Ujian ini dilakukan dengan mempunyai bekas yang membina set objek ini 10,000 kali:
kod ujian (pada github): aura, dadu, ornodi, php-di, symfonydependencyinjection, zenddi
Nota: Seperti yang anda lihat dengan melihat kod ujian, Symfony, PHP-Di dan Aura memerlukan lebih banyak kod konfigurasi daripada bekas lain untuk melakukan ujian ini. Masa konfigurasi tidak termasuk dalam ujian.
<span>$user = $container->get('User');</span>
zend, php-di dan ke tahap yang lebih rendah Symfony perlahan di sini. Zend mengambil masa 37 saat untuk melaksanakan tugas dadu di bawah 1 saat; Sudah tentu bukan perbezaan remeh. Sekali lagi, Symfony memimpin di antara bekas nama besar.
jumlah memori dan fail selaras dengan apa yang telah kita lihat dalam ujian lain.
bekas juga perlu menyimpan dan mengambil perkhidmatan yang akan digunakan semula sepanjang permohonan. Ujian ini mengambil satu contoh dari bekas berulang kali.
kod ujian (pada github): aura, dadu, ornodi, php-di, symfonydependencyinjection, zenddi
<span>$user = new User(new Database());</span>
Penggunaan memori dan bilangan keputusan fail menjadi diramalkan dengan pembahagian yang sama antara bekas yang kita lihat dalam masa pelaksanaan sepanjang.
Ujian akhir adalah untuk melihat seberapa cepat objek boleh dibina dan mempunyai perkhidmatan yang disuntik. Ini memerlukan format:
kod ujian (pada github): aura, dadu, ornodi, php-di, symfonydependencyinjection, zenddi
<span>$user = $container->get('User');</span>
Mengejutkan, PHP-DI adalah yang paling lambat dalam tugas ini, dengan Zend mengambil kedudukannya di hadapan PHP-di dan Symfony buat kali pertama.
Kesimpulan
Pada prestasi sahaja, Dice, Aura dan Orno adalah semua pesaing yang kuat, Dice adalah terpantas secara keseluruhan dan aura terpantas dalam ujian akhir. Perbezaan antara kedua -dua kumpulan yang berbeza adalah jelas tetapi menarik untuk membandingkan ciri -ciri setiap bekas. Bilangan ciri dan prestasi tidak cukup berkaitan seperti yang anda harapkan. Kedua-dua php-di dan dadu mengandungi ciri-ciri yang unik tetapi php-di mengambil prestasi berat untuk melakukannya. Aura, walaupun pantas, memerlukan banyak konfigurasi manual dan, seperti yang anda harapkan, mempunyai ciri -ciri yang sangat minimum manakala Dice dan Orno mempunyai prestasi yang sangat serupa tetapi memerlukan banyak kod kurang untuk mengkonfigurasi.
Symfony sangat banyak di tengah -tengah dalam semua ujian, walaupun mengkonfigurasi, seperti dengan Aura, adalah tugas yang lebih sukar kerana tidak ada jenis sokongan parameter yang dibayangkan. Jika anda sedang mencari bekas dari projek yang terkenal, maka Symfony harus menjadi bekas pilihan jika prestasi penting.yang mengatakan, jika prestasi murni adalah apa yang anda selepas itu dadu dan aura adalah pemenang yang jelas dengan Orno sangat dekat di belakang. Walau bagaimanapun, ia patut melihat sintaks konfigurasi dan ciri -ciri masing -masing untuk melihat yang anda lebih suka bekerja dengan perbezaan prestasi antara Dice, Aura dan Orno boleh diabaikan untuk sebarang aplikasi sebenar.
Semua kod untuk ujian boleh didapati di GitHub. Sila ambil perhatian: Repositori GitHub mengandungi salinan perpustakaan yang diuji dan bukannya menggunakan komposer untuk memasukkannya ke dalam projek, ini adalah untuk memastikan bahawa anda boleh menjalankan kod dengan versi yang tepat yang saya uji dan mendapatkan hasil yang sama. >
Soalan Lazim (Soalan Lazim) mengenai Penanda Aras Prestasi Suntikan Ketergantungan PHP Apakah kepentingan penanda aras Prestasi Suntikan Ketergantungan PHP? Penanda aras ini memberikan analisis perbandingan pelbagai bekas, membantu pemaju membuat keputusan yang tepat mengenai bekas yang digunakan berdasarkan keperluan khusus mereka. Mereka menawarkan pandangan tentang prestasi setiap bekas dari segi penggunaan memori dan penggunaan masa, yang merupakan faktor kritikal dalam mengoptimumkan prestasi aplikasi PHP. > Suntikan Ketergantungan (DI) dalam PHP meningkatkan kualiti kod dengan mempromosikan gandingan longgar, meningkatkan kebolehlihatan, dan meningkatkan kebolehgunaan semula kod. Dengan menyuntik kebergantungan, komponen menjadi lebih bebas, menjadikan kod lebih mudah untuk diubah suai dan diuji. Ia juga menggalakkan prinsip tanggungjawab tunggal kerana setiap kelas hanya melakukan apa yang sepatutnya dilakukan, yang membawa kepada kod yang lebih bersih dan lebih diselenggara.
Terdapat tiga jenis suntikan ketergantungan utama dalam PHP: suntikan pembina, suntikan setter, dan suntikan antara muka. Suntikan pembina adalah di mana kebergantungan disediakan melalui pembina kelas. Suntikan setter melibatkan menyediakan kebergantungan melalui kaedah. Suntikan antara muka memerlukan kelas bergantung untuk melaksanakan antara muka yang akan menyuntik kebergantungan. Bekas, menguruskan instantiasi dan konfigurasi perkhidmatan atau objek dalam aplikasi. Ia bertindak sebagai kilang yang bertanggungjawab untuk mewujudkan dan mengembalikan contoh kebergantungan. Ia juga menguruskan contoh yang dikongsi, memastikan bahawa satu contoh dikembalikan setiap kali perkhidmatan bersama diminta. Bekas, pertimbangkan faktor seperti kemudahan penggunaan, prestasi, sokongan komuniti, dan keserasian dengan projek anda. Prestasi sangat penting, dan ini adalah di mana penanda aras prestasi suntikan PHP kebergantungan berguna. Mereka memberikan analisis perbandingan prestasi pelbagai bekas, membantu anda membuat keputusan yang tepat. Ketergantungan kelas. Ini membolehkan kebergantungan dihina atau ditangkap semasa ujian, membolehkan anda menguji kelas secara berasingan. Ia juga memudahkan untuk menulis ujian unit, kerana anda boleh menyuntik kebergantungan mengejek yang memberikan respons yang boleh diramal, menjadikan ujian anda lebih dipercayai dan mudah ditulis.
Ya, suntikan ketergantungan boleh digunakan dalam mana -mana projek PHP, tanpa mengira saiz atau kerumitannya. Ini adalah corak reka bentuk yang menggalakkan kebolehgunaan semula kod, modulariti, dan kesesuaian, menjadikannya alat yang berharga bagi mana -mana pemaju PHP. Boleh memperkenalkan sedikit overhead disebabkan oleh lapisan abstraksi tambahan, kesan terhadap prestasi aplikasi umumnya boleh diabaikan. Manfaat kualiti kod, kesesuaian, dan kebolehkerjaan yang lebih baik sering melebihi kos prestasi kecil.Atas ialah kandungan terperinci PHP Penanda Aras Prestasi Suntikan Ketergantungan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!