Таблица стоимости выполнения функций PHP - PullRequest
0 голосов
/ 24 июля 2009

Существует справочная таблица, которая показывает стоимость выполнения каждой функции php?

Я знаю, что время выполнения связано со многими факторами и невозможно определить уникальное значение,но я ищу «идеологическую» таблицу.

Например,

is_dir() = cost 3
is_file() = cost 2

(возьмем это просто в качестве примера;)

Если я не помню плохо, дляC есть таблица с циклами процессора, необходимыми для каждой операции.

РЕДАКТИРОВАТЬ : я читаю все ваши комментарии, и поэтому есть любая таблица для моих нужд.

Во всяком случае, я знаю, что

is_dir('/');//is faster than
is_dir('/a/very/long/path/to/check/');

Но у меня есть некоторые трудности, чтобы принять эту ситуацию (что, если я правильно понял ваши слова, возможно);

$a = '/';
$b = '/a/very/long/path/to/check/';
is_dir($a);  //time execution 0.003
is_file($a); //time execution 0.005
//so suppose is_dir is faster than is_file
//(still example, function names and number are random ;)
is_dir($b);  //time execution 0.013
is_file($b); //time execution 0.009
//wow, now is faster is_file()....?

Ответы [ 7 ]

4 голосов
/ 24 июля 2009

Такой график не будет полезным или точным. В вашем примере время выполнения функции во многом будет зависеть от деталей локальной системы регистрации и быстро станет бессмысленным.

Единственный верный способ измерить производительность - это построить свой код, а затем рассчитать его время. Это быстрее, чем в то время? Может быть, один будет лучше, чем другой в одной ситуации, тогда как другой будет быстрее в другой ситуации, в зависимости от всех факторов, которые будут специфичны для кода внутри.

Время вашего кода, используя профилировщики получите некоторые значимые данные, которые подходят для вашего проекта в среде вашего сервера.

1 голос
/ 24 июля 2009

Я думаю, что такая таблица вообще не может существовать.

Прежде всего, время сильно зависит от ввода. Но это не такая проблема для множества функций. Мы могли бы указать алгоритмическую сложность: O (n ^ 2), O (n log (n)) и так далее. У нас есть отличный математический аппарат для работы с такими вещами.

Более важная вещь - это окружающая среда. Вы не могли предсказать, как долго будет работать функция, потому что вы не знаете всю среду. file_exists () на томе NFS будет работать не так быстро, как на локальном томе ext3. Вы не могли бы предсказать, как долго запрос будет передан на сервер MySQL и т. Д.

Итак, что вы должны сделать - это измерить, измерить и измерить. Зависит только от ваших собственных измерений и вашего окружения. Это единственный способ.

1 голос
/ 24 июля 2009

Я не знаю такой таблицы.

Стоимость функции будет сильно варьироваться в зависимости от ввода.

Массив из 1000 элементов, обрабатываемый array_unique (), займет больше времени, чем та же функция с входным массивом из 5 элементов.

Если вы заинтересованы в настройке своего приложения, вы можете использовать microtime для определения времени выполнения каждого вызова функции.

Это будет выглядеть примерно так

$starttime = microtime();
is_dir('/var/foo');
$stoptime = microtime();
echo "is_dir cost: ".($stoptime-$startime);
0 голосов
/ 04 января 2012

Используйте register_tick_function и Declare (ticks = 1). Они существуют с PHP4 и обеспечивают низкоуровневый подсчет команд. Я собираюсь представить, что это достигается путем подсчета инструкций, генерируемых во время интерпретации и выполнения кодов операций PHP.

0 голосов
/ 07 июля 2010

Самое близкое, что вы получите, - это анализ OpCode с помощью Vulcan Logic Dumper (ссылка на страницу автора / домашнюю страницу проекта) , который раньше назывался Vulcan Logic Disassembler (ссылка PECL). Сара Големон имеет хорошую информацию об этом материале на ее блоге .

0 голосов
/ 24 июля 2009

Я не думаю, что существует такая вещь, как таблица затрат на функции, потому что одна и та же функция может иметь очень разные затраты в зависимости от контекста.

Например (но просто возьмите это как пример!):

is_dir('/'); //will be very fast
is_dir('/symbolic_link/symbolic_link_on_a_remote_fs/'); //will be way slower

Тем не менее, оценка затрат на вызовы функций может быть очень хорошим подходом к оптимизации.

Работа с профилировщиком может помочь вам понять, что некоторые конкретные вызовы функций в вашем кодемедленнее, чем хотелось бы, и переосмысление / переписывание этих частей может значительно ускорить процесс.

0 голосов
/ 24 июля 2009

Вы не можете "подсчитывать инструкции", как это делается для PHP. Даже с C это будет зависеть от реализации libc.

...