Петлі оболонки повільні, а баш - найповільніші. Снаряди не призначені для важкої роботи в петлях. Оболонки призначені для запуску декількох зовнішніх, оптимізованих процесів на партіях даних.
У всякому разі, мені було цікаво, як порівнюють петлі оболонки, тому я зробив невеликий орієнтир:
#!/bin/bash
export IT=$((10**6))
echo POSIX:
for sh in dash bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'i=0; while [ "$IT" -gt "$i" ]; do i=$((i+1)); done'
done
echo C-LIKE:
for sh in bash ksh zsh; do
TIMEFORMAT="%RR %UU %SS $sh"
time $sh -c 'for ((i=0;i<IT;i++)); do :; done'
done
G=$((10**9))
TIMEFORMAT="%RR %UU %SS 1000*C"
echo 'int main(){ int i,sum; for(i=0;i<IT;i++) sum+=i; printf("%d\n", sum); return 0; }' |
gcc -include stdio.h -O3 -x c -DIT=$G -
time ./a.out
(
Детальніше:
- CPU: Intel (R) Core (TM) i5 CPU M 430 при 2,27 ГГц
- ksh: версія sh (AT&T Research) 93u + 2012-08-01
- bash: GNU bash, версія 4.3.11 (1) -випуск (x86_64-pc-linux-gnu)
- zsh: zsh 5.2 (x86_64-unknown-linux-gnu)
- тире: 0,5,7-4ubuntu1
)
Результати (скорочені) (час на ітерацію):
POSIX:
5.8 µs dash
8.5 µs ksh
14.6 µs zsh
22.6 µs bash
C-LIKE:
2.7 µs ksh
5.8 µs zsh
11.7 µs bash
C:
0.4 ns C
З результатів:
Якщо ви хочете трохи швидший цикл оболонки, то якщо у вас є [[
синтаксис і ви хочете швидкий цикл оболонки, ви перебуваєте в розширеній оболонці і у вас є також C-подібний цикл. Тоді використовуйте C як для циклу. Вони можуть бути приблизно в 2 рази while [
швидшими, ніж -крутки в одній оболонці.
- ksh має найшвидший
for (
цикл приблизно в 2,7 мкс за ітерацію
- тире має найшвидший
while [
цикл приблизно 5,8 мкс за ітерацію
C для циклів може бути на 3-4 десяткові порядки швидше. (Я чув, як Торвальди люблять С).
Оптимізований C для циклу в 56500 разів швидший, ніж while [
цикл bash (найповільніший цикл оболонок) і в 6750 разів швидший, ніж for (
цикл ksh (найшвидший цикл оболонки).
Знову ж таки, повільність оболонок не повинна мати великого значення, тому що типова схема з оболонками полягає у перевантаженні на кілька процесів зовнішніх, оптимізованих програм.
За допомогою цього шаблону оболонки часто полегшують написання сценаріїв із ефективністю, що перевершує сценарії python (останній раз, коли я перевіряв, створення технологічних конвеєрів у python було досить незграбним).
Ще одна річ, яку слід врахувати - час запуску.
time python3 -c ' '
на моєму ПК займає від 30 до 40 мс, тоді як оболонки займають близько 3 мс. Якщо ви запускаєте багато сценаріїв, це швидко додається, і ви можете зробити дуже багато за додаткові 27-37 мс, які пітон потребує лише для початку. Невеликі сценарії можуть бути завершені кілька разів у цей період часу.
(NodeJs - це, мабуть, найгірший сценарій виконання в цьому відділі, оскільки для початку потрібно близько 100 мс (хоча, як тільки він розпочнеться, вам буде важко натиснути, щоб знайти кращого виконавця серед мов сценаріїв)).