May 15, 2010

İngilizce forumdaki birisi, döngülerin yavaşlığından şikayet etmişti. Şu program çok yavaş çalışıyor:

import std.stdio;

void main ()
{
   double[1_000_000] foo;

   foreach (i; 0 .. 1_000) {
       writeln(i);

       foreach (j; 0 .. 1_000_000 - 1) {
           foo[j] += foo[j+1];
       }
   }
}

Yavaşlık, foo dizisinin elemanlarının ilk değerleri olan .nan'dan geliyormuş. .nan değerinin geçersiz bir değer olduğunu biliyoruz; onun girdiği işlemlerin değeri de .nan olur.

Ama .nan, nedense mikro işlemcinin içinde yavaş çalışıyormuş. (?) Yukarıdaki programı hızlandırmanın yolu, foo'nun elemanlarına başka bir değer vermek; örneğin 0:

   double[1_000_000] foo;
   foo[] = 0;

O satır, bütün elemanlara 0 değerini atar.

Tabii zaten programı yazanın da özellikle .nan istediğini düşünmüyoruz. Deneme programı olduğu için ilklememiş ve yavaşlık da tam da ondan kaynaklanmış! :)

Konuyla ilgisiz olarak, o son satır yerine şu da çalışıyor:

   foo = 0;

O kullanımın standart olup olmadığını bilmiyorum.

Yine konuyla ilgisiz olarak, şimdi denedim, şu da aynı anlama geliyor ve çok daha kısa:

   double[1_000_000] foo = 0;

Daha da konuyla ilgisiz olarak, :), kaçınılması gereken şu kullanım, dizi elemanlarını ilklemez:

   double[1_000_000] foo = void;

Belki ilklemenin zaman kaybettirdiği bilinen özel uygulamalarda işe yarayabilir. Örneğin dizi hemen bir C kütüphanesine gönderilecektir ve o yüzden burada da ilklenmesi gerekmiyordur... Ne olursa olsun, riskli...

Tekrar konuya dönersek, yukarıda .nan ile ilgili söylediklerim .infinity için de geçerli. Nedense bu iki özel değerle yapılan işlemler, birisinin söylediğine göre, diğer kesirli sayı işlemlerinden 200 kat yavaş olabiliyormuş.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

May 15, 2010

Alıntı (acehreli):

>
>     double[1_000_000] foo;
>     foo[] = 0;
> ```

>
> O satır, bütün elemanlara 0 değerini atar.
>
> Konuyla ilgisiz olarak, o son satır yerine şu da çalışıyor:
>
>
>
foo = 0;

Köşeli parantez yazmadan kullanmaya izin vermesi, dmd'nin bir hatasıymış. "Bütün elemanlar" ile işlem yapmak için doğru olan, [] yazmak...

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]