Forum: D Programlama Dili RSS
.nan ve .infinity çok yavaş
acehreli (Moderatör) #1
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: .nan ve .infinity çok yavaş
İ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
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4527 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
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
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-11-18, 07:29:26 (UTC -08:00)