Mengapa === lebih cepat daripada == di PHP?

168

Mengapa ===lebih cepat daripada ==di PHP?

coderex
sumber
40
Ini lebih cepat, tetapi apakah itu secara signifikan lebih cepat?
Piskvor meninggalkan gedung
19
Tolong jangan membaca tentang apa yang lebih cepat di php. Baca tentang cara mendapatkan data menarik dalam kueri SQL tunggal tanpa menyalahgunakan GABUNGAN.
Kamil Szot
15
Kepada siapa mungkin tertarik pada subjek yang sama === vs ==, tetapi dalam JAVASCRIPT, dapat membaca di sini: stackoverflow.com/questions/359494/…
Marco Demaio
5
@ Patrick, bukan itu pertanyaannya
Pacerier
6
@Pacerier: Titik adil - itu sebabnya saya hanya mengomentari ini. Itu tidak menjawab pertanyaan, tetapi memberikan perspektif tentang itu.
Piskvor meninggalkan gedung

Jawaban:

200

Karena operator persamaan ==memaksa, atau mengkonversi, tipe data sementara untuk melihat apakah itu sama dengan operan lainnya, sedangkan ===(operator identitas) tidak perlu melakukan konversi apa pun dan dengan demikian lebih sedikit pekerjaan yang dilakukan, yang membuatnya lebih cepat.

meder omuraliev
sumber
Saya pikir pendapat Anda bertentangan dengan apa yang dikatakan Manual PHP. Mereka mengatakan $ a == $ b adalah TRUE jika $ a sama dengan $ b, di mana $ a === $ b adalah TRUE jika $ a sama dengan $ b, dan mereka memiliki tipe yang sama.
Bakhtiyor
92
Bagaimana itu bertentangan, kalau begitu?
meder omuraliev
2
Saya percaya sebenarnya bahwa 2 operan menunjuk ke area memori yang sama untuk tipe kompleks tetapi jawaban meder mencakup itu
Basic
1
Masuk akal (seperti halnya di JS), tapi alangkah baiknya jika seseorang menambahkan juga referensi ke beberapa tes kinerja nyata sederhana.
Marco Demaio
4
phpbench.com memiliki indikasi perbedaan kinerja antara == dan === di bawah bagian "Struktur Kontrol".
ekillaby
54

===tidak melakukan typecasting, jadi 0 == '0'dievaluasi menjadi true, tetapi 0 === '0'- untuk false.

gua
sumber
25

Pertama, === memeriksa untuk melihat apakah dua argumen adalah tipe yang sama - jadi angka 1 dan string '1' gagal pada pemeriksaan tipe sebelum perbandingan benar-benar dilakukan. Di sisi lain, == tidak memeriksa jenis terlebih dahulu dan melanjutkan dan mengonversi kedua argumen ke jenis yang sama dan kemudian melakukan perbandingan.

Karena itu, === lebih cepat dalam memeriksa kondisi gagal

iblamefish
sumber
8
Saya kira itu ==juga memeriksa jenis terlebih dahulu untuk melihat apakah konversi jenis apa pun perlu dilakukan. Fakta yang ===tidak melakukan konversi pada langkah berikut adalah apa yang membuatnya lebih cepat.
tipuan
25

Ada dua hal yang perlu dipertimbangkan:

  1. Jika jenis operan berbeda maka ==dan ===menghasilkan hasil yang berbeda . Dalam hal kecepatan operator tidak masalah; yang penting adalah mana yang menghasilkan hasil yang diinginkan.

  2. Jika jenis operan sama maka Anda dapat menggunakan salah satu ==atau ===keduanya akan menghasilkan hasil yang sama . Dalam hal ini kecepatan kedua operator hampir identik. Ini karena tidak ada konversi tipe yang dilakukan oleh salah satu operator.

Saya membandingkan kecepatan:

  • $a == $b vs. $a === $b
  • di mana $adan $bbilangan bulat acak [1, 100]
  • dua variabel dihasilkan dan dibandingkan satu juta kali
  • tes dijalankan 10 kali

Dan inilah hasilnya:

 $a == $b $a === $b
--------- ---------
 0.765770  0.762020
 0.753041  0.825965
 0.770631  0.783696
 0.787824  0.781129
 0.757506  0.796142
 0.773537  0.796734
 0.768171  0.767894
 0.747850  0.777244
 0.836462  0.826406
 0.759361  0.773971
--------- ---------
 0.772015  0.789120

Anda dapat melihat bahwa kecepatannya hampir identik.

