首頁 後端開發 php教程 奇怪的PHP引用效率问题分析_PHP

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

Jun 01, 2016 pm 12:13 PM
效率

函数如下:
复制代码 代码如下:
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我也是刚刚开始学习,上面的分析不一定正确,也不一定全面。大家可以在我的主页发邮件留言与我交流。

本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn

熱AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover

AI Clothes Remover

用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool

Undress AI Tool

免費脫衣圖片

Clothoff.io

Clothoff.io

AI脫衣器

Video Face Swap

Video Face Swap

使用我們完全免費的人工智慧換臉工具,輕鬆在任何影片中換臉!

熱工具

記事本++7.3.1

記事本++7.3.1

好用且免費的程式碼編輯器

SublimeText3漢化版

SublimeText3漢化版

中文版,非常好用

禪工作室 13.0.1

禪工作室 13.0.1

強大的PHP整合開發環境

Dreamweaver CS6

Dreamweaver CS6

視覺化網頁開發工具

SublimeText3 Mac版

SublimeText3 Mac版

神級程式碼編輯軟體(SublimeText3)

如何在 Windows 11 中為應用程式或進程開啟或關閉效率模式 如何在 Windows 11 中為應用程式或進程開啟或關閉效率模式 Apr 14, 2023 pm 09:46 PM

Windows 11 22H2中的新工作管理員對進階使用者來說是個福音。現在,它透過附加資料提供更好的 UI 體驗,以密切關注您正在運行的流程、任務、服務和硬體元件。如果您一直在使用新的任務管理器,那麼您可能已經注意到新的效率模式。它是什麼?它是否有助於提高 Windows 11 系統的效能?讓我們來了解一下! Windows 11 中的效率模式是什麼?效率模式是任務管理器中的一

兩小時就能超過人類! DeepMind最新AI速通26款雅達利遊戲 兩小時就能超過人類! DeepMind最新AI速通26款雅達利遊戲 Jul 03, 2023 pm 08:57 PM

DeepMind的AI智能體,又來捲自己了!注意看,這個名叫BBF的傢伙,只用2個小時,就掌握了26款雅達利遊戲,效率和人類相當,超越了自己一眾前輩。要知道,AI智能體透過強化學習解決問題的效果一直都不錯,但最大的問題就在於這種方式效率很低,需要很長時間摸索。圖片而BBF帶來的突破正是在效率方面。怪不得它的全名可以叫Bigger、Better、Faster。而且它還能只在單卡上完成訓練,算力要求也降低許多。 BBF由GoogleDeepMind和蒙特婁大學共同提出,目前資料和程式碼都已開源。最高可取得人類

PyCharm遠端開發實用指南:提高開發效率 PyCharm遠端開發實用指南:提高開發效率 Feb 23, 2024 pm 01:30 PM

PyCharm是一款功能強大的Python整合開發環境(IDE),廣泛用於Python開發者進行程式碼編寫、除錯和專案管理。在實際的開發過程中,大多數開發者都會面臨不同的問題,例如如何提升開發效率、如何與團隊成員進行協作開發等。本文將介紹PyCharm遠端開發的實用指南,幫助開發者更好地利用PyCharm進行遠端開發,並提高工作效率。 1.準備工作在進行PyCh

Java開發技巧大揭密:優化資料庫事務處理效率 Java開發技巧大揭密:優化資料庫事務處理效率 Nov 20, 2023 pm 03:13 PM

隨著網路的快速發展,資料庫的重要性日益凸顯。身為Java開發者,我們經常涉及資料庫操作,資料庫事務處理的效率直接關係到整個系統的效能和穩定性。本文將介紹一些Java開發中常用的最佳化資料庫事務處理效率的技巧,幫助開發者提升系統的效能和回應速度。在批次插入/更新操作通常情況下,一次插入或更新單一記錄到資料庫的效率遠低於批次操作。因此,在進行批量插入/更

如何在 Microsoft Edge 中開啟節能模式? 如何在 Microsoft Edge 中開啟節能模式? Apr 20, 2023 pm 08:22 PM

Edge等基於Chromium的瀏覽器會佔用很多資源,但您可以在MicrosoftEdge中啟用效率模式以提高效能。 MicrosoftEdge網頁瀏覽器自其不起眼的開始以來已經走過了漫長的道路。最近,微軟為瀏覽器添加了一種新的效率模式,旨在提高瀏覽器在PC上的整體效能。效率模式有助於延長電池壽命並減少系統資源使用。例如,使用Chromium建構的瀏覽器(如GoogleChrome和MicrosoftEdge)因佔用RAM和CPU週期而臭名昭著。因此,為了

私有化部署 Stable Diffusion 玩 AI 繪圖 私有化部署 Stable Diffusion 玩 AI 繪圖 Mar 12, 2024 pm 05:49 PM

StableDiffusion是一個開源的深度學習模型,其主要功能是透過文字描述來產生高品質的圖像,並支援圖生成、模型合併、以及模型訓練等功能。此模型的操作介面可以在下圖中看到。如何生圖下面介紹一下小鹿喝水的生圖過程,生成圖的時候分為提示詞和負面提示詞,輸入提示詞的時候要明確描述,盡量具體描述你想要的場景、對象、風格和顏色。例如,不僅僅說“小鹿喝水”,而是說“一條小溪,旁邊是茂密的樹,小溪旁有小鹿在喝水”,負面提示詞是反方向的例如:無建築物、無人物、無橋樑、無圍欄,而過於模糊的描述可能導致結果不

掌握Python,提升工作效率與生活品質 掌握Python,提升工作效率與生活品質 Feb 18, 2024 pm 05:57 PM

標題:Python讓生活更方便:掌握這門語言,提升工作效率和生活品質Python作為一種強大而簡單易學的程式語言,在當今的數位時代越來越受到人們的青睞。不僅用於編寫程式和進行數據分析,Python還可以在我們的日常生活中發揮巨大的作用。掌握這門語言,不僅能提升工作效率,還能提升生活品質。本文將透過具體的程式碼範例,展示Python在生活中的廣泛應用,幫助閱讀

子網路遮罩:作用與網路通訊效率的影響 子網路遮罩:作用與網路通訊效率的影響 Dec 26, 2023 pm 04:28 PM

子網路遮罩的角色及其對網路通訊效率的影響引言:隨著網路的普及,網路通訊成為現代社會不可或缺的一部分。同時,網路通訊的效率也成為了人們關注的焦點之一。在建置和管理網路的過程中,子網路遮罩是一項重要且基礎的配置選項,它在網路通訊中起著關鍵的作用。本文將介紹子網路遮罩的作用,以及它對網路通訊效率的影響。一、子網路遮罩的定義及作用子網路遮罩(subnetmask)

See all articles