Bře 182015
 

O Matlabu casto slycham, jak je pomaly, a to zejmena od lidi, kteri s nim moc neumi. Ano, je interpretovany, navic casti UI bezi ve virtualni masine, takze rychlosti nativnich kodu proste nedosahne. Vetsinou to ale neni tak strasne, pokud si clovek da pozor na nektere bezne chyby a problemy. Zdaleka nejcastejsi je to pouzivani for-cyklu. O tom a jak se tomu vyhnout ale psat nechci, o tom bylo napsano uz dost.

Nedavno jsem se doslechl, ze s tim v MathWorks neco udelali a for-cykly jsou ted uvnitr nejak chytre optimalizovane a stejne rychle nebo dokonce rychlejsi nez vektorizovany kod. Moc se mi to nezdalo, tak jsem se rozhodl to vyzkouset. Pouzil jsem Matlab 2014a, ktery mame ted bezne na pracovnich stanicich (a ktery udajne ono zrychleni uz ma). Vygeneroval jsem si velkou 3D matici nahodnych cisel a zkusil nejdrive „Matlabovsky“ vektorizovany pristup. 1 sekunda, to neni spatne pro 100 milionu vypoctu cosinu. A co v cyklech? Skoro 20× pomalejsi? To neni uplne to, co jsem ocekaval. Neni to uplna pohroma (uz jsem zazil zrychleni po vektorizaci vice nez stonasobne), ale je to hodne.

>> a = rand(1000, 1000, 100);
>> tic; b = cos(a); toc
Elapsed time is 1.079884 seconds.
>> tic; for r = 1:1000, for c = 1:1000, for l = 1:100, b(r,c,l) = cos(a(r,c,l)); end, end, end, toc
Elapsed time is 19.151038 seconds.

Zaver: v Matlabu 2014a jsou for-cykly porad jeste mnohem pomalejsi nez vektorizovane operace. Zkusim to az dostaneme novou verzi (a budu se modlit aby zmeny nebyly k horsimu jako treba z 2012a na 2012b, resp. 2013a) a napisu jak to dopadlo.