Rumah pembangunan bahagian belakang tutorial php 奇怪的PHP引用效率问题分析_PHP

奇怪的PHP引用效率问题分析_PHP

Jun 01, 2016 pm 12:13 PM
kecekapan

函数如下:
复制代码 代码如下:
function update_timelist(&$arr,$timestamp,$threshold){
$timequeue = &$arr['timequeue'];
while(!empty($timequeue[0])&&($timestamp-$timequeue[0])>$threshold){
array_shift($timequeue);
}
array_push($timequeue, $timestamp);
if($arr['count']$arr['count'] = count($timequeue);
}
}

大家看出来这个函数有什么问题了没有?其实,有很大一个问题,就是函数中的:

$timequeue = &$arr['timequeue'];

这一行导致程序读入22M数据并生成时间节点链表用了接近40秒,而删掉该行改成直接使用$arr['timequeue']时间就缩短了30秒,只需要10秒左右就处理完了22M。
复制代码 代码如下:
function update_timelist(&$arr,$timestamp,$threshold){
while(!empty($arr['timequeue'][0])&&($timestamp-$arr['timequeue'][0])>$threshold){
array_shift($arr['timequeue']);
}
array_push($arr['timequeue'], $timestamp);
if($arr['count']$arr['count'] = count($arr['timequeue']);
}

大家看出来是什么问题了吗?问题就count函数上,没有想到吧。PHP将变量指向的真正的内容空间标记为了引用类型和非引用类型,像下面的代码:
复制代码 代码如下:
$a = 'bitsCN.com';
$b = $a;
$c = $b;

实际占用内存空间只有一份,因为PHP的zend引擎使用copy on writing的机制,只在$b,$c修改的时候才会复制一份'bitsCN.com'过来,此时'bitsCN.com'的内容空间类型为非引用类型,如果改为下面的代码:
复制代码 代码如下:
$a = 'bitsCN.com';
$b = $a;
$c = &$a;

这个会有什么变化?仍然是一份内存空间存放'bitsCN.com'吗?不是,因为$c为$a的引用,$a的指向的存储空间需要标记为引用类型,那么必须为$b单独复制一份'bitsCN.com'才行了,因为$b指向的是非引用类型。
我们可以这样理解,$c现在是$a的引用了,如果$b仍然执行$a的空间那么修改$c将导致$b也修改,所以此时一旦出现引用即使没有写操作也必须复制一份了。也可以这样理解,php对变量指向的内存空间只有非引用和引用两种类型,两种类型不能混合,不能转移。如果什么地方需要改变内存空间的状态则需要copy一份了。
下面就说明为什么多了$timequeue = &$arr['timequeue']会导致count变慢,还记得c函数的调用过程吗?实际我们传入的参数需要copy一份拷贝传入,php也一样,但是由于copy on writing机制使得count在传入非引用类型时是不会真正copy的,但是$timequeue = &$arr['timequeue']将$timequeue的内存空间指定为了引用类型,而count需要非引用类型,这样就导致count需要copy一份$arr['timequeue']了。直接传入$arr['timequeue']为什么没有问题?count当然是用了copy on writing的机制,array_shift和array_push呢?他们是传入的引用啊,不用担心这不是修改了$arr['timequeue']的类型而是真正的传入了$arr['timequeue']的一个别名。

对于PHP我也是刚刚开始学习,上面的分析不一定正确,也不一定全面。大家可以在我的主页发邮件留言与我交流。

Kenyataan Laman Web ini
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

Alat AI Hot

Undresser.AI Undress

Undresser.AI Undress

Apl berkuasa AI untuk mencipta foto bogel yang realistik

AI Clothes Remover

AI Clothes Remover

Alat AI dalam talian untuk mengeluarkan pakaian daripada foto.

Undress AI Tool

Undress AI Tool

Gambar buka pakaian secara percuma

Clothoff.io

Clothoff.io

Penyingkiran pakaian AI

Video Face Swap

Video Face Swap

Tukar muka dalam mana-mana video dengan mudah menggunakan alat tukar muka AI percuma kami!

Alat panas

Notepad++7.3.1

Notepad++7.3.1

Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina

SublimeText3 versi Cina

Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1

Hantar Studio 13.0.1

Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6

Dreamweaver CS6

Alat pembangunan web visual

SublimeText3 versi Mac

SublimeText3 versi Mac

Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Cara menghidupkan atau mematikan mod produktiviti untuk apl atau proses dalam Windows 11 Cara menghidupkan atau mematikan mod produktiviti untuk apl atau proses dalam Windows 11 Apr 14, 2023 pm 09:46 PM

Pengurus Tugas baharu dalam Windows 11 22H2 adalah rahmat untuk pengguna berkuasa. Ia kini menyediakan pengalaman UI yang lebih baik dengan data tambahan untuk memantau proses, tugas, perkhidmatan dan komponen perkakasan anda yang sedang berjalan. Jika anda telah menggunakan Pengurus Tugas baharu, anda mungkin perasan mod produktiviti baharu. apa itu? Adakah ia membantu meningkatkan prestasi sistem Windows 11? Mari ketahui! Apakah Mod Produktiviti dalam Windows 11? Mod produktiviti ialah salah satu tugas dalam Pengurus Tugas

Dia boleh mengatasi manusia dalam masa dua jam! Kelajuan AI terbaharu DeepMind menjalankan 26 permainan Atari Dia boleh mengatasi manusia dalam masa dua jam! Kelajuan AI terbaharu DeepMind menjalankan 26 permainan Atari Jul 03, 2023 pm 08:57 PM

Ejen AI DeepMind sedang bekerja semula! Perhatikan, lelaki bernama BBF ini menguasai 26 permainan Atari dalam masa 2 jam sahaja kecekapannya setara dengan manusia, mengatasi semua pendahulunya. Anda tahu, ejen AI sentiasa berkesan dalam menyelesaikan masalah melalui pembelajaran pengukuhan, tetapi masalah terbesar ialah kaedah ini sangat tidak cekap dan memerlukan masa yang lama untuk diterokai. Gambar Kejayaan yang dibawa oleh BBF adalah dari segi kecekapan. Tidak hairanlah nama penuhnya boleh dipanggil Bigger, Better, atau Faster. Selain itu, ia boleh melengkapkan latihan hanya pada satu kad, dan keperluan kuasa pengkomputeran juga jauh berkurangan. BBF telah dicadangkan bersama oleh Google DeepMind dan Universiti Montreal, dan data serta kod tersebut pada masa ini adalah sumber terbuka. Manusia tertinggi yang boleh dicapai

Panduan Praktikal Pembangunan Jauh PyCharm: Tingkatkan Kecekapan Pembangunan Panduan Praktikal Pembangunan Jauh PyCharm: Tingkatkan Kecekapan Pembangunan Feb 23, 2024 pm 01:30 PM

PyCharm ialah persekitaran pembangunan bersepadu (IDE) Python yang berkuasa yang digunakan secara meluas oleh pembangun Python untuk penulisan kod, penyahpepijatan dan pengurusan projek. Dalam proses pembangunan sebenar, kebanyakan pembangun akan menghadapi masalah yang berbeza, seperti cara meningkatkan kecekapan pembangunan, cara bekerjasama dengan ahli pasukan dalam pembangunan, dsb. Artikel ini akan memperkenalkan panduan praktikal untuk pembangunan jauh PyCharm untuk membantu pembangun menggunakan PyCharm dengan lebih baik untuk pembangunan jauh dan meningkatkan kecekapan kerja. 1. Kerja penyediaan dalam PyCh

Penggunaan peribadi Stable Diffusion untuk bermain dengan lukisan AI Penggunaan peribadi Stable Diffusion untuk bermain dengan lukisan AI Mar 12, 2024 pm 05:49 PM

StableDiffusion ialah model pembelajaran dalam sumber terbuka Fungsi utamanya adalah untuk menjana imej berkualiti tinggi melalui penerangan teks, dan menyokong fungsi seperti penjanaan graf, penggabungan model dan latihan model. Antara muka operasi model boleh dilihat dalam rajah di bawah. Bagaimana untuk menghasilkan gambar. Berikut adalah pengenalan kepada proses membuat gambar air minuman rusa Apabila menghasilkan gambar, ia dibahagikan kepada kata gesaan dan kata gesaan negatif jelas dan cuba terangkan pemandangan, objek, gaya dan warna yang anda inginkan secara terperinci. Sebagai contoh, daripada hanya mengatakan "rusa minum air", ia berkata "sebatang sungai, di sebelah pokok yang lebat, dan terdapat rusa minum air di sebelah anak sungai". tiada bangunan, tiada orang , tiada jambatan, tiada pagar, dan penerangan yang terlalu kabur boleh membawa kepada keputusan yang tidak konsisten.

Kemahiran pembangunan Java didedahkan: Mengoptimumkan kecekapan pemprosesan transaksi pangkalan data Kemahiran pembangunan Java didedahkan: Mengoptimumkan kecekapan pemprosesan transaksi pangkalan data Nov 20, 2023 pm 03:13 PM

Dengan perkembangan pesat Internet, kepentingan pangkalan data telah menjadi semakin menonjol. Sebagai pembangun Java, kami sering melibatkan operasi pangkalan data Kecekapan pemprosesan transaksi pangkalan data berkaitan secara langsung dengan prestasi dan kestabilan keseluruhan sistem. Artikel ini akan memperkenalkan beberapa teknik yang biasa digunakan dalam pembangunan Java untuk mengoptimumkan kecekapan pemprosesan transaksi pangkalan data untuk membantu pembangun meningkatkan prestasi sistem dan kelajuan tindak balas. Operasi sisipan/kemas kini kelompok Biasanya, kecekapan memasukkan atau mengemas kini satu rekod ke dalam pangkalan data pada satu masa adalah jauh lebih rendah daripada operasi kelompok. Oleh itu, apabila melakukan sisipan/kemas kini kelompok

Bagaimana untuk menghidupkan mod penjimatan kuasa dalam Microsoft Edge? Bagaimana untuk menghidupkan mod penjimatan kuasa dalam Microsoft Edge? Apr 20, 2023 pm 08:22 PM

Penyemak imbas berasaskan Chromium seperti Edge menggunakan banyak sumber, tetapi anda boleh mendayakan mod kecekapan dalam Microsoft Edge untuk meningkatkan prestasi. Penyemak imbas web Microsoft Edge telah berjalan jauh sejak permulaannya yang sederhana. Baru-baru ini, Microsoft menambah mod kecekapan baharu pada penyemak imbas, yang direka untuk meningkatkan prestasi keseluruhan penyemak imbas pada PC. Mod kecekapan membantu memanjangkan hayat bateri dan mengurangkan penggunaan sumber sistem. Sebagai contoh, penyemak imbas yang dibina dengan Chromium, seperti Google Chrome dan Microsoft Edge, terkenal kerana memonopoli kitaran RAM dan CPU. Oleh itu, mengikut urutan

Kuasai Python untuk meningkatkan kecekapan kerja dan kualiti hidup Kuasai Python untuk meningkatkan kecekapan kerja dan kualiti hidup Feb 18, 2024 pm 05:57 PM

Tajuk: Python menjadikan kehidupan lebih mudah: Kuasai bahasa ini untuk meningkatkan kecekapan kerja dan kualiti hidup Sebagai bahasa pengaturcaraan yang berkuasa dan mudah dipelajari, Python semakin popular dalam era digital hari ini. Bukan hanya untuk menulis program dan melakukan analisis data, Python juga boleh memainkan peranan yang besar dalam kehidupan seharian kita. Menguasai bahasa ini bukan sahaja dapat meningkatkan kecekapan kerja, tetapi juga meningkatkan kualiti hidup. Artikel ini akan menggunakan contoh kod khusus untuk menunjukkan aplikasi Python yang luas dalam kehidupan dan membantu pembaca

Subnet mask: peranan dan kesan ke atas kecekapan komunikasi rangkaian Subnet mask: peranan dan kesan ke atas kecekapan komunikasi rangkaian Dec 26, 2023 pm 04:28 PM

Peranan subnet mask dan kesannya terhadap kecekapan komunikasi rangkaian Pengenalan: Dengan populariti Internet, komunikasi rangkaian telah menjadi bahagian yang amat diperlukan dalam masyarakat moden. Pada masa yang sama, kecekapan komunikasi rangkaian juga menjadi salah satu tumpuan perhatian orang ramai. Dalam proses membina dan mengurus rangkaian, subnet mask ialah pilihan konfigurasi yang penting dan asas, yang memainkan peranan penting dalam komunikasi rangkaian. Artikel ini akan memperkenalkan peranan topeng subnet dan kesannya terhadap kecekapan komunikasi rangkaian. 1. Definisi dan fungsi subnet mask Subnet mask (subnetmask)

See all articles