Tại sao === nhanh hơn == trong PHP?


168

Tại sao ===nhanh hơn ==trong PHP?


40
Nó nhanh hơn, nhưng nó nhanh hơn đáng kể ?
Piskvor rời khỏi tòa nhà

19
Xin đừng đọc về những gì nhanh hơn trong php. Đọc về cách nhận dữ liệu thú vị trong một truy vấn SQL duy nhất mà không lạm dụng THAM GIA.
Kamil Szot

15
Đối với những người mà nó có thể quan tâm đến cùng một chủ đề === vs ==, nhưng trong JAVASCRIPT, có thể đọc tại đây: stackoverflow.com/questions/359494/
Kẻ

5
@Piskvor, đó không phải là câu hỏi
Pacerier

6
@Pacerier: Điểm công bằng - đó là lý do tại sao tôi chỉ nhận xét về điều này. Nó không trả lời câu hỏi, nhưng cung cấp quan điểm về nó.
Piskvor rời khỏi tòa nhà

Câu trả lời:


200

Bởi vì toán tử đẳng thức ==cưỡng chế hoặc chuyển đổi, loại dữ liệu tạm thời để xem liệu nó có bằng toán hạng khác hay không, trong khi đó ===(toán tử nhận dạng) không cần thực hiện bất kỳ chuyển đổi nào và do đó ít được thực hiện, làm cho nó nhanh hơn.


Tôi nghĩ rằng ý kiến ​​của bạn trái ngược với những gì PHP Manual nói. Họ nói $ a == $ b là TRUE nếu $ a bằng $ b, trong đó $ a === $ b là TRUE nếu $ a bằng $ b và chúng cùng loại.
Bakhtiyor

92
Làm thế nào là trái ngược, sau đó?
meder omuraliev

2
Tôi tin rằng thực tế là 2 toán hạng trỏ đến cùng một vùng bộ nhớ cho các loại phức tạp nhưng câu trả lời của người trung gian bao gồm điều đó
Cơ bản

1
Nó có ý nghĩa (như trong JS), nhưng sẽ rất tuyệt nếu ai đó thêm vào một tham chiếu đến một số thử nghiệm hiệu năng đơn giản thực sự.
Marco Demaio

4
phpbench.com có một dấu hiệu cho thấy sự khác biệt về hiệu suất giữa == và === trong phần "Cấu trúc điều khiển".
ekillaby

54

===không thực hiện typecasting, vì vậy 0 == '0'đánh giá true, nhưng 0 === '0'- đến false.


25

Đầu tiên, === kiểm tra xem hai đối số có cùng loại không - vì vậy số 1 và chuỗi '1' không thành công trong kiểm tra loại trước khi thực hiện bất kỳ so sánh nào. Mặt khác, == không kiểm tra loại đầu tiên và tiếp tục và chuyển đổi cả hai đối số thành cùng loại và sau đó thực hiện so sánh.

Do đó, === nhanh hơn trong việc kiểm tra tình trạng lỗi


8
Tôi đoán rằng ==cũng sẽ kiểm tra loại đầu tiên để xem có cần thực hiện chuyển đổi loại nào không. Thực tế là ===không thực hiện bất kỳ chuyển đổi nào trong bước sau đây là điều làm cho nó nhanh hơn.
lừa dối

25

Có hai điều cần xem xét:

  1. Nếu các loại toán hạng là khác nhau =====tạo ra kết quả khác nhau . Trong trường hợp đó, tốc độ của các nhà khai thác không thành vấn đề; Điều quan trọng là cái nào tạo ra kết quả mong muốn.

  2. Nếu các loại toán hạng giống nhau thì bạn có thể sử dụng ==hoặc ===cả hai sẽ tạo ra kết quả giống nhau . Trong trường hợp đó, tốc độ của cả hai toán tử gần như giống hệt nhau. Điều này là do không có chuyển đổi loại nào được thực hiện bởi một trong hai toán tử.

Tôi so sánh tốc độ của:

  • $a == $b đấu với $a === $b
  • trong đó $a$blà số nguyên ngẫu nhiên [1, 100]
  • hai biến được tạo và so sánh một triệu lần
  • các bài kiểm tra đã được chạy 10 lần

Và đây là kết quả:

 $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

Bạn có thể thấy rằng tốc độ gần như giống hệt nhau.


13
Tôi tự hỏi điều gì sẽ xảy ra nếu bạn thực hiện vài tỷ lần lặp trên một máy không làm gì khác và chỉ xuất ra mức trung bình. Có vẻ như có khá nhiều tiếng ồn ở đây. ;)
Gung Foo

4
Tôi đi đến cùng một kết luận: Không có sự khác biệt nào có thể bị rối nếu các toán hạng được biết là cùng loại. Các kịch bản khác không có ý nghĩa. Hầu như tất cả các câu trả lời khác chỉ là sai.
Paul Spiegel

1
Tôi tin rằng đây nên là câu trả lời được lựa chọn. Nó không chỉ đơn thuần hợp lý hóa với các giả định, các giả định đã được thử nghiệm ít hơn về mặt thực nghiệm.
Pedro Amaral Couto

