Сумма времени выхода из процессов (bash)

Возможно, немного выше всех, кроме самых ранних шестилетних, но несколько примеров, которые помогли мне сделать концепцию закрытия в JavaScript.

Закрытие - это функция, которая имеет доступ к области другой функции (ее переменные и функции). Самый простой способ создать замыкание - это функция внутри функции; причина в том, что в JavaScript функция всегда имеет доступ к области своей содержащей функции.

function outerFunction() {
    var outerVar = "monkey";
    
    function innerFunction() {
        alert(outerVar);
    }
    
    innerFunction();
}

outerFunction();

ALERT: обезьяна

В приведенном выше примере вызывается внешняя функция, которая в свою очередь вызывает innerFunction. Обратите внимание, что внешний VAR доступен для innerFunction, о чем свидетельствует его правильное предупреждение о значении externalVar.

Теперь рассмотрим следующее:

function outerFunction() {
    var outerVar = "monkey";
    
    function innerFunction() {
        return outerVar;
    }
    
    return innerFunction;
}

var referenceToInnerFunction = outerFunction();
alert(referenceToInnerFunction());

ALERT: обезьяна

referenceToInnerFunction устанавливается в функцию externalFunction (), которая просто возвращает ссылку на innerFunction. Когда вызывается referenceToInnerFunction, он возвращает outerVar. Опять же, как и выше, это демонстрирует, что innerFunction имеет доступ к externalVar, переменной внешней функции. Кроме того, интересно отметить, что он сохраняет этот доступ даже после завершения функции externalFunction.

И здесь все становится действительно интересным. Если бы мы избавились от externalFunction, скажем, установим его в null, вы можете подумать, что referenceToInnerFunction потеряет свой доступ к значению externalVar. Но это не так.

function outerFunction() {
    var outerVar = "monkey";
    
    function innerFunction() {
        return outerVar;
    }
    
    return innerFunction;
}

var referenceToInnerFunction = outerFunction();
alert(referenceToInnerFunction());

outerFunction = null;
alert(referenceToInnerFunction());

ALERT: обезьяна ALERT: обезьяна

Но как это так? Как может referenceToInnerFunction все еще знать значение outerVar, теперь, когда внешняя функция была установлена ​​в нуль?

Причина, по которой referenceToInnerFunction все еще может получить доступ к значению externalVar, заключается в том, что когда закрытие было сначала создано путем помещения внутренней функции внутри внешней функции , innerFunction добавила ссылку на область внешнего интерфейса (ее переменные и функции) в свою цепочку видимости. Это означает, что innerFunction имеет указатель или ссылку на все переменные externalFunction, включая outerVar. Таким образом, даже когда функция externalFunction завершила выполнение, или даже если она была удалена или установлена ​​в нуль, переменные в своей области, такие как outerVar, остаются в памяти из-за выдающейся ссылки на них со стороны внутренней функции, которая была возвращена referenceToInnerFunction. Чтобы по-настоящему освободить externalVar и остальные переменные externalFunction из памяти, вам придется избавиться от этой выдающейся ссылки на них, скажем, установив для referenceToInnerFunction значение null.

///////// /

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

function outerFunction() {
    var outerVar = "monkey";
    
    function innerFunction() {
        alert(outerVar);
    }
    
    outerVar = "gorilla";

    innerFunction();
}

outerFunction();

ALERT: gorilla

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

1
задан araujo 22 March 2019 в 10:52
поделиться

1 ответ

Из man bash, тогда, если PAGER меньше / time.

  If the time reserved word precedes a pipeline, the elapsed as well as user and system time consumed by its  exe-
  cution  are reported when the pipeline terminates.  The -p option changes the output format to that specified by
  POSIX.  The TIMEFORMAT variable may be set to a format string that specifies how the timing  information  should
   be displayed; see the description of TIMEFORMAT under Shell Variables below.

затем /TIMEFORMAT

         The  optional  l  specifies  a  longer  format, including minutes, of the form MMmSS.FFs.  The value of p
         determines whether or not the fraction is included.


         If this variable is not set, bash acts as if it had the value    

Если его можно изменить на что-то вроде

TIMEFORMAT= 

без l суммировать проще.

Обратите внимание, что формат также может зависеть от локали LANG:

сравнить

(LANG=fr_FR.UTF-8; time sleep 1)

и

(LANG=C; time sleep 1)

. В этом случае сумма может быть сделана с помощью внешний инструмент, такой как awk

awk '/^real/ {sum+=$2} END{print sum} ' times.txt

или perl

perl -aln -e '$sum+=$F[1] if /^real/; END{print $sum}' times.txt
\nreal\t%3R'

без l суммировать проще.

Обратите внимание, что формат также может зависеть от локали LANG:

сравнить

(LANG=fr_FR.UTF-8; time sleep 1)

и

(LANG=C; time sleep 1)

. В этом случае сумма может быть сделана с помощью внешний инструмент, такой как awk

awk '/^real/ {sum+=$2} END{print sum} ' times.txt

или perl

perl -aln -e '$sum+=$F[1] if /^real/; END{print $sum}' times.txt
\nreal\t%3lR\nuser\t%3lU\nsys%3lS'. If the value is null, no timing information is displayed. A trailing newline is added when the format string is displayed.

Если его можно изменить на что-то вроде

TIMEFORMAT= 

без l суммировать проще.

Обратите внимание, что формат также может зависеть от локали LANG:

сравнить

(LANG=fr_FR.UTF-8; time sleep 1)

и

(LANG=C; time sleep 1)

. В этом случае сумма может быть сделана с помощью внешний инструмент, такой как awk

awk '/^real/ {sum+=$2} END{print sum} ' times.txt

или perl

perl -aln -e '$sum+=$F[1] if /^real/; END{print $sum}' times.txt
\nreal\t%3R'

без l суммировать проще.

Обратите внимание, что формат также может зависеть от локали LANG:

сравнить

(LANG=fr_FR.UTF-8; time sleep 1)

и

(LANG=C; time sleep 1)

. В этом случае сумма может быть сделана с помощью внешний инструмент, такой как awk

awk '/^real/ {sum+=$2} END{print sum} ' times.txt

или perl

perl -aln -e '$sum+=$F[1] if /^real/; END{print $sum}' times.txt
0
ответ дан Nahuel Fouilleul 22 March 2019 в 10:52
поделиться
Другие вопросы по тегам:

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