Существует ли потенциальная потеря производительности при использовании нескольких вызовов nodeapi вместо одного?


У меня довольно большой сайт с несколькими пользовательскими модулями. Я начал разбивать некоторые из более крупных модулей на более мелкие, более удобные для обслуживания.

У меня есть один конкретный модуль, который я разделяю на три. У него есть функция hook_nodeapi, которая выполняет разные функции, будет ли большая потеря производительности при разделении одного вызова nodeapi на 2 или 3? Кто-нибудь проводил какие-либо тесты по этому вопросу?

Author: digital, 2011-07-22

1 answers

При использовании дополнительных модулей происходит снижение производительности. В основном из-за большего количества открывающего синтаксического анализа и function_exists() и использования памяти.

Api узла в 6 будет вызываться для каждого действия узла и вызываться для каждого узла. (в 7 узлах можно использовать несколько узлов одновременно, и для каждого действия есть отдельный крючок)

Так что, если вы будете осторожны:

  • Поместите весь свой код в переключатель ($op);
  • Проверьте типы контента, чтобы работать над тем, что вам нужно
  • Сохраняйте запросы к БД в минимум

Накладных расходов будет немного (некоторые, но не подавляющие).

Если, с другой стороны, ваш вызов nodapi, общий доступ к запросам БД (или может совместно использовать запросы БД), имеет много общих настроек/кода, то вы можете начать снижать производительность.

Один из способов обойти это - быть немного более избирательным в отношении кода, который вы включаете:

mymodule_nodeapi($op, ...) {
 switch($op) {
  case 'load':
    // Insert common code here.
    if ($node->type == 'my_complex_node_type') {
      module_load_include('inc', 'mymodule', 'complex_type');
      mymodule_complex_load($node);
    elseif ($node->type == 'some_other_node_type') {
      module_load_include('inc', 'mymodule', 'other_type');
      mymodule_other_load($node);
    }  
  break; 
 }
}

Грубый псевдокод

Вы можете хранить свой код в отдельных файлах, чтобы повысить удобство обслуживания и сократите время загрузки, так как файлы включаются/анализируются только при необходимости.

Недостатком является то, что вам нужно самостоятельно управлять включением и обратным вызовом, а не полагаться на module_invoke_all.

 1
Author: Jeremy French, 2011-07-22 12:58:20