Bildiğimiz üzere, MATLAB, yorumlayıcı (interpreter) diller sınıfına ait. Yavaşlığa neden olan bu altyapı yüzünden MATLAB kullanırken döngülerden kaçınmamız tembihlenir. Peki biz bu tembihlere denemeden inanır mıyız? Cevabı aldım, evet, inanmayız!

Bir e-deney (bunu yeni uydurdum, bilgisayarcının deneyi böyle olur) tasarlayalım. Döngü kullanmanın ve ilklendirme yapmanın, yani MATLAB diliyle konuşursak, for kullanmanın ve zeros ile değişken için yer açmanın etkisini merak ediyoruz. Bunun için şu üç farklı yöntemi test edeceğiz:

  1. Döngülü ve ilklendirmesiz
  2. Döngülü ve ilklendirmeli
  3. Vektörleştirme (vectorization)

Deneyleri bir kere yapmaktansa çok kere tekrarlayıp ortalamasını almak bizim gibi titiz e-deneyciye daha çok yakışır. Bunları gözönünde tutarak elemanlar üstünde $y = x^2-4x+3$ polinomunu hesaplayan şöyle bir kod yazalım:

clc, clear

n = 1000000;
x = 1:n;
deneySayisi = 100;

%% Döngülü ve ilklendirmesiz
tic;
t = 0;
for d = 1:deneySayisi
    clear y
    for i = 1:n
        y(i) = x(i)^2 - 4*x(i) + 3;
    end
    t = t + toc;
end
display(sprintf('Geçen ortalama süre: %.6f sn', t/deneySayisi))


%% Döngülü fakat ilklendirmeli
tic;
t = 0;
for d = 1:deneySayisi
    clear y
    y = zeros(size(x));
    for i = 1:n
        y(i) = x(i)^2 - 4*x(i) + 3;
    end
    t = t + toc;
end
display(sprintf('Geçen ortalama süre: %.6f sn', t/deneySayisi))


%% Vektörleştirme kullanımı
tic;
t = 0;
for d = 1:deneySayisi
    clear y
    y = x.^2 - 4*x + 3;
    t = t + toc;
end
display(sprintf('Geçen ortalama süre: %.6f sn', t/deneySayisi))

Şimdi de sonuçlara bakalım:

Geçen ortalama süre: 13.945716 sn
Geçen ortalama süre: 1.209971 sn
Geçen ortalama süre: 0.304579 sn

Görüldüğü üzere ilklendirme yapmak, yani döngü kaçınılmazsa zeros ile yer açmak işleri 10 kat kadar hızlandırıyor. Döngüden kaçınmak ise daha iyi bir yol ve ilk yönteme göre 40 kat kadar daha iyi! Örnekteki süre zaten kısa olduğu için fark size önemsiz gelebilir, fakat daha uzun çalışan kodlarda bu gelişme ciddi bir avantaj sağlayacaktır. Koda işlev kazandırdıktan sonra bir es verip kodu toparlamak iyi bir alışkanlıktır.

Not: Son sürümlerde bu konunun geliştirildiğini söylüyorlar, fakat görüldüğü üzere buna dikkat etmekte hâlâ çok fayda var.

Not 2: Polinom hesaplamak yerine sin fonksiyonu ile de denedim, onda da benzer sonuçlar elde ediliyor.