Salman A
sumber
13
Saya bertanya-tanya apa yang terjadi jika Anda melakukan beberapa miliar iterasi pada mesin yang tidak melakukan hal lain dan hanya menampilkan rata-rata. Sepertinya ada cukup banyak suara di sini. ;)
Gung Foo
4
Saya sampai pada kesimpulan yang sama: Tidak ada perbedaan yang bisa dikacaukan jika operan diketahui dari jenis yang sama. Skenario lain tidak masuk akal. Hampir semua jawaban lain salah.
Paul Spiegel
1
Saya percaya ini seharusnya jawaban yang dipilih. Itu tidak hanya dirasionalisasi dengan asumsi, asumsi lebih bijih kurang diuji secara empiris.
Pedro Amaral Couto
@PedroAmaralCouto Saya rasa tidak, karena 10 bukan studi empiris. Alasan utama hampir tidak ada perbedaan adalah bahwa kompiler PHP mungkin akan mengoptimalkan kode. Seseorang harus menggunakan === kecuali konversi tipe diperlukan, itu akan membantu mengurangi kesalahan semantik (bahkan jika itu sekali seumur hidup Anda). Ini juga membantu orang berikutnya membaca kode aturan apa yang ditegakkan. Anda menulis sekali, itu dibaca beberapa ratus kali, jika itu dapat membantu menjernihkan keraguan satu orang, itu sudah berhasil. Juga tidak ada tes memori jika empiris, karena dikloning ke tipe yang sama. Ada lebih banyak sumber daya daripada hanya waktu.
Marco
@ Marsco, ketika saya mengatakan "studi empiris", maksud saya ini didasarkan pada pengalaman, misalnya: menjalankan kode alih-alih membuat argumen menggunakan hanya alasan (atau apa yang ada dalam pikiran Anda), tanpa percobaan untuk mendukungnya. Nilai Salman A menyarankan === kadang-kadang sedikit lebih cepat dan kadang-kadang sedikit lebih lambat. Ini berarti "Mengapa === lebih cepat daripada == di PHP?" menimbulkan pertanyaan: "Bagaimana Anda tahu === lebih cepat dari =="? Optimalisasi kompiler adalah penjelasan, bukan apa yang lebih cepat atau lebih lambat dan saya tidak mengatakan apa yang harus digunakan.
Pedro Amaral Couto
7

Saya tidak benar-benar tahu apakah itu secara signifikan lebih cepat, tetapi === dalam sebagian besar bahasa adalah perbandingan tipe langsung, sementara == akan mencoba melakukan tipe paksaan jika perlu / mungkin untuk mendapatkan kecocokan.

Chris
sumber
9
Javascript memiliki operator ===.
Frank Shearar
Saya yakin Anda bisa melakukan === dalam skema dan bahasa yang umum.
pupeno
Javascript - bukan dalam 3 definisi langauge yang saya periksa;) Dan Lisp dan Skema banyak hal, tetapi hampir tidak umum;)
TomTom
1
ruby memiliki ===. Sudah terlalu lama bagi saya untuk mengingat jika itu melakukan hal yang sama.
KitsuneYMG
1
Juga, livedocs.adobe.com/flash/9.0/ActionScriptLangRefV3/… untuk actioncript. Pada dasarnya, google "kesetaraan yang ketat".
Chris
4

The == menimbulkan konversi jenis yang lebih besar sebelum perbandingan. === pertama-tama memeriksa jenis, kemudian melanjutkan tanpa harus melakukan konversi jenis apa pun.

Martin
sumber
3

Kesimpulannya === lebih cepat karena jangan mengonversi tipe data untuk melihat apakah dua variabel memiliki nilai yang sama, tetapi ketika Anda perlu melihat apakah dua variabel memiliki nilai yang sama Anda akan menggunakan == jika tidak membuat apa jenis variabel , atau === jika penting juga jenis variabel.

D.Martin
sumber
0

Lebih cepat tidak hanya diukur dalam waktu eksekusi langsung (tes kinerja langsung hampir dapat diabaikan dalam kasus ini). Yang mengatakan, saya perlu melihat tes yang melibatkan iterasi, atau rekursi, untuk benar-benar melihat apakah ada perbedaan kumulatif yang signifikan (ketika digunakan dalam konteks yang realistis). Waktu pengujian dan debug yang akan Anda hemat saat berhadapan dengan kasus tepi juga harus berarti bagi Anda

Anthony Rutledge
sumber
0

Dalam php (kode c) nilai adalah "kelas" seperti:

class value
{
    $int_;
    $float_;
    $string_;
    $array_;
    $object_;
}

Ketika Anda membandingkan $a == $bdan $amerupakan intjenis, akan ada sesuatu seperti:

if ($a->int_ == $b->int_ || $a->int_ == (int) $b->float_ || $a->int_ == (int) $b->string_ || ...)

tetapi string '1'tidak akan dilemparkan ke kode ascii 49, itu akan menjadi1 .

Ketika Anda membandingkan $a === $bdan $amerupakan intjenis, akan ada someting seperti:

if ($a->int_ == $b->int_)
Terima kasih
sumber
-4

Jika hasil tes sudah benar, maka itu harus menjadi masalah kompiler,

Prosesor akan melakukan apa pun yang diperintahkan untuk dilakukan pada siklus clock

Jika lebih sedikit yang harus dilakukan maka akan lebih cepat dilakukan

Tambahan:

Ah, sebenarnya jika kompiler telah membuat banyak kode mesin untuk diproses, maka jika telah menambahkan banyak hal untuk mengatasi jenis data apa yang perlu diperbandingkan, maka penghapusan satu "minor" JIKA tidak akan mengubah kecepatan banyak sama sekali.

Jika ada yang masih membaca ini maka saya tertarik dalam diskusi lebih lanjut.

Phil

Phil Allen
sumber
Apakah Anda hanya memiliki "satu" pernyataan IF di basis kode Anda? Itu aneh karena di setiap basis kode yang saya kerjakan, kami memiliki ribuan IF atau pernyataan perbandingan yang dipanggil di mana-mana.
Im