Замены в связываются в отдыхе / Сфинкс

Я стал любопытным и проверил ссылку Adam Backstrom на [1 110] Технология Ваша Вселенная . Эта статья описывает одну из причин, которые требуют, должен использоваться вместо require_once. Однако их требования не содержали до моего анализа. Я интересовался бы наблюдением, где я, возможно, ошибочно анализировал решение. Я использовал php 5.2.0 для сравнений.

я начал путем создания 100 заголовочных файлов, которые использовали require_once для включения другого заголовочного файла. Каждый из этих файлов смотрел что-то как:


я создал их с помощью быстрого взлома удара:

for i in /home/fbarnes/phpperf/hdr{00..99}.php; do
  echo " $i
  cat helper.php >> $i;
done

Этот путь я мог легко подкачать между использованием require_once и потребовать когда включая заголовочные файлы. Я тогда создал app.php для загрузки этих ста файлов. Это было похоже:


я контрастировал, require_once заголовки с требуют заголовков, которые использовали сходство с заголовочного файла:


я не нашел много различия, когда выполнение этого с требует по сравнению с require_once. На самом деле мои начальные тесты, казалось, подразумевали, что require_once был немного быстрее, но я не обязательно верю этому. Я повторил эксперимент с 10 000 входных файлов. Здесь я действительно видел последовательное различие. Я запустил тест многократно, результаты близки, но использующий require_once использует в среднем 30,8 пользовательского мига и 72,6 системного мига; использование требует использования в среднем 39,4 пользовательского мига и 72,0 системного мига. Поэтому кажется, что загрузка немного ниже использует require_once. Однако настенные часы немного увеличены. 10 000 вызовов require_once используют 10,15 секунд для завершения в среднем, и 10,000 требуют, чтобы вызовы использовали 9,84 секунд в среднем.

Следующий шаг должен изучить эти различия. Я использовал strace для анализа системных вызовов, которые делаются.

Прежде, чем открыть файл от require_once следующие системные вызовы сделаны:

time(NULL)                              = 1223772434
lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf/h", {st_mode=S_IFDIR|0755, st_size=270336, ...}) = 0
lstat64("/home/fbarnes/phpperf/h/hdr0.php", {st_mode=S_IFREG|0644, st_size=88, ...}) = 0
time(NULL)                              = 1223772434
open("/home/fbarnes/phpperf/h/hdr0.php", O_RDONLY) = 3

Это контрастирует с, потребуйте:

time(NULL)                              = 1223772905
lstat64("/home", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf", {st_mode=S_IFDIR|0755, st_size=4096, ...}) = 0
lstat64("/home/fbarnes/phpperf/h", {st_mode=S_IFDIR|0755, st_size=270336, ...}) = 0
lstat64("/home/fbarnes/phpperf/h/hdr0.php", {st_mode=S_IFREG|0644, st_size=146, ...}) = 0
time(NULL)                              = 1223772905
open("/home/fbarnes/phpperf/h/hdr0.php", O_RDONLY) = 3

Технология Ваша Вселенная подразумевает, что require_once должен выполнить больше lstat64 вызовов. Однако они оба делают то же количество вызовов lstat64. Возможно, различие - то, что я не выполняю APC для оптимизации кода выше. Однако следующая вещь, которую я сделал, была, сравнивают вывод strace для всех выполнений:

[fbarnes@myhost phpperf]$ wc -l strace_1000r.out strace_1000ro.out 
  190709 strace_1000r.out
  210707 strace_1000ro.out
  401416 total

Эффективно существует еще приблизительно два системных вызова на заголовочный файл при использовании require_once. Одно различие - то, что require_once имеет дополнительный вызов ко времени () функция:

[fbarnes@myhost phpperf]$ grep -c time strace_1000r.out strace_1000ro.out 
strace_1000r.out:20009
strace_1000ro.out:30008

другой системный вызов является getcwd ():

[fbarnes@myhost phpperf]$ grep -c getcwd strace_1000r.out strace_1000ro.out 
strace_1000r.out:5
strace_1000ro.out:10004

Это называют, потому что я решил к относительному пути, на который ссылаются в hdrXXX файлах. Если я делаю это абсолютной ссылкой, то единственной разницей является дополнительное время (ПУСТОЙ) вызов, выполненный в коде:

[fbarnes@myhost phpperf]$ wc -l strace_1000r.out strace_1000ro.out 
  190705 strace_1000r.out
  200705 strace_1000ro.out
  391410 total
[fbarnes@myhost phpperf]$ grep -c time strace_1000r.out strace_1000ro.out
strace_1000r.out:20008
strace_1000ro.out:30008

Это, кажется, подразумевает, что Вы могли сократить количество системных вызовов при помощи полных путей, а не относительных путей. Единственной разницей за пределами этого является время (ПУСТЫЕ) вызовы, которые, кажется, используются для того, чтобы оснастить код для сравнения то, что быстрее.

Еще одно примечание - то, что пакет оптимизации APC имеет опцию, названную "apc.include_once_override", который утверждает, что это сокращает количество системных вызовов, сделанных require_once и вызовами include_once (см. документы PHP ).

Извините за длинное сообщение. Я стал любопытным.

18
задан mzjn 18 July 2011 в 17:24
поделиться

2 ответа

Хорошо, вот как я это сделал. Сначала apilinks.py (расширение Sphinx):

from docutils import nodes, utils

def setup(app):
    def api_link_role(role, rawtext, text, lineno, inliner, options={},
                      content=[]):
        ref = app.config.apilinks_base + text
        node = nodes.reference(rawtext, utils.unescape(ref), refuri=ref,
                               **options)
        return [node], []
    app.add_config_value('apilinks_base', 'http://localhost/', False)
    app.add_role('apilink', api_link_role)

Теперь в conf.py добавьте 'apilinks' в список расширений и установите соответствующее значение для 'apilinks_base' (в противном случае по умолчанию будет 'http: // localhost /' ). Мой файл выглядит так:

extensions = ['sphinx.ext.autodoc', 'apilinks']
# lots of other stuff
apilinks_base = 'http://host:88/base/'

Использование:

:apilink:`path`

Вывод:

<a href="http://host:88/base/path">http://host:88/base/path</a>
4
ответ дан 30 November 2019 в 07:56
поделиться

Вы можете написать Sphinx расширение , которое создает роль , например

:apilink:`path` 

, и генерирует ссылку из нее. Я никогда этого не делал, поэтому ничем не могу помочь, кроме как указать этот указатель, извините. Вы должны попытаться посмотреть, как реализованы различные роли. Думаю, многие из них очень похожи на то, что вам нужно.

1
ответ дан 30 November 2019 в 07:56
поделиться
Другие вопросы по тегам:

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