⊗ppSpOtAU 82 of 83 menu

PHP-ში არასაჭირო მასივების ოპტიმიზაცია

დავუშვათ, რომ ერთი პროგრამისტის წინაშე დასახულია ამოცანა იპოვოს მთელი რიცხვების ჯამი 1-დან 100000000-მდე.

ჩვენმა პროგრამისტმა დაწერა ამ ამოცანის ელეგანტური გადაწყვეტა, აი ასე:

<?php echo array_sum(range(1, 100000000)); ?>

ლამაზი გადაწყვეტაა, არა? ერთ სტრიქონში და ამდენი რამ. მაგრამ ის არ მუშაობს! სცადეთ გაუშვათ ეს კოდი და ის ეკრანზე გამოიტანს შეცდომას იმის შესახებ, რომ თქვენ მოგითხოვეთ ზედმეტად ბევრი ოპერატიული მეხსიერება.

ჰმ, 100000000 როგორც ჩანს არ არის ძალიან ბევრი? თუ მაინც ბევრია? მოდით გამოვთვალოთ. ფუნქცია range ქმნის მასივს 100000000 რიცხვით. დავუშვათ, რომ PHP რიცხვისთვის 2 ბაიტს იკავებს - მაშინ ჩვენი მასივის შესანახად დაგვჭირდება 200000000 ბაიტი, ანუ დაახლოებით 200 მეგაბაიტი ოპერატიული მეხსიერების.

მაგრამ სინამდვილეში ოპერატიული მეხსიერება ბევრად მეტი დასჭირდება იმის გამო, რომ PHP-ში ძალიან დიდია ზედნადები ხარჯები მასივის შენახვისას. მაგალითად, ჩემთან ტექსტში შეცდომა მიმანიშნებს, რომ მე ვცდილობ გამოვყო 4294967304 ბაიტი - დაახლოებით 4 გიგაბაიტი!

ახლა გასაგებია, რატომ ჩნდება შეცდომა - ჩვენ ბევრად გავცდით დაშვებულ მეხსიერების ლიმიტს.

არაა რთული ჩვენი სკრიპტის სხვაგვარად გადაწერა, პრაქტიკულად ოპერატიულ მეხსიერებას არ მოიხმარს:

<?php $sum = 0; for ($i = 1; $i <= 100000000; $i++) { $sum += $i; } echo $sum; ?>

ან კიდევ უკეთესი, გამოვიყენოთ მათემატიკური გადაწყვეტა:

<?php $n = 1000000; $sum = $n * ($n + 1) / 2; echo $sum; ?>

ერთი პროგრამისტის წინაშე დასახული იყო ამოცანა ეპოვნა მოცემული რიცხვის ფაქტორიალი. მან მოაგვარა იგი შემდეგნაირად:

<?php $n = 100; echo array_product(range(1, $n)); ?>

ახსენით, რა არასწორია ამ კოდში. გადაწერეთ კოდი უფრო ოპტიმალურად.

ერთი პროგრამისტის წინაშე დასახული იყო ამოცანა ეპოვნა ციფრთა რაოდენობა, რომლებითაც შესაძლებელია ჩაიწეროს ყველა მთელი რიცხვი 1-დან 1000000-მდე. მან მოაგვარა იგი შემდეგნაირად:

<?php echo strlen(implode('', range(1, 1000000))); ?>

ახსენით, რა არასწორია ამ კოდში. გადაწერეთ კოდი უფრო ოპტიმალურად.

ერთი პროგრამისტის წინაშე დასახული იყო ამოცანა ეპოვნა რიცხვების რაოდენობა, რომლებიც ნაშთის გარეშე იყოფიან 7-ზე, მოცემულ ინტერვალში მდებარე. მან მოაგვარა იგი შემდეგნაირად:

<?php $arr = []; for ($i = 0; $i <= 1000; $i++) { if ($i % 7 == 0) { $arr[] = $i; } } echo count($arr); ?>

ახსენით, რა არასწორია ამ კოდში. გადაწერეთ კოდი უფრო ოპტიმალურად.

ერთი პროგრამისტის წინაშე დასახული იყო ამოცანა ეპოვნა რიცხვის გამყოფთა ჯამი. მან მოაგვარა იგი შემდეგნაირად:

<?php $num = 320; $divs = []; for ($i = 0; $i <= $num; $i++) { if ($num % $i == 0) { $divs[] = $i; } } echo array_sum($divs); ?>

ახსენით, რა არასწორია ამ კოდში. გადაწერეთ კოდი უფრო ოპტიმალურად.

ქართული
AfrikaansAzərbaycanБългарскиবাংলাБеларускаяČeštinaDanskDeutschΕλληνικάEnglishEspañolEestiSuomiFrançaisहिन्दीMagyarՀայերենIndonesiaItaliano日本語Қазақ한국어КыргызчаLietuviųLatviešuМакедонскиMelayuမြန်မာNederlandsNorskPolskiPortuguêsRomânăРусскийසිංහලSlovenčinaSlovenščinaShqipСрпскиSrpskiSvenskaKiswahiliТоҷикӣไทยTürkmenTürkçeЎзбекOʻzbekTiếng Việt
ვებსაიტის მუშაობის, ანალიტიკისა და პერსონალიზაციისთვის ვიყენებთ ქუქი-ფაილებს. მონაცემთა დამუშავება ხდება Კონფიდენციალურობის პოლიტიკის შესაბამისად.
ყველას მიღება პარამეტრები უარყოფა