75
Mới! Lưu câu hỏi hoặc câu trả lời và sắp xếp nội dung yêu thích của bạn. Tìm hiểu thêm.
Learn more.
Trong PHP, các tham số chức năng có thể được truyền bằng cách tham chiếu bằng cách chi tiêu một ampers và tham số trong khai báo chức năng, như vậy:
function foo(&$bar) { // ... }Bây giờ, tôi nhận thức được rằng điều này không được thiết kế để cải thiện hiệu suất, nhưng để cho phép các hàm thay đổi các biến thường nằm ngoài phạm vi của chúng.
Thay vào đó, PHP dường như sử dụng bản sao trên Viết để tránh sao chép các đối tượng (và cũng có thể là mảng) cho đến khi chúng được thay đổi. Vì vậy, đối với các chức năng không thay đổi các tham số của chúng, hiệu ứng sẽ giống như khi bạn đã vượt qua chúng bằng cách tham khảo.
Tuy nhiên, tôi đã tự hỏi liệu bản sao trên logic viết có thể bị rút ngắn trên từng tham chiếu và liệu điều đó có tác động hiệu suất hay không.
ETA: Để chắc chắn, tôi cho rằng nó không nhanh hơn và tôi nhận thức rõ rằng đây không phải là những gì tài liệu tham khảo. Vì vậy, tôi nghĩ rằng dự đoán của tôi khá tốt, tôi chỉ tìm kiếm một câu trả lời từ một người thực sự biết những gì chắc chắn xảy ra dưới mui xe. Trong năm năm phát triển PHP, tôi đã luôn cảm thấy khó khăn trong việc có được thông tin chất lượng về phần bên trong PHP khi đọc nguồn.
Molf
71.9K13 Huy hiệu vàng134 Huy hiệu bạc117 Huy hiệu đồng13 gold badges134 silver badges117 bronze badges
Hỏi ngày 7 tháng 10 năm 2008 lúc 13:04Oct 7, 2008 at 13:04
Hanno Fietzhanno FietzHanno Fietz
30.2K46 Huy hiệu vàng142 Huy hiệu bạc234 Huy hiệu đồng46 gold badges142 silver badges234 bronze badges
1
Trong một bài kiểm tra với 100 000 lần gọi gọi một hàm có chuỗi 20 kb, kết quả là:
Chức năng chỉ đọc / sử dụng tham số
pass by value: 0.12065005 seconds pass by reference: 1.52171397 secondsHàm để ghi / thay đổi tham số
pass by value: 1.52223396 seconds pass by reference: 1.52388787 secondsKết luận
Vượt qua tham số theo giá trị luôn nhanh hơn
Nếu hàm thay đổi giá trị của biến được truyền, đối với các mục đích thực tế giống như vượt qua tham chiếu so với giá trị
Svish
Phù bằng vàng 148K170451 Huy hiệu bạc607 Huy hiệu đồng170 gold badges451 silver badges607 bronze badges
Đã trả lời ngày 2 tháng 10 năm 2010 lúc 11:48Oct 2, 2010 at 11:48
6
Động cơ Zend sử dụng sao chép-trên-viết và khi bạn tự mình sử dụng một tham chiếu, nó sẽ phải chịu thêm một chút chi phí. Mặc dù chỉ có thể tìm thấy đề cập này tại thời điểm viết, và bình luận trong thủ công có chứa các liên kết khác.
.
Hakre
187K48 Huy hiệu vàng419 Huy hiệu bạc807 Huy hiệu đồng48 gold badges419 silver badges807 bronze badges
Đã trả lời ngày 7 tháng 10 năm 2008 lúc 13:14Oct 7, 2008 at 13:14
Paul Dixonpaul DixonPaul Dixon
291K51 Huy hiệu vàng310 Huy hiệu bạc344 Huy hiệu đồng51 gold badges310 silver badges344 bronze badges
3
Tôi đã thực hiện một số bài kiểm tra về điều này bởi vì tôi không chắc chắn về các câu trả lời được đưa ra.
Kết quả của tôi cho thấy rằng việc vượt qua các mảng hoặc chuỗi lớn bằng cách tham chiếu nhanh hơn đáng kể.
Đây là kết quả của tôi:
Trục y (chạy) là bao nhiêu lần một hàm có thể được gọi trong 1 giây * 10
Bài kiểm tra được lặp lại 8 lần cho mỗi hàm/biến
Và đây là các biến tôi đã sử dụng:
$large_array = array_fill(PHP_INT_MAX / 2, 1000, 'a'); $small_array = array('this', 'is', 'a', 'small', 'array'); $large_object = (object)$large_array; $large_string = str_repeat('a', 100000); $small_string = 'this is a small string'; $value = PHP_INT_MAX / 2;Đây là những chức năng:
function pass_by_ref(&$var) { } function pass_by_val($var) { }Đã trả lời ngày 5 tháng 7 năm 2011 lúc 3:54Jul 5, 2011 at 3:54
PetahpetahPetah
44.7K27 Huy hiệu vàng155 Huy hiệu bạc211 Huy hiệu đồng27 gold badges155 silver badges211 bronze badges
4
Tôi đã thử nghiệm các giá trị và tài liệu tham khảo của chuỗi byte 10k chuyển nó đến hai hàm giống hệt nhau. Một người lấy đối số theo giá trị và cái thứ hai bằng tham chiếu. Chúng là các chức năng phổ biến - lấy đối số, thực hiện xử lý đơn giản và trả về một giá trị. Tôi đã thực hiện 100 000 cuộc gọi của cả hai và nhận ra rằng các tài liệu tham khảo không được thiết kế để tăng hiệu suất-lợi nhuận tham chiếu là gần 4-5% và nó chỉ tăng lên khi chuỗi đủ lớn (100k và dài hơn, điều đó đã cải thiện 6-7%) . Vì vậy, kết luận của tôi là không sử dụng các tài liệu tham khảo để tăng sự hoàn hảo, công cụ này không dành cho điều đó.do not use references to increase perfomance, this stuff is not for that.
Tôi đã sử dụng Php phiên bản 5.3.1
Đã trả lời ngày 1 tháng 10 năm 2011 lúc 14:05Oct 1, 2011 at 14:05
Tôi khá chắc chắn rằng không, nó không nhanh hơn. Ngoài ra, nó nói cụ thể trong hướng dẫn không thử sử dụng các tài liệu tham khảo để tăng hiệu suất.
EDIT: Không thể tìm thấy nơi nó nói điều đó, nhưng nó ở đó!
Đã trả lời ngày 7 tháng 10 năm 2008 lúc 13:06Oct 7, 2008 at 13:06
GreggreGreg
310K53 Huy hiệu vàng367 Huy hiệu bạc329 Huy hiệu đồng53 gold badges367 silver badges329 bronze badges
1
Tôi đã cố gắng đánh giá điều này với một ví dụ trong thế giới thực dựa trên một dự án mà tôi đang thực hiện. Như mọi khi, sự khác biệt là tầm thường, nhưng kết quả có phần bất ngờ. Đối với hầu hết các điểm chuẩn tôi đã thấy, hàm được gọi không thực sự thay đổi giá trị được truyền vào. Tôi đã thực hiện một str_re_replace () đơn giản trên đó.
**Pass by Value Test Code:** $originalString=''; // 1000 pseudo-random digits function replace($string) { return str_replace('1', 'x',$string); } $output = ''; /* set start time */ $mtime = microtime(); $mtime = explode(" ", $mtime); $mtime = $mtime[1] + $mtime[0]; $tstart = $mtime; set_time_limit(0); for ($i = 0; $i < 10; $i++ ) { for ($j = 0; $j < 1000000; $j++) { $string = $originalString; $string = replace($string); } } /* report how long it took */ $mtime = microtime(); $mtime = explode(" ", $mtime); $mtime = $mtime[1] + $mtime[0]; $tend = $mtime; $totalTime = ($tend - $tstart); $totalTime = sprintf("%2.4f s", $totalTime); $output .= "\n" . 'Total Time' . ': ' . $totalTime; $output .= "\n" . $string; echo $output;Vượt qua bằng mã kiểm tra tham chiếu
Giống nhau ngoại trừ
function replace(&$string) { $string = str_replace('1', 'x',$string); } /* ... */ replace($string);Kết quả trong vài giây (10 triệu lần lặp):
PHP 5 Value: 14.1007 Reference: 11.5564 PHP 7 Value: 3.0799 Reference: 2.9489Sự khác biệt là một phần của một phần nghìn giây trên mỗi cuộc gọi chức năng, nhưng đối với trường hợp sử dụng này, việc chuyển qua tham chiếu nhanh hơn trong cả Php 5 và Php 7.
(Lưu ý: Các thử nghiệm Php 7 được thực hiện trên máy nhanh hơn - Php 7 nhanh hơn, nhưng có lẽ không nhanh hơn nhiều.)
Đã trả lời ngày 19 tháng 2 năm 2018 lúc 7:45Feb 19, 2018 at 7:45
Bob Raybob RayBob Ray
9089 Huy hiệu bạc20 Huy hiệu Đồng9 silver badges20 bronze badges
Không có gì tốt hơn một đoạn mã thử nghiệm
________số 8Kết quả cuối cùng! Mảng càng lớn (hoặc số lượng cuộc gọi càng lớn) thì sự khác biệt càng lớn. Vì vậy, trong trường hợp này, việc gọi bằng tham chiếu nhanh hơn vì giá trị được thay đổi bên trong hàm.
Mặt khác, không có sự khác biệt thực sự giữa "bởi tham chiếu" và "theo giá trị", trình biên dịch đủ thông minh để không tạo một bản sao mới mỗi lần nếu không cần.
Đã trả lời ngày 26 tháng 7 năm 2014 lúc 21:34Jul 26, 2014 at 21:34
MelsimelsiMelsi
1.4421 Huy hiệu vàng15 Huy hiệu bạc20 Huy hiệu Đồng1 gold badge15 silver badges20 bronze badges
2
Là đơn giản, không cần phải kiểm tra bất cứ điều gì. Phụ thuộc vào trường hợp sử dụng.
Truyền theo giá trị sẽ luôn nhanh hơn giá trị so với tham chiếu cho một lượng nhỏ đối số. Điều này phụ thuộc vào số lượng biến mà kiến trúc cho phép được truyền qua các thanh ghi (ABI).
Ví dụ: x64 sẽ cho phép bạn 4 giá trị 64 bit được truyền qua các thanh ghi. //en.wikipedia.org/wiki/x86_calling_convents
Điều này là do bạn không cần phải giới thiệu các con trỏ, chỉ cần sử dụng giá trị trực tiếp.
Nếu dữ liệu của bạn cần được truyền lớn hơn ABI, các giá trị còn lại sẽ được chuyển đến ngăn xếp. Trong trường hợp này, một mảng hoặc một đối tượng (ví dụ là một lớp hoặc một cấu trúc + tiêu đề) sẽ luôn nhanh hơn bằng cách tham chiếu.
Điều này là do tham chiếu chỉ là một con trỏ vào dữ liệu của bạn (không phải chính dữ liệu), kích thước cố định, giả sử 32 hoặc 64 bit tùy thuộc vào máy. Con trỏ đó sẽ phù hợp với một thanh ghi CPU.
PHP được viết bằng C/C ++, vì vậy tôi hy vọng sẽ hoạt động giống nhau.
Đã trả lời ngày 25 tháng 2 năm 2019 lúc 15:30Feb 25, 2019 at 15:30
Orfruitfruitorfruit
1.3201 Huy hiệu vàng16 Huy hiệu bạc25 Huy hiệu Đồng1 gold badge16 silver badges25 bronze badges
1
Không cần thêm & toán tử khi chuyển các đối tượng. Trong các đối tượng Php 5+ được truyền bằng cách tham chiếu dù sao.
Đã trả lời ngày 7 tháng 10 năm 2008 lúc 13:17Oct 7, 2008 at 13:17
3