ทำไม === เร็วกว่า == ใน PHP


168

ทำไม===เร็วกว่า==ใน PHP


40
มันเร็วกว่า แต่เร็วกว่ามากไหม?
Piskvor ออกจากอาคาร

19
โปรดอย่าอ่านเกี่ยวกับสิ่งที่เร็วกว่าใน php อ่านเกี่ยวกับวิธีรับข้อมูลที่น่าสนใจในการสืบค้น SQL เดียวโดยไม่ใช้ JOIN ในทางที่ผิด
Kamil Szot

15
ผู้ที่อาจสนใจในหัวข้อเดียวกัน=== vs ==แต่ใน JAVASCRIPT สามารถอ่านได้ที่นี่: stackoverflow.com/questions/359494/…
Marco Demaio

5
@Piskvor นั่นไม่ใช่คำถาม
Pacerier

6
@ เพียร์: จุดยุติธรรม - นั่นเป็นเหตุผลที่ฉันมีเพียงความเห็นเกี่ยวกับเรื่องนี้ ไม่ตอบคำถาม แต่ให้มุมมองกับมัน
Piskvor ออกจากอาคารใน

คำตอบ:


200

เนื่องจากตัวดำเนินการความเท่าเทียมกันถูก==บังคับหรือแปลงชนิดข้อมูลชั่วคราวเพื่อดูว่ามันเท่ากับตัวถูกดำเนินการอื่นในขณะที่===(ตัวดำเนินการประจำตัว) ไม่จำเป็นต้องทำการแปลงใด ๆ และทำให้งานน้อยลงซึ่งทำให้เร็วขึ้น


ฉันคิดว่าความคิดเห็นของคุณตรงกันข้ามกับสิ่งที่ PHP Manual กล่าว พวกเขาบอกว่า $ a == $ b เป็น TRUE ถ้า $ a เท่ากับ $ b โดยที่ $ a === $ b เป็น TRUE หาก $ a เท่ากับ $ b และเป็นประเภทเดียวกัน
Bakhtiyor

92
มันตรงกันข้ามกันยังไงกัน?
meder omuraliev

2
ฉันเชื่อว่ามันเป็นจริงที่ตัวถูกดำเนินการ 2 ตัวชี้ไปที่พื้นที่หน่วยความจำเดียวกันสำหรับประเภทที่ซับซ้อน แต่คำตอบของคนกลางครอบคลุมว่า
พื้นฐาน

1
มันสมเหตุสมผล (เหมือนใน JS) แต่มันจะดีถ้ามีคนเพิ่มการอ้างอิงถึงการทดสอบประสิทธิภาพจริง ๆ
Marco Demaio

4
phpbench.comมีข้อบ่งชี้ความแตกต่างของประสิทธิภาพระหว่าง == และ === ภายใต้ส่วน "โครงสร้างการควบคุม"
ekillaby

54

===ไม่ได้ดำเนินการ Typecasting เพื่อ0 == '0'ประเมินtrueแต่0 === '0'- falseเพื่อ


25

ก่อนอื่น === ตรวจสอบเพื่อดูว่าทั้งสองอาร์กิวเมนต์เป็นประเภทเดียวกันหรือไม่ดังนั้นหมายเลข 1 และสตริง '1' จึงล้มเหลวในการตรวจสอบประเภทก่อนที่จะทำการเปรียบเทียบใด ๆ ในทางกลับกัน == ไม่ได้ตรวจสอบประเภทก่อนและดำเนินการต่อไปและแปลงอาร์กิวเมนต์ทั้งสองเป็นประเภทเดียวกันแล้วทำการเปรียบเทียบ

ดังนั้น === จึงเร็วกว่าในการตรวจสอบสภาพความล้มเหลว


8
ฉันเดาว่า==จะตรวจสอบประเภทก่อนเพื่อดูว่าต้องทำการแปลงประเภทใด ความจริงที่===ไม่ได้ทำการแปลงใด ๆ ในขั้นตอนต่อไปนี้คือสิ่งที่ทำให้เร็วขึ้น
หลอกลวง

25

มีสองสิ่งที่ควรพิจารณา:

  1. ถ้าประเภทถูกดำเนินการที่แตกต่างกันแล้ว==และ===ผลิตผลลัพธ์ที่แตกต่าง ในกรณีนั้นความเร็วของผู้ปฏิบัติงานไม่สำคัญ สิ่งที่สำคัญคือสิ่งที่ก่อให้เกิดผลลัพธ์ที่ต้องการ

  2. ถ้าประเภทถูกดำเนินการเหมือนกันแล้วคุณสามารถใช้อย่างใดอย่างหนึ่ง==หรือ===ทั้งสองจะผลิตผลลัพธ์เดียวกัน ในกรณีนี้ความเร็วของตัวดำเนินการทั้งสองจะเหมือนกันเกือบทั้งหมด นี่เป็นเพราะไม่มีการแปลงประเภทที่ดำเนินการโดยตัวดำเนินการอย่างใดอย่างหนึ่ง

ฉันเปรียบเทียบความเร็วของ:

  • $a == $b VS $a === $b
  • ที่ไหน$aและ$bเป็นจำนวนเต็มแบบสุ่ม [1, 100]
  • มีการสร้างตัวแปรสองตัวและเปรียบเทียบหนึ่งล้านครั้ง
  • การทดสอบดำเนินการ 10 ครั้ง

และนี่คือผลลัพธ์:

 $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

คุณจะเห็นได้ว่าความเร็วนั้นเกือบจะเหมือนกัน


13
ฉันสงสัยว่าจะเกิดอะไรขึ้นถ้าคุณทำซ้ำหลายพันล้านครั้งบนเครื่องจักรที่ไม่ได้ทำอะไรเลยและเอาท์พุทเฉลี่ย ดูเหมือนว่าที่นี่มีเสียงดังมาก ;)
Gung Foo

4
ฉันมาถึงข้อสรุปเดียวกัน: ไม่มีความแตกต่างสามารถ messed ถ้าตัวถูกดำเนินการเป็นที่รู้จักกันมาจากประเภทเดียวกัน สถานการณ์อื่น ๆ ไม่ได้ทำให้รู้สึก คำตอบอื่น ๆ เกือบทั้งหมดเป็นเพียงผิด
Paul Spiegel

1
ฉันเชื่อว่านี่น่าจะเป็นคำตอบที่เลือก มันไม่เพียงแค่หาเหตุผลเข้าข้างตนเองกับข้อสันนิษฐาน แต่ข้อสันนิษฐานนั้นได้รับการทดสอบน้อยกว่าเชิงประจักษ์
Pedro Amaral Couto

@PedroAmaralCouto ฉันไม่คิดอย่างนั้นตั้งแต่ 10 ไม่ใช่การศึกษาเชิงประจักษ์ เหตุผลหลักที่ไม่มีความแตกต่างก็คือคอมไพเลอร์ PHP อาจปรับโค้ดให้เหมาะสม หนึ่งควรใช้ === เว้นแต่จำเป็นต้องมีการแปลงประเภทมันจะช่วยลดข้อผิดพลาดทางความหมาย (แม้ว่าจะครั้งเดียวในชีวิตของคุณทั้งหมด) นอกจากนี้ยังช่วยให้บุคคลต่อไปอ่านโค้ดว่ามีการบังคับใช้กฎใด คุณเขียนหนึ่งครั้งมันอ่านสองสามร้อยครั้งถ้ามันสามารถช่วยขจัดข้อสงสัยของคน ๆ หนึ่งมันก็ประสบความสำเร็จแล้ว ยังไม่มีการทดสอบหน่วยความจำถ้า Empirical ตั้งแต่โคลนประเภทเดียวกัน มีทรัพยากรมากกว่าเวลาเท่านั้น
Marco

@Marco เมื่อฉันพูดว่า "การศึกษาเชิงประจักษ์" ฉันหมายถึงมันขึ้นอยู่กับประสบการณ์เช่น: การใช้โค้ดแทนที่จะเป็นการโต้แย้งโดยใช้เหตุผลเพียงอย่างเดียว (หรือสิ่งที่อยู่ในใจของคุณ) โดยไม่ต้องทำการทดสอบเพื่อสำรองข้อมูล ค่า Salman A แนะนำให้ === บางครั้งก็เร็วกว่าและช้ากว่าเล็กน้อย นี่หมายถึง "ทำไม === เร็วกว่า == ใน PHP" ทำให้เกิดคำถาม: "คุณรู้ได้อย่างไรว่า === เร็วกว่า =="? การเพิ่มประสิทธิภาพของคอมไพเลอร์เป็นคำอธิบายไม่ใช่สิ่งที่เร็วขึ้นหรือช้าลงและฉันไม่ได้บอกว่าควรใช้อะไร
Pedro Amaral Couto

7

ฉันไม่รู้จริง ๆ ว่ามันเร็วกว่าอย่างมากหรือไม่ แต่ === ในภาษาส่วนใหญ่เป็นการเปรียบเทียบแบบโดยตรงขณะที่ == จะพยายามพิมพ์การข่มขู่หากจำเป็น / เป็นไปได้ที่จะได้รับการแข่งขัน


