Hiệu suất của FOR vs FOREACH trong PHP


134

Trước hết, tôi hiểu trong 90% ứng dụng, sự khác biệt hiệu năng là hoàn toàn không liên quan, nhưng tôi chỉ cần biết đó là cấu trúc nhanh hơn. Đó và ...

Các thông tin hiện có sẵn trên mạng là khó hiểu. Rất nhiều người nói foreach là xấu, nhưng về mặt kỹ thuật thì nó sẽ nhanh hơn vì nó giả sử đơn giản hóa việc viết một mảng truyền tải bằng cách sử dụng các trình vòng lặp. Các trình vòng lặp, một lần nữa được cho là nhanh hơn, nhưng trong PHP cũng rõ ràng là chết chậm (hoặc đây không phải là một điều PHP?). Tôi đang nói về các hàm mảng: next () trước () reset (), v.v., nếu chúng là các hàm chẵn và không phải là một trong những tính năng ngôn ngữ PHP trông giống như các hàm.

Để thu hẹp điều này xuống một chút : Tôi không thú vị khi duyệt qua các mảng trong các bước của bất kỳ thứ gì nhiều hơn 1 (cũng không có bước tiêu cực nào, tức là lặp lại đảo ngược). Tôi cũng không quan tâm đến việc đi qua và từ các điểm tùy ý, chỉ từ 0 đến chiều dài. Tôi cũng không thấy việc thao tác các mảng với hơn 1000 khóa diễn ra thường xuyên, nhưng tôi thấy một mảng được duyệt nhiều lần trong logic của ứng dụng! Cũng như đối với các hoạt động, phần lớn chỉ thao tác chuỗi và tiếng vang.

Dưới đây là một số trang web tham khảo:
http://www.phpbench.com/
http://www.php.lt/benchmark/phpbench.php

Những gì tôi nghe thấy ở khắp mọi nơi:

  • foreachlà chậm, và do đó for/ whilelà nhanh hơn
  • PHP foreachsao chép mảng mà nó lặp đi lặp lại; để làm cho nó nhanh hơn bạn cần sử dụng tài liệu tham khảo
  • mã như thế này: nhanh hơn một$key = array_keys($aHash); $size = sizeOf($key);
    for ($i=0; $i < $size; $i++)
    foreach

Đây là vấn đề của tôi. Tôi đã viết tập lệnh thử nghiệm này: http://pastebin.com/1ZgK07US và cho dù tôi có chạy tập lệnh bao nhiêu lần đi chăng nữa, tôi vẫn nhận được một cái gì đó như thế này:

foreach 1.1438131332397
foreach (using reference) 1.2919359207153
for 1.4262869358063
foreach (hash table) 1.5696921348572
for (hash table) 2.4778981208801

Nói ngắn gọn:

  • foreachnhanh hơn so foreachvới tham chiếu
  • foreach nhanh hơn for
  • foreachnhanh hơn so forvới bảng băm

Ai đó có thể giải thích?

  1. Tôi có làm điều gì sai?
  2. Là tham chiếu foreach điều thực sự làm cho một sự khác biệt? Tôi có nghĩa là tại sao nó sẽ không sao chép nó nếu bạn vượt qua tham chiếu?
  3. Mã lặp tương đương cho câu lệnh foreach là gì; Tôi đã thấy một vài cái trên mạng nhưng mỗi lần tôi kiểm tra chúng thì thời gian lại tắt; Tôi cũng đã thử nghiệm một vài cấu trúc trình lặp đơn giản nhưng dường như chưa bao giờ nhận được kết quả tốt - các trình lặp mảng trong PHP có tệ không?
  4. Có cách / phương thức / cấu trúc nhanh hơn để lặp lại mặc dù một mảng khác ngoài FOR / FOREACH (và WHILE) không?

Phiên bản PHP 5.3.0