@PedroAmaralCouto Tôi không nghĩ vậy, vì 10 không phải là một nghiên cứu thực nghiệm. Lý do chính gần như không có sự khác biệt là trình biên dịch PHP có thể sẽ tối ưu hóa mã. Bạn nên sử dụng === trừ khi cần chuyển đổi loại, nó sẽ giúp giảm lỗi ngữ nghĩa (ngay cả khi đó là một lần trong toàn bộ cuộc đời của bạn). Nó cũng giúp người tiếp theo đọc mã những quy tắc nào được thi hành. Bạn viết một lần, nó đọc vài trăm lần, nếu nó có thể giúp xóa tan nghi ngờ của một người, thì nó đã thành công. Cũng không có kiểm tra bộ nhớ nếu theo kinh nghiệm, vì nhân bản cùng loại. Có nhiều tài nguyên hơn chỉ có thời gian.
Marco

@Marco, khi tôi nói "nghiên cứu thực nghiệm", ý tôi là nó dựa trên kinh nghiệm, ví dụ: chạy mã thay vì đưa ra một lập luận chỉ sử dụng lý do (hoặc những gì trong tâm trí của bạn), mà không cần thử nghiệm để sao lưu. Salman Một giá trị đề xuất === đôi khi nhanh hơn một chút và đôi khi chậm hơn một chút. Điều này có nghĩa là "Tại sao === nhanh hơn == trong PHP?" đặt ra câu hỏi: "Làm sao bạn biết === nhanh hơn =="? Tối ưu hóa trình biên dịch là một lời giải thích, không phải là nhanh hơn hay chậm hơn và tôi không nói nên sử dụng cái gì.
Pedro Amaral Couto

7

Tôi thực sự không biết liệu nó có nhanh hơn đáng kể hay không, nhưng === trong hầu hết các ngôn ngữ là so sánh kiểu trực tiếp, trong khi == sẽ cố gắng thực hiện cưỡng chế kiểu nếu cần / có thể để đạt được kết quả khớp.


9
Javascript có toán tử ===.
Frank Shearar

Tôi chắc chắn rằng bạn có thể làm === trong lisp và sơ đồ chung.
Pupeno

Javascript - không phải trong 3 định nghĩa ngôn ngữ tôi đã kiểm tra;) Và Lisp và Scheme có nhiều thứ, nhưng hầu như không phổ biến;)
TomTom

1
ruby có ===. Nó đã quá dài để tôi nhớ nếu nó làm điều tương tự.
KitsuneYMG

1
Ngoài ra, liveocs.adobe.com/flash/9.0/ActionScriptLangRefV3/ Khăn cho Actioncript. Về cơ bản, google "bình đẳng nghiêm ngặt".
Chris

4

== phát sinh chi phí chuyển đổi loại lớn hơn trước khi so sánh. === trước tiên kiểm tra loại, sau đó tiến hành mà không phải thực hiện bất kỳ chuyển đổi loại nào.



3

Trong kết luận === nhanh hơn vì không chuyển đổi loại dữ liệu để xem hai biến có cùng giá trị không, nhưng khi bạn cần xem hai biến có cùng giá trị hay không, bạn sẽ sử dụng == nếu không tập hợp loại nào là biến hoặc === nếu cũng quan trọng là loại biến.


0

Nhanh hơn không nên được đo trong thời gian thực hiện trực tiếp (kiểm tra hiệu suất trực tiếp gần như không đáng kể trong trường hợp này). Điều đó nói rằng, tôi sẽ cần phải xem một bài kiểm tra liên quan đến phép lặp, hoặc đệ quy, để thực sự xem liệu có sự khác biệt đáng kể, tích lũy (khi được sử dụng trong bối cảnh thực tế). Thời gian kiểm tra và gỡ lỗi bạn sẽ tiết kiệm được khi xử lý các trường hợp cạnh cũng có ý nghĩa với bạn


0

Trong giá trị php (c code) là một "lớp" như:

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

Khi bạn đang so sánh $a == $b$aintloại, sẽ có một cái gì đó như:

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

nhưng string '1'sẽ không được chuyển sang mã ascii 49, nó sẽ được 1.

Khi bạn so sánh $a === $b$aintloại, sẽ có lúc như:

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

-4

Nếu kết quả kiểm tra là chính xác, thì đó phải là một vấn đề về trình biên dịch,

Bộ xử lý sẽ làm bất cứ điều gì được yêu cầu làm theo chu kỳ đồng hồ

Nếu nó có ít việc phải làm thì sẽ nhanh hơn để làm

Thêm vào:

Thực sự thì nếu trình biên dịch đã tạo ra vô số mã máy cần xử lý, thì nếu nó đã thêm hàng trăm thứ để đối phó với loại dữ liệu nào cần so sánh, thì việc loại bỏ một "nhỏ" IF sẽ không thay đổi tốc độ nhiều ở tất cả.

Nếu bất cứ ai vẫn đọc được điều này thì tôi thú vị trong cuộc thảo luận nhiều hơn.

Phil


Bạn chỉ có câu lệnh IF "một" trong cơ sở mã của mình? Điều đó thật kỳ lạ bởi vì trong mọi cơ sở mã mà tôi đã làm việc, chúng tôi có hàng ngàn câu lệnh IF hoặc so sánh được gọi ở khắp mọi nơi.
Lev
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.