Очистить историю терминала после закрытия less

Одна проблема заключается в том, что вы делаете:

while : loop
do    : processing
      echo "$results" >>output
done  <input

Это приведет к незначительному увеличению времени выполнения на итерацию просто потому, что вывод повторяется постоянно * open () * ed с немного большим смещением, чем в прошлый раз. Я говорю поминутно , потому что практически нет разницы в том, сколько времени требуется, чтобы открыть файл с более ранним смещением, чем с более поздним, но есть некоторые . И каждый раз, когда вы open () O_APPEND , вы делаете это на немного большей позиции, чем ypu в прошлый раз. Сколько времени это займет, зависит от конфигурации диска / базовой файловой системы, но я думаю, что вполне разумно предположить, что будет некоторая стоимость на одно событие, и что она в некоторой степени увеличится по мере того, как размер файла также делает.

Вместо этого вам, вероятно, следует сделать только одну open () и поддерживать дескриптор write () на протяжении всего цикла. Вы можете сделать что-то вроде:

while : loop
do    : processing
      echo "$results"
done  <input >>output

Это не может быть основной причиной. Для меня это наиболее очевидная причина, которая может быть напрямую связана с увеличением количества итераций, но в вашем цикле происходит многое, чего, вероятно, быть не должно. Вам почти наверняка не следует выполнять 10 или более оценок данных с подсистемой на итерацию цикла. Лучшей практикой было бы обойтись без них - обычно, если вы не можете эффективно построить автономный цикл оболочки таким образом, чтобы он мог выполняться полностью от начала до конца без вилки, тогда вам, вероятно, не следует этого делать. вообще.

Вместо этого вы должны сосредоточить свои оценки на инструментах, которые могут управлять этим, разрезая кусок здесь и кусок там в serial - именно так должен работать хорошо написанный конвейер - вместо того, чтобы отбрасывать множество мертвых - конец циклов на итерацию цикла. Попробуйте представить себе это так:

input |
(Single app single loop) |
(Single app single loop) |
(Single app single loop) |
output

Это конвейер, в котором каждый из этих одиночных циклов выполняется одновременно с предыдущим.

Но вы скорее:

input |
(Single app \
        (input slice|single app single loop);
        (input slice|single app single loop);
        (input slice|single app single loop);
 single loop) |
 output

Вот как работают циклы оболочки, которые полагаются на подоболочки. Это никоим образом неэффективно, и не помогает то, что входные и выходные данные, вероятно, также не буферизованы.

Подоболочки - это не зло - они удобные средства содержания контекста оценки. Но почти всегда лучше применять их до или после цикла любого вида, поскольку это необходимо для подготовки или кондиционирования ввода или вывода для лучшего соответствия более эффективному циклу . Не выполняйте их в цикле, но сначала найдите время, чтобы настроить его правильно, а затем больше не делайте этого, как только вы начнете.

0
13.02.2018, 19:20
0 ответов

Теги

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