[Prévia] [Próxima] [Prévia por assunto] [Próxima por assunto]
[Índice cronológico] [Índice de assunto]

Re: corrigindo



Há várias maneiras de implementar um procedimento em qualquer linguagem. Em linguagens interpretadas, diferentes maneiras podem ter diferentes custos computacionais. 

Num PC com Windows 32bits e 2GB de RAM, o tempo (em segundos) foi:

### simular e armazenar
> system.time(x <- rbinom(5e7, 1, .5))
  usuário   sistema decorrido 
     6.22      0.04      6.27 
### calcular a média
> system.time(m <- mean(x))
  usuário   sistema decorrido 
      0.3       0.0       0.3 
### exibindo a média
> m
[1] 0.4999551

Ou seja, menos de 7 (sete) segundos. O mesmo procedimento gastou metade do tempo com Linux Ubuntu 64bits num PC com 8GB. 

Neste caso o tempo reduziu pela metade por ser num ambiente 64bits. O fato desta segunda máquina ter 4 (quatro) vezes mais memória não afetou este caso porque o uso de memória não é critico. Isto porque um vetor tamanho 50 milhoes de inteiros gasta apenas 8*5e7 bits ou 8*5e7/2^20 = 381.4697 Mb.

> print(object.size(x), unit="Mb")
381.5 Mb

Eventualmente posso precisar gastar mais memória. Neste caso, se o computador não tiver memória RAM suficiente, posso fazer swap (usar memória de disco). Isto é o que o SAS faz sem o usuário pedir. No R é possível fazer isso. 

Porém, fazer swap demanda tempo computacional, pois é acessar memória em disco demora mais que acessar memória RAM. Por isso um código SAS pode demandar mais tempo que um código eficiente em R.

Att.
Elias T. Krainski

De: Luis Carvalho <lexcarvalho@gmail.com>
Para: Jose F. de Carvalho <carvalho@statistika.com.br>; Gustavo H. Esteves <gesteves@uepb.edu.br>
Cc: abe-l@ime.usp.br
Enviadas: Terça-feira, 11 de Setembro de 2012 21:57
Assunto: Re: [ABE-L]: corrigindo

Jose F. de Carvalho wrote:
>    Rodei o seguinte programa no SAS, em minha maquina mais fraca (ASUS EEE PC
>    Seashell, com 1Gb de memoria, usando SAS 9.3); como se ve, sao 50 milhoes
>    de gerac,oes de uma Bernouilli, com p=0.5). O tempo de CPU foi 30.43
>    segundos (e o de "sala" 1:24.28 [um minuto e vinte e quatro segundos). Nao
>    estou comparando softwares, pois nao sei se as maquinas sao comparaveis.
>    Tao diferentes assim nao sao. Achei 18 minutos um tempo absurdamente alto
>    para um job tao pequeno. Qual era o ponto de seu e-mail?
>    data t;
>      p=0.5;
>      do i=1 to 5E+07;
>        x = RAND('BERNOULLI',p);
>        output;
>        end;
>    run;

Seu programa nao acumula o numero de sucessos, mas o ponto ainda e' valido:
nao deve durar muito para se obter a soma de 50 milhoes de Bernoulli(0.5). Mas
SAS e' uma linguagem compilada, e provavelmente com compilador JIT ("just in
time"), logo esse laco pode ser praticamente eliminado ou vetorizado por um
bom compilador (ver abaixo.)

Gustavo H. Esteves wrote:
>    Prezado Jose de Carvalho,
>    Nao vi a implementac,ao original do problema da simulac,ao dos
>    lanc,amentos da moeda em R e tambem nao sei exatamente como o SAS e
>    implementado para poder comparar os resultados.
>    Porem, o R e um software de linguagem interpretada (sendo que suas
>    func,oes "core", em geral, sao implementadas em alguma linguagem
>    compilada, tais como C, C++ ou Fortran) e por isso ele costuma ficar
>    realmente muito lento quando se usa muitos "loops" (principalmente
>    aninhados).
>    Recentemente tive um problema com a implementac,ao de uma func,ao de
>    correlac,ao que ficou 64 vezes mais rapida (em um simulac,ao de 1000
>    observac,oes de um normal bivariada) quando implementada em C, se
>    comparada com sua implementac,ao original em R.

Alem de ser uma linguagem interpretada, R e' funcional e logo pode gastar
muita memoria ja' que variaveis sao passadas por valor em vez de por
referencia. Mas mesmo assim deve ser possivel "vetorizar" o codigo e evitar o
laco, com algo como:

x = mean(rbinom(5e7, 1, .5))

O problema pode ser o uso de memoria -- dependendo de quanta memoria voce
tenha disponivel -- ja que um vetor de 5e7 posicoes e' gerado... Talvez melhor
ainda e' usar, equivalentemente, e sem vetorizacao,

x = rbinom(1, 5e7, .5) / 5e7

mas ai' eu estou quase "evitando" o problema... :)

Outro fator importante ao se comparar esses tempos de execucao para varias
amostragens e' o gerador de numeros (pseudo-)aleatorios; o RNG padrao do R e'
o Mersenne-Twister, que e' bem rapido e tem um periodo bastante longo.

Abracos,
Luis

--
Mathematicians practice absolute freedom.
                -- Henry Adams

--
Luis Carvalho
Assistant Professor
Dept. of Mathematics and Statistics
Boston University