Thread overview
Kodunuzun Hızını ÖLÇme
Apr 23
Erdem
April 22

Merhaba,

Az önce şöyle ayak üstü bir şey yaptım:

alias ÖLÇ = ZamanSayacı;
struct ZamanSayacı
{
  bool ekranaYaz;
  StopWatch süre;

  import std.datetime.stopwatch;
  this(bool print)
  {
    ekranaYaz = print;
    süre = StopWatch(AutoStart.yes);
  }

  auto dur() => süre.stop;

  import std.stdio : writef;
  ~this()
  {
    if(ekranaYaz) writef("\n%.6f sn.\n",
           süre.peek.total!"nsecs"/1e9);
  }
}

Yaptığı gördüğünüz gibi basit, belki daha basiti vardı, bilemem veya zaten kütüphaneden şu şekilde kullanmanız daha kolayınız gidiyordur:

import std.datetime.stopwatch;
import std.stdio;

void main()
{
  auto sw = StopWatch(AutoStart.yes);

  //...

  writefln("\n%.6f sn.", sw.peek.total!"nsecs"/1e9);
}

Yani sw.stop() bile yapmanıza (eğer ölçtüğünüz kodlar program ile eş zamanlı bitiyorsa) gerek bile yok. Yine aynı mantık, yapıyı şu şekilde kullanmak isteyebileceğimi gördüm çünkü hızlıca tüm programı ölçsün yeter:

import sdb; // bu benim kütüphane içinde package.d ve public import'lar falan var

void main()
{
  auto sw = ÖLÇ(true); /* Bu yardımcı ÖLÇme aracı aslında
            Stopwatch'ın bir sarması ve nesne oluştuğunda
            otomatik start olur ama false ile oluştuğunda
            start olsa da ekrana yazmaz! Çünkü destructor
            ekranaYaz bool değişkeni ile kontrol edilir.

  ... kodlar ...*/
  sw.dur(); // artık nerde durmasını isterseniz...
}

Özelliği ise şu: Sadece auto sw = ÖLÇ(true); satırını yaz yeter çünkü, yapı kurulduğu anda otomatik zaman sayacını devreye girer. Zaten o satırdan sonra sizin ölçeceğiniz kodlar başlıyor. Eğer mükemmel ölçüm istiyorsanız sw.dur() yazarsınız olur biter. Sonuçta süreye göreceksiniz çünkü bu görevi yıkıcı işleve (~this) verdim.

Ehh, bu kadar söze gerek olmayan basit bir çözümdü, işinize yararsa kullanın :)

Dip Not: Bir şey unuttum: Eğer ekran yazmak istemeyip ölçülen değeri kullanmak istiyorsanız sw.süre.peek() yapıp onu okutursunuz. Tabi kurarken auto sw = ÖLÇ(false); ile kurmanız ekrana yazmasını engelleyecek. Belki yıkıcıya durdurma işlevini de ekleyebilir! Ama şart değil, ne dersiniz?

SDB@79

April 23

On Monday, 22 April 2024 at 18:18:17 UTC, Salih Dincer wrote:

>

Az önce şöyle ayak üstü bir şey yaptım:

Harici uygulamanın süresi hesaplanabilir.

import std.datetime.stopwatch;
import std.stdio;
import std.process : Çalıştır = executeShell;

int main()
{
  auto sw = StopWatch(AutoStart.yes);

  auto çalıştır = Çalıştır("bash -c 'sudo pacman -Syu'");

  if (çalıştır.status != 0)
      writeln("Uygulamayı çalıştıramadım");
  else
      writefln("\n%.6f sn.", sw.peek.total!"nsecs"/1e9);
  return 0;
}

Linux sistemlerde time isimli bir komut var.

April 23

On Tuesday, 23 April 2024 at 07:23:59 UTC, Erdem wrote:

>
import std.datetime.stopwatch;
import std.stdio;
import std.process : Çalıştır = executeShell;

Harici bir uygulamanın da çalışma süresinin hesaplamak güzelmiş, teşekkürler. Sanırım std.process'i bu güne kadar hiç ama hiç kullanmadım. Tabi çoğumuzun bildiği time'a göre avantajlı gözüküyor...

Düşünsenize, yine D'de yazdığınız veri üreten bir uygulamayı ayrı çalıştırıp sonra diske kayıt edilen veriyi işleyen uygulamada da ölçerek ölçerek birbirinden bağımsız ve disk önbelleklemelerden en az etkilenen 2 zaman süresini (lap split times) ölçmek mümkün!

Gerçekten çok teşekkürler, bu hiç aklıma gelmemişti :)

SDB@79

August 01

On Tuesday, 23 April 2024 at 08:59:12 UTC, Salih Dincer wrote:

>

Gerçekten çok teşekkürler, bu hiç aklıma gelmemişti :)

Aklıma gelmeyen daha doğrusu az önce aklıma gelen ve sizi gülümsetecek bir şey:

Diyelim ki ÖLÇ()'ü şöyle kurdunuz ve hemen arkasından 2 uzun işlem yapacaksınız:

void main()
{
  auto süre = ÖLÇ(true); // true: otomatik start demek

  // 1. uzun işlem

Ama ekstra ayrıntı ile uğraşmak istemiyorsunuz çünkü bu kodunuzdan bir parça değil sadece geliştiriyorsunuz. Sanırım Türkçe tur zamanı (lap time) diyorlar, bunu yapmak için diğerini otomatik yıkın:

  süre = ÖLÇ(true); // destructor çalıştıp oraya kadar ki zamanı yazacak

  // 2. uzun işlem
}

Veee bunu istediğiniz kadar yapın, ekstra method, modül eklemeye gerek. Gayet simple ve delicious :)

SDB@79