Chỉnh sửa: Trả lời Với sự giúp đỡ từ những người ở đây tôi đã có thể ghép các câu trả lời cho tất cả các câu hỏi. Tôi sẽ tóm tắt chúng ở đây:

  1. "Tôi có làm điều gì sai?" Sự đồng thuận dường như là: có, tôi không thể sử dụng tiếng vang trong điểm chuẩn. Cá nhân, tôi vẫn không thấy tiếng vang là một số chức năng với thời gian thực hiện ngẫu nhiên hoặc cách bất kỳ chức năng nào khác khác nhau - điều đó và khả năng của kịch bản đó tạo ra kết quả chính xác của bài giảng tốt hơn mọi thứ đều khó để giải thích mặc dù chỉ là "bạn đang sử dụng tiếng vang" (tôi nên sử dụng cái gì). Tuy nhiên, tôi thừa nhận bài kiểm tra nên được thực hiện với một cái gì đó tốt hơn; mặc dù một thỏa hiệp lý tưởng không đến với tâm trí.
  2. "Có phải PHP foreach điều tham khảo thực sự tạo ra sự khác biệt? Ý tôi là tại sao nó sẽ không sao chép nó nếu bạn vượt qua tham chiếu?" ircmaxell cho thấy rằng đúng vậy, thử nghiệm thêm dường như chứng minh trong hầu hết các trường hợp tham chiếu nên nhanh hơn - mặc dù với đoạn mã trên của tôi, hầu hết chắc chắn không có nghĩa là tất cả. Tôi chấp nhận vấn đề có lẽ quá không trực quan để bận tâm ở mức độ như vậy và sẽ yêu cầu một cái gì đó cực đoan như dịch ngược để thực sự xác định cái nào tốt hơn cho mỗi tình huống.
  3. "Mã trình lặp tương đương cho câu lệnh foreach là gì; tôi đã thấy một số ít trên mạng nhưng mỗi lần tôi kiểm tra chúng thì thời gian đã tắt; Tôi cũng đã thử một vài cấu trúc trình lặp đơn giản nhưng dường như không bao giờ nhận được kết quả tốt - các trình lặp mảng trong PHP có khủng khiếp không? " ircmaxell cung cấp câu trả lời dưới đây; mặc dù mã chỉ có thể hợp lệ cho phiên bản PHP> = 5
  4. "Có cách / phương thức / cấu trúc nhanh hơn để lặp lại mặc dù một mảng không phải là FOR / FOREACH (và WHILE) không?" Cảm ơn đi đến Gordon cho câu trả lời. Việc sử dụng các kiểu dữ liệu mới trong PHP5 sẽ giúp tăng hiệu năng hoặc tăng bộ nhớ (một trong hai cách có thể được mong muốn tùy thuộc vào tình huống của bạn). Mặc dù tốc độ rất cao, nhiều loại mảng mới dường như không tốt hơn mảng (), nhưng splp Warriorityqueue và splobjectst Storage dường như nhanh hơn đáng kể. Liên kết được cung cấp bởi Gordon: http://matthewturland.com/2010/05/20/new-spl-features-in-php-5-3/

Cảm ơn tất cả mọi người đã cố gắng giúp đỡ.

Tôi có thể sẽ dính vào foreach (phiên bản không tham chiếu) cho bất kỳ giao dịch đơn giản nào.


7
Quy tắc 2,71 của điểm chuẩn: không lặp lại điểm chuẩn.
Mchl

1
foreach với tham chiếu phải được đánh dấu lại với tham chiếu. bạn có một kết luận thiếu sót ở đó. bất kỳ việc sử dụng tài liệu tham khảo nào rõ ràng sẽ chậm hơn so với việc không có tài liệu tham khảo, ngay cả trong vòng lặp do-while.
bcosca

2
Vì đây là phiên bản dành cho php 5.3, bạn cũng có thể muốn xem xét thử nghiệm Kiểu dữ liệu Spl mới so với Mảng. Hoặc chỉ cần nhìn vào đây: matthewturland.com/2010/05/20/new-spl-features-in-php-5-3
Gordon

@ Mchl: Tôi đã chạy nó một vài lần và nhận được kết quả tương tự - nếu echo làm hỏng điểm chuẩn thì tôi có nên nhận kết quả hoàn toàn ngẫu nhiên không? Ngoài ra, tôi muốn lặp đi lặp lại mặc dù một cái gì đó và xuất ra nó để tiếng vang thực sự quan trọng đối với tôi; nếu foreach nhanh hơn khi echo'ing thì đó là một đoạn mã lớn mà tôi nên sử dụng foreach. @ stillstand: những gì tôi nghe được về cơ bản dọc theo dòng "tham chiếu trong foreach làm cho nhanh hơn (luôn luôn), luôn luôn viết với tham chiếu", đó là lý do tại sao tôi đã thử nghiệm như vậy - Tôi không thực sự quan tâm đến việc so sánh với các vòng tham chiếu khác
srcspider

2
những câu hỏi trống rỗng này tự nhiên nên bị cấm. cũng như trang web phpbench lừa dối đó
Ý thức chung của bạn

