متغير ثابت للتحسين
-
20-09-2019 - |
سؤال
أتساءل عما إذا كان بإمكاني استخدام متغير ثابت للتحسين:
public function Bar() {
static $i = moderatelyExpensiveFunctionCall();
if ($i) {
return something();
} else {
return somethingElse();
}
}
أعلم ذلك مرة واحدة $i
تتم تهيئته ، ولن يتم تغييره بواسطة هذا السطر من الكود على المكالمات المتتالية إلى Bar()
. أنا تولى القيام هذا يعني ذاك moderatelyExpensiveFunctionCall()
لن يتم تقييمها في كل مرة أتصل فيها ، لكنني أود أن أعرف على وجه اليقين.
بمجرد أن يرى PHP متغيرًا ثابتًا تمت تهيئته ، هل يتخطى هذا السطر من الكود؟ بمعنى آخر ، هل سيؤدي ذلك إلى تحسين وقت التنفيذ الخاص بي إذا قمت بإجراء الكثير من المكالمات Bar()
, أم أنا أضيع وقتي؟
المحلول
أجد أنه من الأسهل فعل شيء مثل الكود أدناه. وبهذه الطريقة يتم التخزين المؤقت على مستوى العالم بدلاً من تنفيذ الوظيفة.
function moderatelyExpensiveFunctionCall()
{
static $output = NULL;
if( is_null( $output ) ) {
//set $output
}
return $output;
}
نصائح أخرى
static $i = blah()
لن يتم تجميعها ، لأن PHP لا يسمح بالتعبيرات ومكالمات الوظائف في المهيئات الثابتة. أنت بحاجة إلى شيء مثل
function foo() {
static $cache = null;
if(is_null($cache)) $cache = expensive_func();
do something with $cache
}
يجب أن يعمل هذا في حالتك (بسيطة جدًا):
function your_function() {
static $output;
if (!isset($output)) {
$output = 'A very expensive operation';
}
return $output;
}
أما بالنسبة لآلية التخزين المؤقت العالمية ، يمكنك استخدام طريقة مشابهة لطريقة هذا.
هنا نهج أقصر تماما:
function stuff()
{
static $smthg = []; // or null, or false, or something else
if ($smthg) {
return $smthg;
}
// filling $smthg goes here
// with a lot of
// code strings
return $smthg;
}
ماذا عن:
if (!isset($i))
{
static $i = moderatelyExpensiveFunctionCall();
}