Hướng dẫn is passing by reference faster php? - đang đi qua tham chiếu php nhanh hơn?

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.

Hướng dẫn is passing by reference faster php? - đang đi qua tham chiếu php nhanh hơ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 seconds

Hàm để ghi / thay đổi tham số

pass by value:      1.52223396 seconds
pass by reference:  1.52388787 seconds

Kết luận

  1. Vượt qua tham số theo giá trị luôn nhanh hơn

  2. 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.

.

Hướng dẫn is passing by reference faster php? - đang đi qua tham chiếu php nhanh hơn?

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:

Hướng dẫn is passing by reference faster php? - đang đi qua tham chiếu php nhanh hơn?

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.9489

Sự 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ố 8

Kế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. https://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

Hướng dẫn is passing by reference faster php? - đang đi qua tham chiếu php nhanh hơn?

3

Bạn có nên chuyển qua tham chiếu trong PHP không?

Câu trả lời ngắn gọn là sử dụng tài liệu tham khảo khi bạn cần chức năng mà họ cung cấp. Đừng nghĩ về chúng về cách sử dụng bộ nhớ hoặc tốc độ. Vượt qua tham chiếu luôn luôn chậm hơn nếu biến chỉ được đọc. Mọi thứ được truyền qua giá trị, bao gồm cả các đối tượng.use references when you need the functionality that they provide. Don't think of them in terms of memory usage or speed. Pass by reference is always going to be slower if the variable is read only. Everything is passed by value, including objects.

Php có vượt qua mảng bằng cách tham khảo không?

Liên quan đến câu hỏi đầu tiên của bạn, mảng được truyền qua tham chiếu trừ khi nó được sửa đổi trong phương thức / hàm bạn đang gọi.Nếu bạn cố gắng sửa đổi mảng trong phương thức / hàm, một bản sao của nó được tạo trước tiên và sau đó chỉ có bản sao được sửa đổi.the array is passed by reference UNLESS it is modified within the method / function you're calling. If you attempt to modify the array within the method / function, a copy of it is made first, and then only the copy is modified.

Những gì được thông qua trong một cuộc gọi PHP bằng cách tham khảo?

Truyền qua tham chiếu: Khi các biến được truyền bằng biểu tượng tham chiếu, sử dụng & (ampersand) cần được thêm vào trước khi đối số biến.Ví dụ: Hàm (& $ x).Phạm vi của cả biến toàn cầu và chức năng trở thành toàn cầu vì cả hai biến được xác định bởi cùng một tham chiếu.use & (ampersand) symbol need to be added before variable argument. For example: function( &$x ). Scope of both global and function variable becomes global as both variables are defined by same reference.

Có nghĩa là gì bằng cách truyền biến theo giá trị và tham chiếu trong PHP?

Khi biến được truyền dưới dạng tham chiếu thì nó được gọi là biến Pass bằng tham chiếu.Ở đây, cả biến chính và biến được truyền đều chia sẻ cùng một vị trí bộ nhớ và và được sử dụng để tham khảo.Vì vậy, nếu một biến thay đổi thì loại kia cũng sẽ thay đổi.. Here, both the main variable and the passed variable share the same memory location and & is used for reference. So, if one variable changes then the other will also change.