2

Мой друг, известный своим бесчеловечным отношением к машинам, хотел подчеркнуть нагрузку на их процессор и поэтому написал одну строчку:

for z in {1..100000000};do num1=$(($z * $z)) && echo $num1;done

При выполнении этот цикл просто не выводится, а быстрый взгляд top показывает, что bash потребляет огромные объемы памяти (гигабайты через несколько минут).

Как написано, я ожидаю, что этот процесс будет выполняться последовательно - например, передать переменную z , вычислить ее, повторить результат, повторить.

Вместо этого, попытка сделать это с меньшими верхними границами заставляет все выглядеть так, как будто все рассчитывается заранее, а затем массово выводится на экран. Как в, он сидит на мгновение, делая вычисления, а затем делает echo все сразу.

Почему этот цикл ведет себя так?

1 ответ1

4

Как описано здесь, оператор диапазона строит диапазон (создает массив целых чисел) перед тем, как позволить вам что-то с ним сделать, например перебрать его. Вам может быть лучше с циклом while:

 z=1 ; while [[ $z -le 100000000 ]] ; do num1=$(($z * $z)) && echo $num1 ; z=$(($z + 1)) ; done

(Хотя это вряд ли сильно нагружает процессор, так как эхо вызывает некоторое облегчение. Моя собственная система достигает только 30% использования при выполнении этого.)

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .