Trong khi tối ưu hóa một hàm trong PHP, tôi đã thay đổiTại sao việc truyền và so sánh trong PHP nhanh hơn is_ *?
if(is_array($obj)) foreach($obj as $key=>$value { [snip] }
else if(is_object($obj)) foreach($obj as $key=>$value { [snip] }
để
if($obj == (array) $obj) foreach($obj as $key=>$value { [snip] }
else if($obj == (obj) $obj) foreach($obj as $key=>$value { [snip] }
Sau khi tìm hiểu về ===
, tôi đã thay đổi đó để
if($obj === (array) $obj) foreach($obj as $key=>$value { [snip] }
else if($obj === (obj) $obj) foreach($obj as $key=>$value { [snip] }
Thay đổi mỗi bài kiểm tra từ is_ * để đúc dẫn đến tăng tốc lớn (> 30%).
Tôi hiểu rằng ===
nhanh hơn ==
do không có sự ép buộc phải được thực hiện, nhưng tại sao lại truyền biến nhanh hơn rất nhiều so với việc gọi bất kỳ hàm nào là _ * -?
Edit: Kể từ khi mọi người hỏi về tính đúng đắn, tôi đã viết bài kiểm tra nhỏ này:
$foo=(object) array('bar'=>'foo');
$bar=array('bar'=>'foo');
if($foo===(array) $foo) echo '$foo is an array?';
if($bar===(object) $bar) echo '$bar is an object?';
Nó không in bất kỳ lỗi và cả hai biến không bị thay đổi, vì vậy tôi nghĩ rằng nó làm việc, nhưng tôi đã sẵn sàng để được thuyết phục bằng cách khác.
Một Edit: chương trình Artefacto của mang lại cho tôi những con số sau đây:
PHP 5.3.2-1ubuntu4.2 (64bit) on a Core i5-750 with Xdebug Elapsed (1): 0.46174287796021/0.28902506828308 Elapsed (2): 0.52625703811646/0.3072669506073 Elapsed (3): 0.57169318199158/0.12708187103271 Elapsed (4): 0.51496887207031/0.30524897575378 Speculation: Casting and comparing can be about 1.7-4 times faster.
PHP 5.3.2-1ubuntu4.2 (64bit) on a Core i5-750 without Xdebug Elapsed (1): 0.15818405151367/0.214271068573 Elapsed (2): 0.1531388759613/0.25853085517883 Elapsed (3): 0.16164898872375/0.074632883071899 Elapsed (4): 0.14408397674561/0.25812387466431 Without Xdebug, the extra function call didn't matter anymore, so every test (except 3) ran faster.
PHP 5.3.2-1ubuntu4.2 on a Pentium M 1.6GHz Elapsed (1): 0.97393798828125/0.9062979221344 Elapsed (2): 0.39448714256287/0.86932587623596 Elapsed (3): 0.44513893127441/0.23662400245667 Elapsed (4): 0.38685202598572/0.82854390144348 Speculation: Casting an array is slower, casting an object can be faster, but might not be slower.
PHP 5.2.6-1+lenny8 on a Xeon 5110 Elapsed (1): 0.273758888245/0.530702114105 Elapsed (2): 0.276469945908/0.605964899063 Elapsed (3): 0.332523107529/0.137730836868 Elapsed (4): 0.267735004425/0.556323766708 Speculation: These results are similar to Artefacto's results, I think it's PHP 5.2.
Giải pháp: Các hồ sơ tôi đã sử dụng (Xdebug) đã gọi chức năng khoảng 3 lần chậm hơn (ngay cả khi không định hình), nhưng không ảnh hưởng đến truyền và so sánh không đáng chú ý, do đó, đúc và so sánh xuất hiện để được nhanh hơn, mặc dù nó chỉ không bị ảnh hưởng bởi trình gỡ rối/profiler.
Nếu tôi phải đoán, nó muốn được do tránh các chi phí của một cuộc gọi chức năng. – Amber
Việc thay thế của bạn không dẫn đến một chương trình tương đương. Ví dụ, nếu '$ obj' là một đối tượng,' is_array ($ obj) 'trả về' false', nhưng có thể '($ obj == (array) $ obj)' đánh giá thành 'true'. – Artefacto
@Artefacto có điều đó hoàn toàn đúng. Đó là những gì tôi cũng đã viết, xin vui lòng có một cái nhìn để trả lời của tôi, và cho tôi một số thông tin phản hồi – streetparade