Почему “эхо” настолько быстрее, чем “касание”?

.gnome2/содержит конфигурационные файлы для приложений, во многом как .config/. Однако .config/является стандартами, совместимыми (FreeDesktop). В то время как .gnome2/существует, чтобы использоваться теперь обесцениваемой конфигурацией гнома. .gnome2_private/похож на .gnome2/, но для конфигурационных файлов, которые должны быть частными.

gconf.xml.mandatory и gconf.xml.defaults являются XML для настольных настроек как Ваш локальный .gconf. gconf, использует все три для конфигурирования рабочего стола. .mandatory не может быть отредактирован обычным пользователем, делая это полезным для киосков и компьютеров общедоступного использования, в то время как .defaults является основой, из которой читаются все настольные настройки по умолчанию.

В порядке приоритета .mandatory прибывает выше (Ваше локальное) .gconf, который в свою очередь прибывает выше .defaults. Если ключ будет установлен в .mandatory, то тот же ключ .gconf и .defaults будут проигнорированы. Аналогично, ключ не набор в .mandatory, но набор в .gconf, переопределит тот же ключ .defaults.

Это также имеет место для .path.mandatory и .path.defaults - кроме они используются, чтобы установить местоположение источников конфигурации, вместо того, чтобы описать саму конфигурацию.

116
24.07.2014, 13:47
3 ответа
[1129448] В bash, [1129860] touch[1129861] - внешний двоичный код, но [1129862]echo[1129863] - встроенная оболочка [1129864] [1129865]: Поскольку [1129866] touch[1129867] - это внешний двоичный файл, и вы вызываете [1129868] touch[1129869] один раз для каждого файла, оболочка должна создать 300,000 экземпляров [1129870] touch[1129871], что занимает много времени. Однако, [12151]echo[1129873] является сборкой оболочки, и выполнение сборки оболочки не требует блокировки. Вместо этого, текущая оболочка выполняет все операции и не создает никаких внешних процессов; вот почему она намного быстрее.[12152]Вот два профиля операций оболочки. Вы можете видеть, что много времени тратится на клонирование новых процессов при использовании [1129874]touch[1129875]. Использование [1129876]/bin/echo[1129877] вместо сборки оболочки должно показать гораздо более сопоставимый результат.[12153]Использование touch[12154]Использование echo[12155]
160
27.01.2020, 19:29
[12156]echo[1129879] является сборкой оболочки. С другой стороны, [1129880]touch[1129881] - это внешний двоичный код.[12157]-оболочка сборки [1129883] работает намного быстрее, так как при загрузке программы нет накладных расходов, т.е. отсутствует [1129884]-форка[1129885]/[1129886]-исполнение [1129887]. Таким образом, при выполнении сборки вы можете заметить значительную разницу во времени по сравнению с внешней командой.[12158]По этой причине утилиты типа [1129888]time[1129889] доступны как сборки оболочки.[12159]Полный список сборок оболочки можно получить, сказав:[12160]Как упоминалось выше, использование утилиты [1129890]/[1129891] в отличие от [1129892]builtin[1129893] приводит к значительному снижению производительности. Ниже приведена статистика времени, затрачиваемого на создание ~9000 файлов с помощью [1129894]builtin[12161]echo[1129897] и утилиты [1129898] echo[12162]echo[1129901]:[12163]
29
27.01.2020, 19:29
[1130152] Как ответили другие, использование [1130525] echo[1130526] будет быстрее, чем [1130527] touch[1130528], так как [1130529] echo[1130530] - это команда, которая обычно (хотя и не требуется) встроена в оболочку. Ее использование избавляет от накладных расходов ядра, связанных с запуском нового процесса для каждого файла, который вы получаете с помощью [1130531]touch[1130532].

Однако, обратите внимание, что самым быстрым способом достижения этого эффекта все же является использование [1130533]touch[1130534], но вместо того, чтобы запускать программу один раз для каждого файла, можно использовать опцию [1130535]-exec[1130536] с помощью [1130537] find[1130538], чтобы убедиться, что она выполняется только несколько раз. Такой подход обычно будет более быстрым, так как он позволяет избежать накладных расходов, связанных с циклом оболочки:

/nonew

Используя [1130539]+[1130540] (в отличие от [1130541]\;[1130542]) с помощью [1130543] найти ... -exec[1130544] выполняет команду только один раз, если это возможно, с каждым файлом в качестве аргумента. Если список аргументов очень длинный (как в случае с 300,000 файлами), то будет сделано несколько запусков со списком аргументов, длина которого близка к пределу ([1130545]ARG_MAX[1130546] на большинстве систем).

Другим преимуществом этого подхода является то, что он ведет себя надежно с именами файлов, содержащими все пробельные символы, чего нельзя сказать о первоначальном цикле.[1130159].

71
27.01.2020, 19:29

Теги

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