Câu trả lời:


110

Ý kiến ​​cá nhân của tôi là sử dụng những gì có ý nghĩa trong bối cảnh. Cá nhân tôi gần như không bao giờ sử dụng forcho mảng truyền tải. Tôi sử dụng nó cho các loại lặp khác, nhưng foreachquá dễ dàng ... Sự khác biệt về thời gian sẽ là tối thiểu trong hầu hết các trường hợp.

Điều quan trọng cần theo dõi là:

for ($i = 0; $i < count($array); $i++) {

Đó là một vòng lặp đắt tiền, vì nó gọi tính trên mỗi lần lặp. Chừng nào bạn chưa làm điều đó, tôi không nghĩ nó thực sự quan trọng ...

Đối với tham chiếu tạo ra sự khác biệt, PHP sử dụng copy-on-write, vì vậy nếu bạn không ghi vào mảng, sẽ có tương đối ít chi phí trong khi lặp. Tuy nhiên, nếu bạn bắt đầu sửa đổi mảng trong mảng, đó là nơi bạn sẽ bắt đầu thấy sự khác biệt giữa chúng (vì người ta sẽ cần sao chép toàn bộ mảng và tham chiếu chỉ có thể sửa đổi nội tuyến) ...

Đối với các trình vòng lặp, foreachtương đương với:

$it->rewind();
while ($it->valid()) {
    $key = $it->key();     // If using the $key => $value syntax
    $value = $it->current();

    // Contents of loop in here

    $it->next();
}

Theo như cách có các cách lặp nhanh hơn, nó thực sự phụ thuộc vào vấn đề. Nhưng tôi thực sự cần phải hỏi, tại sao? Tôi hiểu rằng muốn làm cho mọi thứ hiệu quả hơn, nhưng tôi nghĩ rằng bạn đang lãng phí thời gian của mình để tối ưu hóa vi mô. Hãy nhớ rằng, Premature Optimization Is The Root Of All Evil...

Chỉnh sửa: Dựa trên nhận xét, tôi quyết định thực hiện chạy nhanh điểm chuẩn ...

$a = array();
for ($i = 0; $i < 10000; $i++) {
    $a[] = $i;
}

$start = microtime(true);
foreach ($a as $k => $v) {
    $a[$k] = $v + 1;
}
echo "Completed in ", microtime(true) - $start, " Seconds\n";

$start = microtime(true);
foreach ($a as $k => &$v) {
    $v = $v + 1;
}
echo "Completed in ", microtime(true) - $start, " Seconds\n";

$start = microtime(true);
foreach ($a as $k => $v) {}
echo "Completed in ", microtime(true) - $start, " Seconds\n";

$start = microtime(true);
foreach ($a as $k => &$v) {}    
echo "Completed in ", microtime(true) - $start, " Seconds\n";

Và kết quả:

Completed in 0.0073502063751221 Seconds
Completed in 0.0019769668579102 Seconds
Completed in 0.0011849403381348 Seconds
Completed in 0.00111985206604 Seconds

Vì vậy, nếu bạn đang sửa đổi mảng trong vòng lặp, việc sử dụng tài liệu tham khảo sẽ nhanh hơn nhiều lần ...

Và chi phí chung cho tham chiếu thực sự ít hơn so với sao chép mảng (đây là vào ngày 5.3.2) ... Vì vậy, nó xuất hiện (ít nhất là vào ngày 5.3.2) như thể các tham chiếu nhanh hơn đáng kể ...


1
Ý bạn là "tối ưu hóa [không theo kế hoạch] là gốc rễ của mọi tội lỗi"? ;) Vâng, tất cả đều làm điều tương tự, vì vậy nó không phải là một sự tối ưu hóa nhiều như vậy: đó là "cách tiêu chuẩn tốt hơn để áp dụng." Ngoài ra một số câu hỏi khác chưa được trả lời: Bạn nói bởi vì nó không phải sao chép, nhưng cũng không phải là việc sử dụng tài liệu tham khảo? bình luận vẫn còn trong câu hỏi của tôi dường như không đồng ý với các giả định của bạn. Ngoài ra, tại sao mã sản xuất chậm hơn để tham khảo là tốt. Có phải foreach đã thay đổi trong 5.3.0 để chuyển đổi bất kỳ mảng () nào thành một đối tượng (ví dụ: SplFixedArray)?
srcspider

