Сценарий PHP может выполнить общий код перед выходом ()?

Виртуальные функции только имеют очень маленькую производительность наверху по сравнению с прямыми вызовами. На низком уровне Вы в основном смотрите на поиск массива для получения указателя функции и затем вызова через указатель функции. Современные центральные процессоры могут даже предсказать косвенные вызовы функции обоснованно хорошо в их предикторах ответвления, таким образом, они обычно не будут повреждать современные конвейеры ЦП слишком ужасно. На уровне ассемблера вызов виртуальной функции переводит во что-то как следующее, где I произвольное непосредственное значение.

MOV EAX, [EBP + I] ; Move pointer to class instance into register
MOV EBX, [EAX] ;  Move vtbl pointer into register.
CALL [EBX + I]  ;   Call function

По сравнению со следующим для прямого вызова функции:

CALL I  ;  Call function directly

реальные издержки прибывают, в котором виртуальные функции не могут быть встроены по большей части. (Они могут быть на языках JIT, если VM понимает, что они всегда идут в тот же адрес во всяком случае.) Помимо ускорения Вы добираетесь от встраивания себя, встраивание включает несколько другой оптимизации, такой как сворачивание констант, потому что вызывающая сторона может знать, как вызываемый работает внутренне. Для функций, которые являются достаточно большими, чтобы не быть встроенными во всяком случае, хит производительности, вероятно, будет незначителен. Для очень небольших функций, которые могли бы быть встроены, именно тогда необходимо быть осторожны относительно виртуальных функций.

Редактирование: Другая вещь иметь в виду состоит в том, что все программы требуют управления потоком, и это никогда не свободно. Что заменило бы Вашу виртуальную функцию? Оператор переключения? Ряд если операторы? Это все еще ответвления, которые могут быть непредсказуемыми. Кроме того, учитывая N-путь ответвление, серия того, если операторы найдут надлежащий путь в O (N), в то время как виртуальная функция найдет его в O (1). Оператор переключения может быть O (N) или O (1) в зависимости от того, оптимизирован ли он к таблице переходов.

6
задан JasonMArcher 16 July 2015 в 16:41
поделиться

3 ответа

From the PHP help doco you can specify a function that is called after exit() but before the script ends.

Feel free to check the doco for more info http://us3.php.net/manual/en/function.register-shutdown-function.php

<?php
function shutdown()
{
    // This is our shutdown function, in 
    // here we can do any last operations
    // before the script is complete.

    echo 'Script executed with success', PHP_EOL;
}

register_shutdown_function('shutdown');
?>
20
ответ дан 8 December 2019 в 03:27
поделиться

if you use OOP then you could put the code you want to execute on exit into the destructor of your class.

class example{
   function __destruct(){
      echo "Exiting";
   }
}
6
ответ дан 8 December 2019 в 03:27
поделиться

Your example is probably too simplistic, as it can easily be re-written as follows:

if($result1 = task1()) {
    $result2 = task2();
}

common_code();
exit;

Perhaps you are trying to build flow-control like this:

do {
    $result1 = task1() or break;
    $result2 = task2() or break;
    $result3 = task3() or break;
    $result4 = task4() or break;
    // etc
} while(false);
common_code();
exit;

You can also use a switch():

switch(false) {
case $result1 = task1(): break;
case $result2 = task2(): break;
case $result3 = task3(): break;
case $result4 = task4(): break;
}

common_code();
exit;

Or in PHP 5.3 you can use goto:

if(!$result1 = task1()) goto common;
if(!$result2 = task2()) goto common;
if(!$result3 = task3()) goto common;
if(!$result4 = task4()) goto common;

common:
echo "common code\n";
exit;
3
ответ дан 8 December 2019 в 03:27
поделиться
Другие вопросы по тегам:

Похожие вопросы: