Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Perbandingan prestasi menggunakan fungsi terbina dalam PHP dan fungsi tersuai untuk menyahduplikasi tatasusunan

Perbandingan prestasi menggunakan fungsi terbina dalam PHP dan fungsi tersuai untuk menyahduplikasi tatasusunan

WBOY
WBOYasal
2024-04-26 21:09:01529semak imbas

array_unique() ialah fungsi terbina dalam dengan prestasi terbaik untuk penyahduplikasi tatasusunan. Kaedah jadual cincang mempunyai prestasi terbaik untuk fungsi tersuai Nilai cincang digunakan sebagai kunci dan nilainya kosong. Kaedah round-robin adalah mudah untuk dilaksanakan tetapi tidak cekap Adalah disyorkan untuk menggunakan fungsi terbina dalam atau tersuai untuk penduaan. array_unique() mengambil masa 0.02 saat, array_reverse + array_filter() mengambil masa 0.04 saat, kaedah jadual cincang mengambil masa 0.01 saat, dan kaedah round-robin mengambil masa 0.39 saat. . PHP menyediakan beberapa fungsi terbina dalam dan tersuai untuk melakukan ini. Artikel ini akan membandingkan prestasi fungsi ini dan memberikan contoh praktikal.

使用 PHP 内置函数和自定义函数去重数组的性能对比Fungsi terbina dalam

array_unique(): Fungsi terbina dalam, yang menggunakan jadual cincang untuk mengalih keluar pendua, yang lebih cekap. array_reverse() + array_filter(): Gunakan array_reverse() untuk membalikkan tatasusunan, dan kemudian gabungkannya dengan array_filter() Alih keluar elemen pendua.

Fungsi tersuai

Kaedah jadual cincang

: Cipta jadual cincang, kuncinya ialah nilai dalam tatasusunan dan nilainya kosong. Lelaran ke atas tatasusunan, menambah setiap nilai pada jadual cincang. Tatasusunan nyahduplikasi ialah kunci jadual cincang.
  • Kaedah gelungarray_unique():内置函数,通过 哈希表 进行去重,效率较高。
  • array_reverse() + array_filter():使用 array_reverse() 逆序数组,然后结合 array_filter() 移除重复元素。

自定义函数

  • 哈希表法:创建一个哈希表,键为数组中的值,值为空。遍历数组,将每个值添加到哈希表。去重后的数组就是哈希表的键。
  • 循环法:使用两个指针遍历数组。指针 1 负责外层循环,指针 2 负责内层循环。如果外层指针的值不在内层指针的值中,则将该值添加到结果数组中。

实战案例

假设我们有一个包含 100 万个整数的数组 $array

$array = range(1, 1000000);
$iterations = 100;

性能测试

function test_array_unique($array, $iterations) {
  $total_time = 0;
  for ($i = 0; $i < $iterations; $i++) {
    $start_time = microtime(true);
    $result = array_unique($array);
    $end_time = microtime(true);
    $total_time += $end_time - $start_time;
  }
  $avg_time = $total_time / $iterations;
  echo "array_unique: $avg_time seconds\n";
}

function test_array_reverse_array_filter($array, $iterations) {
  $total_time = 0;
  for ($i = 0; $i < $iterations; $i++) {
    $start_time = microtime(true);
    $result = array_filter(array_reverse($array), 'array_unique');
    $end_time = microtime(true);
    $total_time += $end_time - $start_time;
  }
  $avg_time = $total_time / $iterations;
  echo "array_reverse + array_filter: $avg_time seconds\n";
}

function test_hash_table($array, $iterations) {
  $total_time = 0;
  for ($i = 0; $i < $iterations; $i++) {
    $start_time = microtime(true);
    $result = array_values(array_filter($array, function ($value) {
      static $hash_table = [];
      if (isset($hash_table[$value])) {
        return false;
      }
      $hash_table[$value] = true;
      return true;
    }));
    $end_time = microtime(true);
    $total_time += $end_time - $start_time;
  }
  $avg_time = $total_time / $iterations;
  echo "hash table: $avg_time seconds\n";
}

function test_loop($array, $iterations) {
  $total_time = 0;
  for ($i = 0; $i < $iterations; $i++) {
    $start_time = microtime(true);
    $result = array_values(array_filter($array, function ($value) use (&$array) {
      for ($j = 0; $j < count($array); $j++) {
        if ($j == $i) {
          continue;
        }
        if ($value == $array[$j]) {
          return false;
        }
      }
      return true;
    }));
    $end_time = microtime(true);
    $total_time += $end_time - $start_time;
  }
  $avg_time = $total_time / $iterations;
  echo "loop: $avg_time seconds\n";
}

test_array_unique($array, $iterations);
test_array_reverse_array_filter($array, $iterations);
test_hash_table($array, $iterations);
test_loop($array, $iterations);

结果

使用 100 万个整数的数组,每个函数的平均运行时间如下:

  • array_unique:0.02 秒
  • array_reverse + array_filter:0.04 秒
  • 哈希表法:0.01 秒
  • 循环法:0.39 秒

结论

根据测试结果,array_unique() 是去重数组最快的内置函数,而哈希表法是性能最优的自定义函数。循环法虽然容易实现,但效率较低。在处理大型数组时,建议采用 array_unique(): Gunakan dua penunjuk untuk melintasi tatasusunan. Penunjuk 1 bertanggungjawab untuk gelung luar, dan penunjuk 2 bertanggungjawab untuk gelung dalam. Jika nilai penuding luar tidak berada dalam nilai penuding dalam, nilai itu ditambahkan pada tatasusunan hasil.

🎜Kes praktikal🎜🎜🎜Andaikan kita mempunyai tatasusunan $array yang mengandungi 1 juta integer. 🎜rrreee🎜🎜Ujian prestasi🎜🎜rrreee🎜🎜Keputusan🎜🎜🎜Menggunakan tatasusunan 1 juta integer, purata masa berjalan bagi setiap fungsi adalah seperti berikut: 🎜array 🎜🎜array_02:array_02 : 0.04 saat 🎜Kaedah jadual cincang: 0.01 saat🎜Kaedah gelung: 0.39 saat🎜🎜Kesimpulan🎜🎜🎜Mengikut keputusan ujian, array_unique() Ia adalah fungsi terbina dalam terpantas untuk menyahduplikasi tatasusunan, manakala kaedah jadual cincang ialah fungsi tersuai dengan prestasi terbaik. Walaupun kaedah round-robin mudah dilaksanakan, ia kurang cekap. Apabila berurusan dengan tatasusunan yang besar, adalah disyorkan untuk menggunakan array_unique() atau kaedah jadual cincang untuk penduaan. 🎜

Atas ialah kandungan terperinci Perbandingan prestasi menggunakan fungsi terbina dalam PHP dan fungsi tersuai untuk menyahduplikasi tatasusunan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
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