Описание тега monitor-calibration
Решена в bash 5.0
Фон
На фоне (и понимание (и пытается избежать минусами этот вопрос, кажется, привлекает)) я объясню путь, который меня к этому вопросу (ну, максимум, что я могу вспомнить через два месяца).
Предположим, вы делаете несколько тестов Shell для списка символов Юникода:
е "$(е '\\У%Х ' {33..200})"
и есть более 1 миллиона символов Unicode, тестирование 20.000 из них, кажется, не так много.
Также предполагается, что набор символов как позиционные аргументы:
комплект -- $(е "$(е '\\У%Х ' {33..20000})")
с целью передачи символов для каждой функции, чтобы обрабатывать их по-разному. Поэтому функции должны быть в форме тест1 "$@"
или подобные. Теперь я понимаю, насколько плохой идеей это в bash.
Теперь, предположим, что существует необходимость времени ( Н=1000 ) каждое решение, чтобы выяснить, что лучше, при таких условиях вы получите с аналогичной структурой:
#!/бин/Баш --
Timeformat компонента='реальный: %р' # '%р %У %Ы'
комплект -- $(е "$(е '\\У%Х ' {33..20000})")
Н=1000
тест1(){ Эхо "$1"; } >/dev/нуль
условие_2(){ Эхо "$#"; } >/dev/нуль
test3(){ :; }
main1(){ время для меня в $(сл $Н); сделать тест1 "$@"; сделано
время для меня в $(сл $Н); делать условие_2 "$@"; сделано
время для меня в $(сл $Н); делать test3 "$@"; сделано
}
main1 "$@"
Функции тест#
сделаны очень просто, чтобы быть представлены здесь.
Оригиналы были постепенно сокращены, чтобы найти, где была огромная задержка.
Скрипт выше работает, вы можете запустить его и тратить несколько секунд, этого очень мало.
В процессе упрощения, чтобы найти, где именно задержка была (и уменьшения каждая функция критерия для того чтобы почти ничего не крайнюю после долгих разбирательств) я решил снять прохождение аргументы для каждого функция критерия для того чтобы выяснить, сколько времени улучшилась, только фактор 6, не много.
Чтобы попробовать себя, удалить все "$@"
в функции main1
(или сделать копию) и проверить еще раз (или как main1
и копия main2
(с main2 "$@"
)), чтобы сравнить. Это базовая структура внизу, в исходном посте (ОП).
Но я задался вопросом: почему принимая оболочка, которая долго "ничего не делать"?. Да, только "пару секунд", но все-таки, почему?.
Это заставило меня проверить в других оболочках, чтобы обнаружить, что только Баш этот вопрос.
Попробовать КШ ./сценарий
(один и тот же сценарий, что и выше).
Это привело к данному описанию: вызов функции (тест#
) без каких-либо аргументов будет отложен на аргументы в родительской (главной#
). Это описание, которое следует, и был исходный пост (ОП) ниже.
Оригинальный пост.
Вызов функции (в bash 4.4.12(1)-релиз) делать нечего Ф1(){ :; }
в тысячу раз медленнее, чем :
но только если есть аргументы, заданные в родительской вызова функции, почему?
#!/бин/Баш
Timeformat компонента='реальный: %Р'
Ф1 () { :; }
Ф2 () {
Эхо " параметр args = $#";
функция printf '1 нет аргументов да; время ((я=1;я<н$; я++)); у : ; сделано
е '2 да функция аргументы да; время ((я=1;я<$н;я++)); сделать Ф1 ; сделано
комплект --
функция printf '3 да аргументов нет '; время ((я=1;я<н$; я++)); сделать Ф1 ; сделано
Эхо
}
main1() { комплект -- $(сл $м)
Ф2 ""
Ф2 "$@"
}
Н=1000 м; M=20000; main1
Результаты условие_1
:
параметр args = 1
1 функция без аргументов да Реал: 0.013
2 да функция аргументы да Реал: 0.024
Функция 3 да аргументов нет реальных: 0.020
параметр args = 20000
1 функция без аргументов да Реал: 0.010
Функция 2 Да да реальные аргументы: 20.326
Функция 3 да аргументов нет реальных: 0.019
Аргументов нет, ни ввода или вывода, используемые в функции Ф1
, задержка в тысячу (1000) является неожиданным.1
Продление анализов в несколько снарядов, результаты совпадают, большинство снарядов не иметь никаких проблем, ни страдать от задержки (те же n и М используются):
условие_2(){
для Ш в тире МКШ КШ ЗШ Баш b50sh
делать
Эхо "$Ш" >&2
# \время -ф '\т%е' сл "$м" >/dev/нуль
# \время -ф '\т%е' "$ш" -с 'комплект -- $(сл '"$м"'); ибо я делаю :; сделано'
время \- ф '\т%е' "$ш" -с 'ф(){ :;}; А [ "$((я+=1))" -л '"$н"' ]; у : ; сделано;' $(сл $м)
время \- ф '\т%е' "$ш" -с 'ф(){ :;}; А [ "$((я+=1))" -л '"$н"' ]; ж ; молодец;' $(сл $м)
сделано
}
условие_2
Результаты:
черточки
0:00.01
0:00.01
МКШ
0:00.01
0:00.02
КШ
0:00.01
0:00.02
ЗШ
0:00.02
0:00.04
Баш
0:10.71
0:30.03
b55sh # - без-Баш-Танос
0:00.04
0:17.11
b56sh RELSTATUS # =релиз
0:00.03
0:15.47
b50sh # отладка включена (RELSTATUS=Альфа)
0:04.62
ХХХХХХХ более суток ......
Раскомментируйте две другие тесты, чтобы подтвердить, что ни сл
или обработка списке аргументов является источником задержки.
1 это известно, что передавая результаты по доводам увеличит время выполнения. Спасибо @ОДС