Quanto atraso tem dois comandos sequenciais do linux se eles são executados como um shellscript?

0

Eu tenho dois comandos A e B. Eu quero executá-los juntos, mas a única maneira possível no Linux é usar o & Isto é,

$ A &
$ B

Não espero que 0 atrase dois comandos, mas aproximadamente quanto devo esperar? Em milissegundos, microssegundos ou nanossegundos variam? Obrigado.

    
por return 0 11.02.2014 / 05:22

2 respostas

1

Observe que qualquer resposta a essa pergunta dependerá do que exatamente o sistema está fazendo a qualquer momento. Por exemplo:

  • Qual programador de kernel você está usando (suas latências diferem)
  • Quais processos você está executando (todos competem por tempo, e o agendador pode não escolher seus processos o quanto quiser)

E provavelmente mil outras coisas. Por esse motivo, execute este teste você mesmo . Observe também que o seguinte pode estar errado de muitas maneiras sutis, já que eu não sou muito qualificado para obter o melhor desempenho possível de bash (bem, zsh estritamente falando, já que esse é meu shell de login).

Com isso em mente, criei uma maneira simples de testar isso. A data do GNU tem uma maneira de mostrar nanossegundos (sim, você leu corretamente). Assim, para obter um monte de dados, tudo o que você precisa fazer é:

get_starting_diff() {
    date +%N & date +%N
}

# 5,000 iterations is probably good enough statistically
for iteration in $(seq 1 5000); do
    get_starting_diff
done > times

Isto irá (além de mastigar muito de PIDs) produzir 10.000 arquivos de linha, com a informação de tempo nela contida. Você pode usar o seguinte script do Python (v3.4) para ter uma ideia de qual é a diferença média de tempo:

def pairwise(iterator):
    "Takes an iterator and extracts sequential pairs from it"
    pair = []
    for item in iterator:
        pair.append(item)
        if len(pair) == 2:
            yield pair
            pair = []

diffs = []
with open('times') as data:
    for start1, start2 in pairwise(data):
        diffs.append(int(start2) - int(start1))

diffs.sort()
median = diffs[len(diffs) // 2]
mean = sum(diffs) / len(diffs)

print("The median difference is", median / 1000000, "milliseconds")
print("The mean difference is", mean / 1000000, "milliseconds")

No meu sistema (Ubuntu 13.10, Linux 3.12.0-997-genérico), isso me dá:

The median difference is 1.077483 milliseconds
The mean difference is 3.680928442211055 milliseconds
    
por 11.02.2014 / 23:50
0

Você está executando tarefas paralelas. Não faça suposições sobre a ordem na qual eles serão executados. Eles podem ser executados em qualquer ordem. B pode até executar a conclusão antes de A começar. Então, da próxima vez que você executar, poderá obter resultados completamente diferentes.

    
por 04.03.2014 / 06:23