奇怪的PHP引用效率问题分析_PHP
函数如下:
复制代码 代码如下:
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']
}
}
大家看出来这个函数有什么问题了没有?其实,有很大一个问题,就是函数中的:
$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']
}
大家看出来是什么问题了吗?问题就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我也是刚刚开始学习,上面的分析不一定正确,也不一定全面。大家可以在我的主页发邮件留言与我交流。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック









Windows 11 22H2 の新しいタスク マネージャーは、パワー ユーザーにとって有益です。実行中のプロセス、タスク、サービス、ハードウェア コンポーネントを監視するための追加データにより、より優れた UI エクスペリエンスが提供されるようになりました。新しいタスク マネージャーを使用している場合は、新しい生産性モードに気づいたかもしれません。それは何ですか? Windows 11 システムのパフォーマンスの向上に役立ちますか?確認してみましょう! Windows 11 の生産性モードとは何ですか?生産性モードはタスク マネージャーのタスクの 1 つです

DeepMind の AI エージェントが再び稼働します。注目してください、BBF という名前のこの男は、わずか 2 時間で 26 個の Atari ゲームをマスターしました。彼の効率は人間と同等であり、すべての先任者を上回っています。ご存知のとおり、AI エージェントは強化学習を通じて問題を解決するのに常に効果的ですが、最大の問題は、この方法が非常に非効率で、探索に長い時間がかかることです。画像 BBF によってもたらされた画期的な進歩は、効率の点にあります。フルネームが Bigger、Better、Faster と呼ばれるのも不思議ではありません。さらに、トレーニングは 1 枚のカードだけで完了でき、必要な計算能力も大幅に削減されます。 BBF は Google DeepMind とモントリオール大学によって共同提案され、データとコードは現在オープンソースです。到達可能な最高の人間

PyCharm は、コードの作成、デバッグ、プロジェクト管理のために Python 開発者によって広く使用されている強力な Python 統合開発環境 (IDE) です。実際の開発プロセスでは、ほとんどの開発者は、開発効率を向上させる方法、チームメンバーと開発にどのように協力するかなど、さまざまな問題に直面します。この記事では、開発者がリモート開発で PyCharm をより効果的に使用し、作業効率を向上させるのに役立つ、PyCharm のリモート開発の実践的なガイドを紹介します。 1. PyChでの準備作業

StableDiffusion はオープンソースの深層学習モデルで、主な機能はテキスト記述を通じて高品質な画像を生成することであり、グラフ生成、モデルの結合、モデルのトレーニングなどの機能をサポートしています。このモデルの操作インターフェイスは次の図に示されています。画像の生成方法. 以下は、水を飲む鹿の画像を作成するプロセスの紹介です. 画像を生成する際には、プロンプトワードとネガティブプロンプトワードに分けられます. プロンプトワードを入力する際には、それを説明する必要があります希望するシーン、オブジェクト、スタイル、色を明確に説明してください。たとえば、単に「鹿が水を飲む」と言うのではなく、「小川があり、鬱蒼とした木の隣にあり、その小川の隣に鹿が水を飲んでいます」と言うと、否定的なプロンプトの言葉が逆の方向になります。例:建物も人も橋も柵もありません。また、説明が曖昧すぎると不正確な結果が生じる可能性があります。

インターネットの急速な発展に伴い、データベースの重要性がますます高まっています。私たちは Java 開発者としてデータベース操作に関わることが多く、データベース トランザクション処理の効率はシステム全体のパフォーマンスと安定性に直接関係します。この記事では、データベースのトランザクション処理効率を最適化し、開発者がシステムのパフォーマンスと応答速度を向上させるために Java 開発で一般的に使用されるいくつかのテクニックを紹介します。バッチ挿入/更新操作 通常、データベースに 1 つのレコードを一度に挿入または更新する効率は、バッチ操作の効率よりも大幅に低くなります。したがって、一括挿入/更新を実行する場合、

Edge などの Chromium ベースのブラウザーは多くのリソースを使用しますが、Microsoft Edge で効率モードを有効にしてパフォーマンスを向上させることができます。 Microsoft Edge Web ブラウザーは、そのささやかな始まりから長い道のりを歩んできました。最近、Microsoft は、PC 上のブラウザの全体的なパフォーマンスを向上させるように設計された新しい効率モードをブラウザに追加しました。効率モードは、バッテリー寿命を延ばし、システム リソースの使用量を削減します。たとえば、Google Chrome や Microsoft Edge など、Chromium で構築されたブラウザは、RAM と CPU サイクルを大量に消費することで有名です。したがって、順番に

タイトル: Python は生活をより便利にします: この言語をマスターして仕事の効率と生活の質を向上させましょう 強力で学びやすいプログラミング言語として、Python は今日のデジタル時代にますます人気が高まっています。 Python は、プログラムを作成したりデータ分析を実行したりするためだけでなく、私たちの日常生活でも大きな役割を果たします。この言語をマスターすると、仕事の効率が向上するだけでなく、生活の質も向上します。この記事では、具体的なコード例を使用して、日常生活における Python の幅広い応用例を示し、読者の役に立つようにします。

サブネット マスクの役割とネットワーク通信効率への影響 はじめに: インターネットの普及により、ネットワーク通信は現代社会に不可欠な部分となっています。同時に、ネットワーク通信の効率化も注目されています。ネットワークの構築と管理のプロセスにおいて、サブネット マスクは重要かつ基本的な構成オプションであり、ネットワーク通信において重要な役割を果たします。この記事では、サブネットマスクの役割とネットワーク通信効率への影響について紹介します。 1. サブネットマスクの定義と機能 サブネットマスク(subnetmask)