@srcspider: Câu trả lời được chỉnh sửa với mã điểm chuẩn và kết quả hiển thị tài liệu tham khảo thực sự nhanh hơn nhiều so với không tham khảo ...
ircmaxell

1
@srcspider "the better standard way to adopt." hiệu suất không phải là tiêu chí duy nhất để chọn những gì để áp dụng. đặc biệt là trong một trường hợp xa như vậy. Thành thật mà nói, bạn đang lãng phí thời gian
của bạn

@Col. Mảnh đạn tôi đồng ý 100%. Khả năng đọc và khả năng duy trì hiệu suất vượt trội nhờ một biên độ lớn trong trường hợp cụ thể này ... Tôi đồng ý về việc chọn một tiêu chuẩn và gắn bó với nó, nhưng dựa trên tiêu chuẩn đó - các yếu tố quan trọng
khác--

@ircmaxell: nhanh chóng chạy tập lệnh của bạn dường như chứng minh quan điểm của bạn nhưng tôi muốn xem xét thêm một chút; Tôi có thể chỉnh sửa câu hỏi ban đầu của mình với nhiều bài kiểm tra hơn, bao gồm một số tính năng mới 5.3. @Col. Mảnh đạn: FOR gần như là cấp độ lập trình phổ thông, FOREACH là cú pháp đơn giản hơn. Theo như khả năng đọc chúng dường như là trên mặt bằng như nhau. Đây là mức độ thấp đến mức tôi không nghĩ bảo trì là một vấn đề như đối với một số mẫu cấp cao. Và tôi không nghĩ rằng tôi đang lãng phí thời gian vì "cấu trúc cơ bản" này sẽ chiếm rất nhiều mã tôi sẽ viết. :)
srcspider

54

Tôi không chắc điều này rất đáng ngạc nhiên. Hầu hết những người viết mã trong PHP không thành thạo về những gì PHP thực sự đang làm ở kim loại trần. Tôi sẽ nêu một vài điều, điều này sẽ đúng trong hầu hết thời gian:

  1. Nếu bạn không sửa đổi biến, giá trị phụ sẽ nhanh hơn trong PHP. Điều này là do dù sao nó cũng được tính tham chiếu và giá trị phụ mang lại ít hơn. Nó biết lần thứ hai bạn sửa đổi ZVAL đó (cấu trúc dữ liệu nội bộ của PHP đối với hầu hết các loại), nó sẽ phải ngắt nó theo cách đơn giản (sao chép và quên ZVAL khác). Nhưng bạn không bao giờ sửa đổi nó, vì vậy nó không thành vấn đề. Tài liệu tham khảo làm cho nó phức tạp hơn với nhiều sổ sách hơn phải làm để biết phải làm gì khi bạn sửa đổi biến. Vì vậy, nếu bạn chỉ đọc, nghịch lý là không tốt hơn với &. Tôi biết, nó phản tác dụng trực quan, nhưng nó cũng đúng.

  2. Foreach không chậm. Và đối với phép lặp đơn giản, điều kiện mà nó đang thử nghiệm - "tôi ở cuối mảng này" - được thực hiện bằng cách sử dụng mã gốc, không phải mã opp PHP. Ngay cả khi APC được lưu trong bộ nhớ cache, nó vẫn chậm hơn so với một loạt các hoạt động tự nhiên được thực hiện tại kim loại trần.

  3. Việc sử dụng vòng lặp for "for ($ i = 0; $ i <Count ($ x); $ i ++) chậm vì tính () và thiếu khả năng của PHP (hoặc thực sự là bất kỳ ngôn ngữ được giải thích nào) để đánh giá phân tích cú pháp thời gian cho dù có bất cứ điều gì sửa đổi mảng. Điều này ngăn nó đánh giá số đếm một lần.

  4. Nhưng ngay cả khi bạn sửa nó với "$ c = Count ($ x); for ($ i = 0; $ i <$ c; $ i ++), $ i <$ c là một nhóm các mã opend tốt nhất, như là $ i ++. Trong quá trình lặp lại 100000, điều này có thể quan trọng. Foreach biết ở cấp độ bản địa phải làm gì. Không có mã opp PHP nào cần để kiểm tra điều kiện "tôi ở cuối mảng này".

  5. Thế còn trường cũ "while (list (" Stuff? Vâng, sử dụng từng (), current (), v.v ... đều sẽ liên quan đến ít nhất 1 cuộc gọi chức năng, không chậm, nhưng không miễn phí. là các opcode PHP một lần nữa! Vì vậy, trong khi + list + mỗi cái cũng có chi phí của nó.

