تالار گفتمان nCIS.ir

نسخه‌ی کامل: performance برای new کردن کلاس
شما در حال مشاهده نسخه آرشیو هستید. برای مشاهده نسخه کامل کلیک کنید.
سلام
performance این دوتا کد خیلی فرق می کنه؟

foreach($model->images as $image){
    $imagine = (new Imagine())->open(Yii::$app->basePath . '/../all_assets/uploads/' . $img->name);
   $imagine->resize($imagine->getSize()->widen(200))->save(Yii::$app->basePath . '/../all_assets/uploads/thumb_' . $img->name);
}// end of "foreach($model->images as $image)"

$obj = new Imagine();                    
foreach($model->images as $image){
   $imagine = $obj->open(Yii::$app->basePath . '/../all_assets/uploads/' . $img->name);
   $imagine->resize($imagine->getSize()->widen(200))->save(Yii::$app->basePath . '/../all_assets/uploads/thumb_' . $img->name);
}// end of "foreach($model->images as $image)"
بله چون اولی داره هربار سازنده رو صدا میزنه تا یک شئ جدید بسازه، هم مصرف حافظه و هم پردازش بیشتری داره. درسته که حافظه مربوط به شئ ایجاد شده، با رسیدن به انتهای هر دور foreach بدلیل اینکه متغیر داخل بلاک تعریف شده آزاد میشه ولی دوباره باید حافظه اختصاص داده بشه و درنتیجه، مراجعات به RAM هم زیاد میشه که خودش کمی سربار ایجاد میکنه. حتی اگه توی سازنده هیچ کاری انجام ندین، باز هم برای خود شئ باید حافظه گرفته بشه و آزاد بشه هربار.
به نظر میاد دومی پرفورمنس بهتری داره
ولی به شرطی که متغییر obj رو  unset کنید.

بعلاوه میتونید بنچ مارک هم بگرید



$start_time = microtime(true);
$start_mem  = memory_get_usage(true);


foreach($model->images as $image){
    $imagine = (new Imagine())->open(Yii::$app->basePath . '/../all_assets/uploads/' . $img->name);
   $imagine->resize($imagine->getSize()->widen(200))->save(Yii::$app->basePath . '/../all_assets/uploads/thumb_' . $img->name);
}// end of "foreach($model->images as $image)"


$time = microtime(true) - $start_time;
$mem  = memory_get_usage(true) - $start_mem;

echo "Test 1 <br /> Time :".$time."<br/> MEM = ".$mem;




$start_time = microtime(true);
$start_mem  = memory_get_usage(true);


$obj = new Imagine();                    
foreach($model->images as $image){
   $imagine = $obj->open(Yii::$app->basePath . '/../all_assets/uploads/' . $img->name);
   $imagine->resize($imagine->getSize()->widen(200))->save(Yii::$app->basePath . '/../all_assets/uploads/thumb_' . $img->name);
}// end of "foreach($model->


$time = microtime(true) - $start_time;
$mem  = memory_get_usage(true) - $start_mem;

echo "Test 2 <br /> Time :".$time."<br/> MEM = ".$mem;





اگه unset کنن که دیگه توی دورهای بعدی حلقه ازش نمیتونن استفاده کنن. unset شدن بعد از بلاک foreach هم فکر میکنم ارتباطی به سؤال استارتر نداشته باشه چون پرفورمنس حلقه مدنظرشون بوده.
(29-03-1394، 07:30 ب.ظ)ADMIN نوشته: [ -> ]اگه unset کنن که دیگه توی دورهای بعدی حلقه ازش نمیتونن استفاده کنن. unset شدن بعد از بلاک foreach هم فکر میکنم ارتباطی به سؤال استارتر نداشته باشه چون پرفورمنس حلقه مدنظرشون بوده.

کدوم دوره بعدی؟

بعد foreach اگه بهش نیازی نداشته باشه
unset میکنه

اتفاقا unset شدن بعد از بلاک foreach هم فکر میکنم مد نظرشون باشه
و اگه هم نباشه باز یی تاثیر نیست

هست؟
منظورم این بود که اگه داخل حلقه unset بشه که دیگه روش اول و دوم فرقی نداره چون باید دوباره توی حلقه بسازیم شئ رو و اگه بیرون از حلقه unset بکنیم هم موضوع موردنظر استارتر نیست به عقیده من چون اینطور برداشت کردم که میخوان ببینن خود حلقه foreach توی حالت اول بهینه تره یا حالت دوم.
ممنون دوستان
چطوری می تونم benchmark بگیرم؟
نمونه کد رو گذاشتن. با کمک دستورات microtime و memory_get_usage میتونید زمان و حافظه رو بررسی کنید.