July 02, 2010

Evet.Bir daha çalıştırıyorum.
Bu nasıl bir şeydir?Şimdi de 38703 297 yazdı.

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

July 02, 2010

Performans ölçümleri böyledir işte. :) Program, çalışma sırasında işletim sistemi tarafından her an durdurulabilir veya disk başka bir program için meşguldür, vs. Bu gibi etkiler, çok tekrar ile azaltılmaya çalışılır.

İşletim sistemi bilgisayar kaynaklarını her an daha önemli işler için ele geçirebileceği için beklenmedik sonuçlar doğabilir. Geçici etkileri önlemek için tekrar sayısını yüksek tutmak gerekir.

Öncelikle, benchmark'ın belgesinden anlaşıldığına göre sonuçlar, ona bildirilen işlem sıralarında ve mili saniye olarak geliyormuş. Yani 600 200 görürsek, formatlı() 600 mili saniyede tamamlanıyor, formatsız() 200 mili saniyede...

Programı biraz değiştirdim:

import std.stdio;
import std.date;
import std.conv;

void formatlı()
{
   writefln("Bir şeyler %s başka şeyler %s daha başka şeyler %s",
            42, "merhabalar", 1.2345);
}

void formatsız()
{
   writeln("Bir şeyler ", 42,
           " başka şeyler ", "merhabalar",
           " daha başka şeyler ", 1.2345);
}

void main(string[] parametreler)
{
   if (parametreler.length != 2) {
       stderr.writeln("Kullanım: ", parametreler[0], " <tekrar_adedi>");
       return;
   }

   auto tekrar = to!uint(parametreler[1]);
   auto rapor = benchmark!(formatlı, formatsız)(tekrar);

   stderr.writeln(rapor);
}
  • Tekrar adedini artık komut satırından alıyor

  • Çalıştırırken programın standart çıkışını bir dosyaya gönderirseniz, sonuç standart hata akımı olan stderr'e yazılıyor. Böylece bir de ekran satırlarının kaydırılmaları işlemleri ve onların getirdiği sonuç hataları olmuyor.

Standart çıktı örneğin Linux'ta /dev/nul'a gönderilebilir:

./deneme 1000000 > /dev/null

veya herhangi bir dosyaya gönderilebilir ve sonra o dosya elle silinebilir:

./deneme 100000 > beni_sil
rm beni_SIL

Tabii o zaman da diske bağlı olunuyor. Diske yazmanın etkileri de sonucu etkileyecektir.

Windows'da da baştaki ./ yazılmadan oluyor galiba:

deneme 100000 > beni_sil
del beni_sil

Benden bir sonuç:

./deneme 1000000 > /dev/null
2747 1989

Eğer derleyiciye -O seçeneğini vererek derlersem (yani en iyileştirme (optimizasyon) ile), beklendiği gibi bütün sonuçlar daha hızlı oluyor ama yine beklendiği gibi, oranları değişmiyor:

./deneme 1000000 > /dev/null
2437 1786

Yani formatlı() olan, kabaca %25 daha yavaşmış.

Ali

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