Vì những lý do này, foreach có thể hiểu là lựa chọn tốt nhất cho phép lặp đơn giản.

Và đừng quên, nó cũng dễ đọc nhất, vì vậy nó là win-win.


Đây chính xác là lời giải thích mà tôi đang tìm kiếm, cảm ơn.
rắn

Câu trả lời này thực sự nên là một sự thay thế hoặc tóm tắt cho câu trả lời được đánh dấu. Tôi rất vui vì đã đọc nó, làm việc tốt.
doz87

30

Một điều cần chú ý trong các điểm chuẩn (đặc biệt là phpbench.com), mặc dù các con số là âm thanh, nhưng các bài kiểm tra thì không. Rất nhiều bài kiểm tra trên phpbench.com đang làm những việc không quan trọng và lạm dụng khả năng của PHP để lưu trữ các tra cứu mảng để làm lệch chuẩn hoặc trong trường hợp lặp lại một mảng không thực sự kiểm tra nó trong các trường hợp thực tế (không ai viết trống cho vòng lặp). Tôi đã thực hiện các điểm chuẩn của riêng mình mà tôi thấy khá phản ánh kết quả của thế giới thực và chúng luôn hiển thị cú pháp lặp tự nhiên của ngôn ngữ được foreachđưa lên hàng đầu (ngạc nhiên, ngạc nhiên).

//make a nicely random array
$aHash1 = range( 0, 999999 );
$aHash2 = range( 0, 999999 );
shuffle( $aHash1 );
shuffle( $aHash2 );
$aHash = array_combine( $aHash1, $aHash2 );


$start1 = microtime(true);
foreach($aHash as $key=>$val) $aHash[$key]++;
$end1 = microtime(true);

$start2 = microtime(true);
while(list($key) = each($aHash)) $aHash[$key]++;
$end2 = microtime(true);


$start3 = microtime(true);
$key = array_keys($aHash);
$size = sizeOf($key);
for ($i=0; $i<$size; $i++) $aHash[$key[$i]]++;
$end3 = microtime(true);

$start4 = microtime(true);
foreach($aHash as &$val) $val++;
$end4 = microtime(true);

echo "foreach ".($end1 - $start1)."\n"; //foreach 0.947947025299
echo "while ".($end2 - $start2)."\n"; //while 0.847212076187
echo "for ".($end3 - $start3)."\n"; //for 0.439476966858
echo "foreach ref ".($end4 - $start4)."\n"; //foreach ref 0.0886030197144

//For these tests we MUST do an array lookup,
//since that is normally the *point* of iteration
//i'm also calling noop on it so that PHP doesn't
//optimize out the loopup.
function noop( $value ) {}

//Create an array of increasing indexes, w/ random values
$bHash = range( 0, 999999 );
shuffle( $bHash );

$bstart1 = microtime(true);
for($i = 0; $i < 1000000; ++$i) noop( $bHash[$i] );
$bend1 = microtime(true);

$bstart2 = microtime(true);
$i = 0; while($i < 1000000) { noop( $bHash[$i] ); ++$i; }
$bend2 = microtime(true);


$bstart3 = microtime(true);
foreach( $bHash as $value ) { noop( $value ); }
$bend3 = microtime(true);

echo "for ".($bend1 - $bstart1)."\n"; //for 0.397135972977
echo "while ".($bend2 - $bstart2)."\n"; //while 0.364789962769
echo "foreach ".($bend3 - $bstart3)."\n"; //foreach 0.346374034882

3

Đó là năm 2020 và mọi thứ đã phát triển vượt bậc với php 7.4 và opcache .

Đây là điểm chuẩn OP ^, được chạy dưới dạng unix CLI , không có phần echo và html.

Kiểm tra chạy cục bộ trên một máy tính thông thường.

php -v

PHP 7.4.6 (cli) (built: May 14 2020 10:02:44) ( NTS )

Kịch bản điểm chuẩn đã sửa đổi:

