O tempo de execução de um script Ruby é diferente localmente do que através de SSH

3

Alguém mais viu esse comportamento?

Eu criei um script Ruby simples para dar risada para ver o quão rápido seria contar em algumas máquinas que tenho. Aqui está a fonte:

    for n in 1...1000000 do
        puts "#{n}"
end

Eu executei o script usando "time ruby ./rubytest.rb"

No meu MacBook de última geração, a execução local levou cerca de 15 segundos.

Se eu fizer SSH do trabalho para o meu MacBook e executá-lo durante essa sessão SSH (pela Internet), levará quase 55 segundos.

Se eu usar "ssh localhost" no meu MacBook, no console local, a execução do script demora cerca de 10 segundos.

Perguntas: Os scripts Ruby de alguma forma são bloqueados ao despejar a saída para um console, por isso é desacelerado ao bombear dados para um terminal remoto? O SSH compacta uma conexão, de modo que, quando eu o instalava localmente, o script era mais rápido porque compactava a exibição de dados com rapidez que, mesmo com a sobrecarga de compactação, o script podia ser executado mais rápido porque reconhecia a saída mais rapidamente? / p>     

por Bart Silverstrim 27.02.2014 / 03:57

2 respostas

3

É porque você está exibindo todos os números na tela por meio do puts . Estes, então, devem ser enviados pela conexão SSH, o que prolonga o tempo de execução dos scripts. A saída também é armazenada em buffer localmente, mas os efeitos não são tão perceptíveis.

Você pode confirmar isso descarregando toda a saída em um arquivo.

Exemplos

local no laptop para a tela

$ time ruby r.rb

real    0m19.474s
user    0m3.236s
sys     0m3.207s

local no laptop para o arquivo

$ time ruby r.rb >& rb_local.txt

real    0m0.785s
user    0m0.760s
sys     0m0.020s

SSH para o desktop para a tela

$ time ruby r.rb
real    0m18.026s
user    0m4.118s
sys     0m3.815s

SSH para o desktop para o arquivo

$ time ruby r.rb >& rb_remote.txt

real    0m3.942s
user    0m3.036s
sys     0m0.741s

Ao escrever scripts como este, geralmente é uma boa ideia despejar o conteúdo em um arquivo e, em seguida, usar uma ferramenta como tail para observar o arquivo periodicamente.

NOTA: A notação >& redirecionará ambos STDERR e STDOUT para os arquivos .txt . No entanto, a saída de time ainda será exibida no console. Essa notação é equivalente a cmd > some_file.txt 2>&1 .

    
por 27.02.2014 / 04:12
3

Imprimir em um console (especialmente um console remoto) é uma operação bastante cara, se feita em um loop apertado executado com frequência. A maioria das E / S de Ruby está bloqueando, por isso diminuirá drasticamente a execução do programa.

Você deve obter um resultado muito mais razoável se enviar a saída para um arquivo (ou /dev/null , se não se importar com isso):

time ruby ./rubytest.rb >/dev/null
    
por 27.02.2014 / 04:12

Tags