9
Javascript มีตัวดำเนินการ ===
Frank Shearar

ฉันแน่ใจว่าคุณสามารถทำได้ === ในเสียงกระเพื่อมและแบบแผนร่วมกัน
pupeno

Javascript - ไม่ได้อยู่ใน 3 คำจำกัดความที่ฉันได้ตรวจสอบแล้ว;) และ Lisp และ Scheme นั้นมีหลายสิ่ง แต่พบได้ยากมาก)
TomTom

1
ทับทิมมี === มันนานเกินไปที่ฉันจะจำได้ถ้ามันทำแบบเดียวกัน
KitsuneYMG

1
นอกจากนี้livesocs.adobe.com/flash/9.0/ActionScriptLangRefV3/ ......สำหรับ actionscript โดยทั่วไป google "ความเท่าเทียมกันอย่างเข้มงวด"
Chris

4

== ก่อให้เกิดค่าใช้จ่ายในการแปลงประเภทขนาดใหญ่กว่าก่อนการเปรียบเทียบ === ก่อนตรวจสอบประเภทจากนั้นดำเนินการโดยไม่ต้องทำการแปลงใด ๆ


4

เพราะ=== ไม่จำเป็นต้องบีบบังคับให้ตัวถูกดำเนินการเป็นประเภทเดียวกันก่อนเปรียบเทียบ

ฉันสงสัยว่าความแตกต่างของความเร็วนั้นสูงมาก ภายใต้สถานการณ์ปกติคุณควรใช้ตัวดำเนินการใดที่เหมาะสมกว่า


3

โดยสรุป === เร็วกว่าเพราะไม่แปลงชนิดข้อมูลเพื่อดูว่าตัวแปรสองตัวมีค่าเท่ากันหรือไม่ แต่เมื่อคุณต้องการดูว่าตัวแปรสองตัวมีค่าเท่ากันคุณจะใช้ == หากไม่ได้จำแนกว่าตัวแปรประเภทใด หรือ === ถ้าสำคัญก็เป็นประเภทของตัวแปรด้วย


0

ไม่ควรทำการวัดได้เร็วขึ้นในเวลาดำเนินการโดยตรง (การทดสอบประสิทธิภาพโดยตรงเกือบจะไม่สำคัญในกรณีนี้) ที่กล่าวว่าฉันจะต้องดูการทดสอบที่เกี่ยวข้องกับการทำซ้ำหรือเรียกซ้ำเพื่อดูว่ามีความแตกต่างอย่างมีนัยสำคัญสะสม (เมื่อใช้ในบริบทจริง) เวลาทดสอบและการดีบักที่คุณจะประหยัดเมื่อต้องรับมือกับคดีขอบควรมีความหมายกับคุณเช่นกัน


0

ในค่า php (c code) คือ "class" ที่ชอบ:

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

เมื่อคุณเปรียบเทียบ$a == $bและ$aเป็นintประเภทคุณจะมีสิ่งที่ชอบ:

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

แต่string '1'จะไม่โยนรหัส ASCII ก็จะเป็น491

เมื่อคุณเปรียบเทียบ$a === $bและ$aเป็นintประเภทจะมีสิ่งที่ชอบ:

if ($a->int_ == $b->int_)

-4

หากผลการทดสอบถูกต้องแสดงว่าเป็นปัญหาของคอมไพเลอร์

โปรเซสเซอร์จะทำทุกอย่างที่บอกให้ทำในรอบสัญญาณนาฬิกา

หากมีน้อยกว่าที่ต้องทำก็จะทำได้เร็วกว่า

ส่วนที่เพิ่มเข้าไป:

จริง ๆ แล้วถ้าคอมไพเลอร์ได้สร้างโหลดของรหัสเครื่องที่จะประมวลผลแล้วถ้ามันได้เพิ่ม zillions ของสิ่งต่าง ๆ เพื่อรับมือกับชนิดของข้อมูลที่ต้องการเปรียบเทียบแล้วการลบ IF หนึ่ง "รอง" จะไม่เปลี่ยนความเร็วมากนัก เลย

หากใครยังคงอ่านสิ่งนี้อยู่ฉันก็จะสนใจในการอภิปรายเพิ่มเติม

ฟิล


คุณมีคำสั่ง IF "หนึ่ง" ในฐานรหัสของคุณหรือไม่ มันแปลกเพราะในทุกๆ code base ที่ฉันใช้ไปเรามี IF หลายพันรายการหรือประโยคเปรียบเทียบที่เรียกว่าทุกที่
เลฟ
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.