Ubuntu 12.04 - процессор высокой мощности

1) основано на том факте, что для вызова функции DLL всегда используется дополнительный косвенный переход. Сегодня это обычно незначительно. Внутри DLL есть некоторые дополнительные затраты на процессоры i386, потому что они не могут генерировать независимый от позиции код. На amd64 переходы могут быть относительно счетчика программы, так что это огромное улучшение.

2) Это правильно. Оптимизация, основанная на профилировании, обычно дает 10-15% производительности. Теперь, когда скорость процессора достигла своего предела, возможно, стоит сделать это.

Я бы добавил: (3) компоновщик может упорядочить функции в более эффективную кэш-группировку, чтобы минимизировать дорогостоящие пропуски уровня кеша. Это также может особенно повлиять на время запуска приложений (основываясь на результатах, которые я видел с компилятором Sun C ++)

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

По этим причинам, если нет реальной необходимости в DLL, просто используйте статическую компиляцию.

РЕДАКТИРОВАТЬ (чтобы ответить на комментарий, подчеркивание пользователя)

Вот хороший ресурс о проблеме кода, независимого от позиции http://eli.thegreenplace.net/2011/11/03/ position-independent-code-pic-in-shared-library /

Как объяснено, x86 не имеет их AFAIK ни для чего другого, кроме 15-битных диапазонов перехода, а не для безусловных переходов и вызовов. Вот почему функции (от генераторов), имеющие более 32K, всегда были проблемой и нуждались во встроенных батутах.

Но в популярных x86 ОС, таких как Linux, вам не нужно заботиться о том, чтобы файл SO / DLL не генерировался с помощью переключателя gcc -fpic (который обеспечивает использование таблиц косвенных переходов). Потому что, если вы этого не сделаете, код будет просто исправлен, как обычный компоновщик переместит его. Но при этом он делает сегмент кода недоступным для совместного использования, и ему потребуется полное отображение кода с диска в память и касание всего этого, прежде чем его можно будет использовать (очистка большей части кэшей, обращение к TLB) и т. Д. Было время когда это считалось медленным ... слишком медленным.

Так что вы больше не получите никакой пользы.

Я не помню, какие ОС (Solaris или FreeBSD) доставляли мне проблемы с моей системой сборки Unix, потому что я просто не делал этого и задавался вопросом, почему она вылетала, пока я не применил -fPIC к gcc.

1
задан 05.05.2020, 12:48

1 ответ

Может быть, старый пост, но.

У меня та же проблема с серверами Ubuntu, но нет проблем с серверами Debian, единственное различие, которое я обнаружил, было

Ubuntu

[ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete

debian

[ -x /usr/lib/php5/maxlifetime ] && [ -d /var/lib/php5 ] && find /var/lib/php5/ -depth -mindepth 1 -maxdepth 1 -type f -ignore_readdir_race -cmin +$(/usr/lib/php5/maxlifetime) ! -execdir fuser -s {} 2>/dev/null \; -delete

Так что попробуйте добавить -ignore_readdir_race к строке cron, и я думаю, что это сработает,

1
ответ дан 05.05.2020, 12:49

Теги

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