رتبه موضوع:
  • 0 رای - 0 میانگین
  • 1
  • 2
  • 3
  • 4
  • 5
performance برای new کردن کلاس
#1
سلام
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)"
no pain, no gain
پاسخ
تشکر شده توسط:
#2
بله چون اولی داره هربار سازنده رو صدا میزنه تا یک شئ جدید بسازه، هم مصرف حافظه و هم پردازش بیشتری داره. درسته که حافظه مربوط به شئ ایجاد شده، با رسیدن به انتهای هر دور foreach بدلیل اینکه متغیر داخل بلاک تعریف شده آزاد میشه ولی دوباره باید حافظه اختصاص داده بشه و درنتیجه، مراجعات به RAM هم زیاد میشه که خودش کمی سربار ایجاد میکنه. حتی اگه توی سازنده هیچ کاری انجام ندین، باز هم برای خود شئ باید حافظه گرفته بشه و آزاد بشه هربار.
پاسخ
تشکر شده توسط:
#3
به نظر میاد دومی پرفورمنس بهتری داره
ولی به شرطی که متغییر 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;






یادگیری مداوم حداقل شرط لازم برای موفقیت در هر زمینه ای است که در آن فعالیت می کنید؛ هر روز چیز جدیدی بیاموزید.
پاسخ
تشکر شده توسط:
#4
اگه unset کنن که دیگه توی دورهای بعدی حلقه ازش نمیتونن استفاده کنن. unset شدن بعد از بلاک foreach هم فکر میکنم ارتباطی به سؤال استارتر نداشته باشه چون پرفورمنس حلقه مدنظرشون بوده.
پاسخ
تشکر شده توسط:
#5
(29-03-1394، 07:30 ب.ظ)ADMIN نوشته: اگه unset کنن که دیگه توی دورهای بعدی حلقه ازش نمیتونن استفاده کنن. unset شدن بعد از بلاک foreach هم فکر میکنم ارتباطی به سؤال استارتر نداشته باشه چون پرفورمنس حلقه مدنظرشون بوده.

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

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

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

هست؟

یادگیری مداوم حداقل شرط لازم برای موفقیت در هر زمینه ای است که در آن فعالیت می کنید؛ هر روز چیز جدیدی بیاموزید.
پاسخ
تشکر شده توسط:
#6
منظورم این بود که اگه داخل حلقه unset بشه که دیگه روش اول و دوم فرقی نداره چون باید دوباره توی حلقه بسازیم شئ رو و اگه بیرون از حلقه unset بکنیم هم موضوع موردنظر استارتر نیست به عقیده من چون اینطور برداشت کردم که میخوان ببینن خود حلقه foreach توی حالت اول بهینه تره یا حالت دوم.
پاسخ
تشکر شده توسط:
#7
ممنون دوستان
چطوری می تونم benchmark بگیرم؟
no pain, no gain
پاسخ
تشکر شده توسط:
#8
نمونه کد رو گذاشتن. با کمک دستورات microtime و memory_get_usage میتونید زمان و حافظه رو بررسی کنید.
پاسخ
تشکر شده توسط: sorkhabi




کاربران در حال بازدید این موضوع: 1 مهمان