<?php 
 ## preperations; just a simple environment state

  $test_iterations = 100;
  $test_arr_size = 1000;

  // a shared function that makes use of the loop; this should
  // ensure no funny business is happening to fool the test
  function test($input)
  {
    //echo '<!-- '.trim($input).' -->';
  }

  // for each test we create a array this should avoid any of the
  // arrays internal representation or optimizations from getting
  // in the way.

  // normal array
  $test_arr1 = array();
  $test_arr2 = array();
  $test_arr3 = array();
  // hash tables
  $test_arr4 = array();
  $test_arr5 = array();

  for ($i = 0; $i < $test_arr_size; ++$i)
  {
    mt_srand();
    $hash = md5(mt_rand());
    $key = substr($hash, 0, 5).$i;

    $test_arr1[$i] = $test_arr2[$i] = $test_arr3[$i] = $test_arr4[$key] = $test_arr5[$key]
      = $hash;
  }

  ## foreach

  $start = microtime(true);
  for ($j = 0; $j < $test_iterations; ++$j)
  {
    foreach ($test_arr1 as $k => $v)
    {
      test($v);
    }
  }
  echo 'foreach '.(microtime(true) - $start)."\n";  

  ## foreach (using reference)

  $start = microtime(true);
  for ($j = 0; $j < $test_iterations; ++$j)
  {
    foreach ($test_arr2 as &$value)
    {
      test($value);
    }
  }
  echo 'foreach (using reference) '.(microtime(true) - $start)."\n";

  ## for

  $start = microtime(true);
  for ($j = 0; $j < $test_iterations; ++$j)
  {
    $size = count($test_arr3);
    for ($i = 0; $i < $size; ++$i)
    {
      test($test_arr3[$i]);
    }
  }
  echo 'for '.(microtime(true) - $start)."\n";  

  ## foreach (hash table)

  $start = microtime(true);
  for ($j = 0; $j < $test_iterations; ++$j)
  {
    foreach ($test_arr4 as $k => $v)
    {
      test($v);
    }
  }
  echo 'foreach (hash table) '.(microtime(true) - $start)."\n";

  ## for (hash table)

  $start = microtime(true);
  for ($j = 0; $j < $test_iterations; ++$j)
  {
    $keys = array_keys($test_arr5);
    $size = sizeOf($test_arr5);
    for ($i = 0; $i < $size; ++$i)
    {
      test($test_arr5[$keys[$i]]);
    }
  }
  echo 'for (hash table) '.(microtime(true) - $start)."\n";

Đầu ra:

foreach 0.0032877922058105
foreach (using reference) 0.0029420852661133
for 0.0025191307067871
foreach (hash table) 0.0035080909729004
for (hash table) 0.0061779022216797

Như bạn có thể thấy sự tiến hóa là điên rồ, nhanh hơn khoảng 560 lần so với báo cáo năm 2012.

Trên máy móc và máy chủ của tôi, sau nhiều thử nghiệm của tôi, những điều cơ bản cho các vòng lặp là nhanh nhất. Điều này thậm chí còn rõ ràng hơn khi sử dụng các vòng lặp lồng nhau ( $ i $ j $ k ..)

Nó cũng linh hoạt nhất trong cách sử dụng và có khả năng đọc tốt hơn theo quan điểm của tôi.


0

Tôi nghĩ nhưng tôi không chắc chắn: forvòng lặp có hai thao tác để kiểm tra và tăng giá trị. foreachtải dữ liệu trong bộ nhớ sau đó nó sẽ lặp lại mọi giá trị.


7
Mọi người đều có ý kiến, mọi người đến Stack Overflow để tìm câu trả lời. Nếu bạn không chắc chắn về những gì bạn nêu, hãy kiểm tra mã nguồn, tài liệu, thực hiện tìm kiếm trên google, v.v.
Sebastien F.

Vì hiệu suất được dựa trên nghiên cứu và thử nghiệm, bạn nên đưa ra một số bằng chứng. Vui lòng cung cấp tài liệu tham khảo của bạn cho phù hợp. Hy vọng bạn có thể cải thiện câu trả lời của bạn.
Marwan Salim

Tôi nghĩ nó cũng phụ thuộc vào tải thực tế của máy chủ và những gì bạn muốn làm trong vòng lặp. Tôi nghĩ nó cũng phụ thuộc vào tải thực tế của máy chủ và những gì bạn muốn làm trong vòng lặp. Tôi muốn biết nếu lặp qua mảng được đánh số thì tốt hơn tôi nên sử dụng một foreach - hoặc for-loop, vì vậy tôi đã chạy một điểm chuẩn trên sandbox.onlinephpfifts.com với PHP 7.4. Tôi lặp đi lặp lại chạy cùng một số lần kịch bản và mỗi lần chạy cho tôi kết quả khác nhau. Một lần vòng lặp for nhanh hơn lần khác vòng lặp foreach và lần khác chúng bằng nhau.
Alexander Behling
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.