Po raz pierwszy bawię się równolegle z R. Jako pierwszy przykład zabawek, próbowałemDlaczego foreach()% do% czasami wolniej niż dla?
library(doMC)
registerDoMC()
B<-10000
myFunc<-function()
{
for(i in 1:B) sqrt(i)
}
myFunc2<-function()
{
foreach(i = 1:B) %do% sqrt(i)
}
myParFunc<-function()
{
foreach(i = 1:B) %dopar% sqrt(i)
}
wiem, że sqrt()
wykonuje zbyt szybko parallellization do znaczenia, ale co ja nie spodziewałem się, że foreach() %do%
byłby wolniejszy niż for()
:
> system.time(myFunc())
user system elapsed
0.004 0.000 0.005
> system.time(myFunc2())
user system elapsed
6.756 0.000 6.759
> system.time(myParFunc())
user system elapsed
6.140 0.524 6.096
W większości przykładów, które widziałem, foreach() %dopar%
jest porównywany z foreach() %do%
zamiast for()
. Od foreach() %do%
był znacznie wolniejszy niż for()
w moim przykładzie zabawki, jestem teraz nieco zdezorientowany. W jakiś sposób pomyślałem, że są to równoważne sposoby konstruowania pętli for. Jaka jest różnica? Czy są one kiedykolwiek ekwiwalentne? Czy foreach() %do%
jest zawsze wolniejszy?
UPDATE: Po @Peter Grzywny odpowiedzieć zaktualizować myFunc
następująco:
a<-rep(NA,B)
myFunc<-function()
{
for(i in 1:B) a[i]<-sqrt(i)
}
To sprawia for()
nieco wolniej, ale nie za dużo:
> system.time(myFunc())
user system elapsed
0.036 0.000 0.035
> system.time(myFunc2())
user system elapsed
6.380 0.000 6.385
Zobacz także to pytanie: http://stackoverflow.com/questions/5007458/problems-using-foreach- parallelisation i this: http: // stackoverflow.com/questions/5012804/mpi-parallelization-using-snow-is-slow – Charlie
Dzięki @Charlie, odpowiedzi na te pytania były bardzo pomocne w tym, co próbuję zrobić po tym, jak skończyłem z moim przykładem zabawkowym! :) Wciąż nie jestem pewien, czy rozumiem, dlaczego 'foreach' potrzebuje o wiele więcej czasu przy użyciu opcji'% do% '. –
Duża część tego polega na tym, że% do% musi pakować kawałki/przypisania, przesyłać je do procesorów, a następnie ponownie dołączać do wszystkiego na końcu, stosownie do potrzeb. Te kroki wymagają czasu organizacyjnego, którego nie można porównać z niezrównaną wersją. – Charlie