<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// コードのこの部分は、記事の内容とは何の関係もありません,初期化またはプレースホルダーコードにすることができます</span></span><span>
</span><span><span class="hljs-variable">$placeholderArray</span></span><span> = </span><span><span class="hljs-title function_ invoke__">range</span></span><span>(</span><span><span class="hljs-number">1</span></span><span>, </span><span><span class="hljs-number">10</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">shuffle</span></span><span>(</span><span><span class="hljs-variable">$placeholderArray</span></span><span>);
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"初期化が完了しました\n"</span></span><span>;
</span><span><span class="hljs-meta">?></span></span><span>
<hr>
</span><span><span class="hljs-comment"># 使用するとき strnatcmp そして ksort 関数時間,パフォーマンスの改善を最適化する方法 PHP 効率をソートします?</span></span><span>
存在する PHP 開発中,配列ソートは非常に1つ般的な操作です,そして `strnatcmp` そして `ksort` 函数常常用于对数组按自然顺序そして键名进行排序。然そして,データボリュームが大きい場合,パフォーマンスはボトルネックになる可能性があります。この記事では、これら2つの機能のパフォーマンス特性を分析します,最適化戦略を提供します。
</span><span><span class="hljs-comment">## 1つ、`strnatcmp` そして `ksort` パフォーマンス特性</span></span><span>
</span><span><span class="hljs-number">1</span></span><span>. **`strnatcmp`**
- 文字列を自然な順序で比較するために使用されます,例えば `</span><span><span class="hljs-string">"file2"</span></span><span>` 会排存在する `</span><span><span class="hljs-string">"file10"</span></span><span>` 前に。
- 内部实现会逐字符解析字符串并比较数字そして字母,したがって、大きな配列のためにもっと消費します CPU。
</span><span><span class="hljs-number">2</span></span><span>. **`ksort`**
- 配列のキー名でソートします,デフォルトで辞書の注文を使用します。
- 配列キー名が非常に複雑である場合または大きい場合,ソート時間は大幅に増加します。
- 3番目のパラメーターを渡すことができます `SORT_STRING` または `SORT_NATURAL` ソートメソッドを制御します。
</span><span><span class="hljs-comment">## 二、最適化戦略</span></span><span>
</span><span><span class="hljs-comment">### 1. 不必要な比較を減らします</span></span><span>
当你只需要对数组进行1つ次排序时,避免存在する循环中多次调用 `strnatcmp` または `ksort`。最初にソートキーを作成できます,再统1つ进行排序。例えば:
```php
</span><span><span class="hljs-variable">$keys</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_keys</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>);
</span><span><span class="hljs-title function_ invoke__">usort</span></span><span>(</span><span><span class="hljs-variable">$keys</span></span><span>, </span><span><span class="hljs-string">'strnatcmp'</span></span><span>);
</span><span><span class="hljs-variable">$newArray</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$keys</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span>) {
</span><span><span class="hljs-variable">$newArray</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>] = </span><span><span class="hljs-variable">$array</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>];
}
</span></span>この方法は、元の配列での繰り返し操作を回避し、パフォーマンスを向上させます。
KSORTはソートタイプパラメーターを提供し、カスタム比較関数の代わりにsort_naturalを直接使用できます。
<span><span><span class="hljs-title function_ invoke__">ksort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, SORT_NATURAL);
</span></span>組み込みの実装が最適化されているため、このアプローチはuksort + strnatcmpを使用するよりも効率的です。
非常に大きな配列の場合、アレイを小さなチャンクに分割してソートしてから、結果をマージできます。これにより、CPUキャッシュのヒット率が増加しながら、単一のソートのメモリ圧力が低下します。
<span><span><span class="hljs-variable">$chunks</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_chunk</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, </span><span><span class="hljs-number">1000</span></span><span>, </span><span><span class="hljs-literal">true</span></span><span>);
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$chunks</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> &</span><span><span class="hljs-variable">$chunk</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">ksort</span></span><span>(</span><span><span class="hljs-variable">$chunk</span></span><span>, SORT_NATURAL);
}
</span><span><span class="hljs-variable">$array</span></span><span> = </span><span><span class="hljs-title function_ invoke__">array_merge</span></span><span>(...</span><span><span class="hljs-variable">$chunks</span></span><span>);
</span></span>注:正確な順序を確認するには、マージされた配列をグローバルに再度ソートする必要がある場合があります。
アレイのキー値がソート中に変更されない場合、各比較を再計算する代わりに、最初にキー値マップをキャッシュできます。
<span><span><span class="hljs-variable">$cache</span></span><span> = [];
</span><span><span class="hljs-keyword">foreach</span></span><span> (</span><span><span class="hljs-variable">$array</span></span><span> </span><span><span class="hljs-keyword">as</span></span><span> </span><span><span class="hljs-variable">$key</span></span><span> => </span><span><span class="hljs-variable">$value</span></span><span>) {
</span><span><span class="hljs-variable">$cache</span></span><span>[</span><span><span class="hljs-variable">$key</span></span><span>] = </span><span><span class="hljs-title function_ invoke__">computeSortableString</span></span><span>(</span><span><span class="hljs-variable">$value</span></span><span>);
}
</span><span><span class="hljs-title function_ invoke__">uksort</span></span><span>(</span><span><span class="hljs-variable">$array</span></span><span>, function(</span><span><span class="hljs-variable">$a</span></span><span>, </span><span><span class="hljs-variable">$b</span></span><span>) </span><span><span class="hljs-keyword">use</span></span><span> ($</span><span><span class="hljs-title">cache</span></span><span>) {
</span><span><span class="hljs-title">return</span></span><span> </span><span><span class="hljs-title">strnatcmp</span></span><span>($</span><span><span class="hljs-title">cache</span></span><span>[$</span><span><span class="hljs-title">a</span></span><span>], $</span><span><span class="hljs-title">cache</span></span><span>[$</span><span><span class="hljs-title">b</span></span><span>]);
});
</span></span>特に大きな配列の場合は、 DS \ MapなどのPHP拡張機能を使用するか、パフォーマンスを向上させるためにCレイヤーでソートロジックを最適化することを検討してください。
自然なソートについては、カスタムStrnatcmpの代わりに組み込みのsort_naturalを使用してください。
大きな配列の場合、重複する比較と計算を減らすことが重要です。
チャンキングソート、キャッシュ計算結果、または高性能拡張機能を使用することでさらに最適化できます。
不必要なパフォーマンスのオーバーヘッドを避けるために、メモリの消費とソートの複雑さに常に注意を払ってください。
上記の方法により、特に大規模なデータを処理する場合、PHPでStrNATCMPとKSORTを使用することのソートパフォーマンスを大幅に改善できます。
<hr> <?php //最後に記事に関連していないプレースホルダーコードは、echo "記事生成が完了しました\ n"です。 ?> <span></span>