Yazan : Şadi Evren ŞEKER

C dilinde mevcut zamanı almak ve işlemek mümkündür. Bunun için time.h dosyasının içerisinde bulunan fonksiyonlar kullanılabilir. Ayrıca time.h dosyasında bulunan time_t oluşumu (struct) zaman tutmak için geliştirilmiştir ve zamanı oluşturan alt unsurları da içerir.

Örneğin şu andaki zamanı ekrana basmak için aşağıdaki kod kullanılabilir:

  struct timeval tv;
  time_t curtime;
  gettimeofday(&tv, NULL);
  curtime=tv.tv_sec;
  printf("%m-%d-%Y  %T.",localtime(&curtime));

Örneğin bir kullanıcıdan yazı okuyan ve ne kadar zamanda okuduğunu ekrana basan kod aşağıdaki şekilde yazılabilir:

#include <stdio.h>
#include <time.h>
#include <conio.h>
int main ()
{
  time_t start,end;
  time (&start);
  printf ("Bir tuşa basınız");
  getch();
  time (&end);
  printf ("Tuşa basmanız %.2lfsaniye sürdü.n", difftime (end,start));
  return 0;
}

Yukarıdaki time_t yapısı oldukça kullanışlı olmasına karşılık mikro saniye gibi düşük zamanları algılamakta yetersizdir. Bunun için biraz daha detaylı çalışan timeeval yapısından ve gettimeofday fonksiyonundan faydalanılabilir:

struct timeval starttv, endtv;
struct timezone starttz, endtz;gettimeofday(&starttv, &starttz);
for (i=0;i<100;i++)
   for(j=0;j<256;j++)
      for(k=0;k<10;k++)
         printf("deneme") ;
gettimeofday(&endtv, &endtz);
float fark1=getdiff(endtv, starttv);

Örneğin yukarıdaki kodda iç içe 3 döngü içerisinde ekrana deneme yazdırılıyor (toplam 100x256x10 tane) bu işlemin aldığı vakti ölçmek için gettimeofday fonksiyonundan faydalanılmış ve en sonunda da fark hesaplanmış. Burada eksik olan getdiff fonksiyonu aşağıdaki şekilde yazılabilir:

float getdiff(struct timeval endtv, struct timeval starttv)
{
   float diff=0;
   diff=(endtv.tv_sec-starttv.tv_sec)*1000000+
   (endtv.tv_usec-starttv.tv_usec);
   return diff;
}

Serper Bey’in sorusu üzerine ekliyorum, büyültmek için resme tıklayabilirsiniz:

Dev-CPP üzerinde zaman işlemleri

Yukarıdaki, linux kodlarından farklı olarak Dev-CPP kullanmak isteyenler clock sınıfından yararlanabilir.

Kod basitçe zamanı clock() fonksiyonu ile okur ve dört işleme tabi tutar. Buradaki değişken tipi ise clock_t cinsindendir.

clock_t start, end;

start=clock();

…. işlemler ……

end = clock();

printf(“fark: %f”,end-start);

şeklinde yazılan kod başarılı bir şekilde çalışma süresini ölçer. Elbette bu işlemler sırasında sys/time.h kütüphanesi include edilmelidir.

Yorumlar

  1. Sarper gencler

    Ben dev C++ kullanıyorum.yukarıdaki kodları yazdıgım zaman cogu fonksiyonu derleyici tanımıyor.gettimeofday vs.Nettede gcc derleyicisi var ama linux işletim sistemi icin diyor.time.h dan tut sys/time.h gibi kutuphaneleri eklesemde nafile bi turlu yapamadım.Yazdıgım programın nekadar vakitte tamamlandıgını hesaplamak istiyorum.Yukarıdaki kodları nasıl calıstırabilirim yardım edermisiniz 🙁

  2. Şadi Evren ŞEKER Article Author

    Yukarıdaki kod, dev-cpp ile çalışmakta. Konu içerisine dev-c++ ekran görüntüsünü koyuyorum. Koda tek yaptığım eklenti getch() fonksiyonunu çağırmak (bu çalıştıktan sonra ekranın kapanmadan beklemesi için yapılan bir eklenti) bunun dışında tamamen kod aynıdır ve çalışmaktadır.

    Belki aldığınız hataları yazarsanız daha çok yardımcı olabilirim.

    başarılar

  3. Sarper gencler

    #include
    #include
    #include // veya sadece time.h

    float getdiff(struct timeval endtv, struct timeval starttv)
    {
    float diff=0;
    diff=(endtv.tv_sec-starttv.tv_sec)*1000000+
    (endtv.tv_usec-starttv.tv_usec);
    return diff;
    }

    int main() {

    struct timeval starttv, endtv;
    struct timezone starttz,endtz;
    gettimeofday(&starttv, &starttz);
    for (int i=0;i<100;i++)
    for(int j=0;j<256;j++)
    for(int k=0;k<10;k++)
    printf("deneme") ;
    gettimeofday(&endtv, &endtz);
    float fark1=getdiff(endtv, starttv);
    getch();
    return 0;
    }
    18)aggregate `timezone starttz' has incomplete type and cannot be defined

    18)aggregate `timezone endtz' has incomplete type and cannot be defined
    19)`gettimeofday' undeclared (first use this function)

    Bahsettiginiz kod calisiyor fakat yukarıdaki kod calısmıyor hatalarını yazdım 18 ve 19.satırlarda

  4. Şadi Evren ŞEKER Article Author

    Probleminizi anladım. Kısaca, dev-cpp ile linux kodlarını çalıştıramazsınız. Ancak dev-cpp içerisinde desteklenen clock sınıfı işinize yarar. Bu sınıfı kullanan bir örnek kodu, yukarıdaki yazıya ekliyorum. Çözüm olarak ya yukarıdaki gibi bir kodu dev-c++ ile kodlayın veya linux kodlarını çalıştırabileceğiniz bir ortama (örneğin cygwin) geçin.

    Başarılar

  5. malik

    biz bi proje ile uğraşıyoruz da .. devre kapıları ile ilgili birşey.giriş kapıları otomatik değiğşecek mikrosaniyede ya da saniyede . 1 ise 0 ;0 ise 1 olacak
    bunun için nasıl bi yol izleyebiliriz.Biz şimdilik saniyeyi sayaca atmayı düşünüyoruz ama
    pek de bilgimiz olduğu söylenemez.Yardımınızı bekleriz şimdiden teşekkürler..

  6. bilgisaybilgisay

    ikinci örnek ile hangi kodu kastediyorsunuz? Sırasıyla durum şu şekilde:

    ilk kod genel tanımı vermiştir zaten çalışmaz,
    ikinci kodda değişken kullanılmamıştır doğrudan fonksiyon çağrılarak sonuç ekrana basılmıştır (printf fonksiyonunun parametresi olarak)
    üçüncü kodda fark1 isimli değişkende tutulmuştur
    dördüncü kodda daha önceki 3. kodda kullanılan fonksiyon verilmiştir. (fonksiyonun içersindeki diff değişkeni tutmaktadır)

    Bu arada 3. kodda, endtv ve starttv değişkenleri birer struct olup global tanımlıdır.

  7. esogü

    benim c++ da ödevim var herhangi bir program yazdığımızda siyah ekranda o programın ne kadarlık bir zamanda çözüldüğünü yazdıran kodlara ihtiyacım var burda ki kodları okudum fakat c++ da nasıl yazacağımı anlayamadım. yardım ederseniz çok sevinirim

  8. Şadi Evren ŞEKERŞadi Evren ŞEKER

    C++ için de time.h veya ctime kütüphanesini kullanabilirsiniz. Sizin probleminizi için önemli iki fonksiyon time() ve diff() fonksiyonlarıdır. ilki anlık olarak zamanı alır, ikincisi ise iki zaman arasındaki farkı hesaplamak için kullanılır. Basit bir örnek aşağıdaki şekilde verilebilir:

    const clock_t basla = clock();
    // burada süresini ölçmek istediğiniz kodu yazın.
    std::cout << float( clock () - basla ) /  CLOCKS_PER_SEC;
  9. MEHMET AKİF ÖZDEMİR

    Merhaba:
    Derleryici getch() komutuyla kullanıcıdan alınacak verileri beklerkende zaman sayma işlemini nasıl yaparım ve bu işlemi kesebilrmiyim. (Bbu kısmı yazamadım projede Her oyuncunun atış sırasında da bir süre sınırlaması olmalıdır. Örneğin her atış için bir dk. verilebilir. Belirtilen süre içerisinde atış yapılmazsa oyuncu hakkını kaybedecektir ve sıra diğer oyuncuya geçecektir.)

  10. Şadi Evren ŞEKERŞadi Evren ŞEKER

    C dilinde buna benzer bir işlem için Thread yapısını kullanabilirsiniz. Basitçe sleep fonksiyonu ile uyutup belirli aralıklarla kontrol edebilirisiniz. Aslında sonsuz döngü içerisinde kontrol eder gibi olacaktır ancak sonsuz döngü işlemciye gereksiz yere yükleneceği için ve size ne kadar zaman geçtiği ile ilgili bilgi vermeyeceği için genel olarak thread yapısı ile çözülür. Benzer bir kod ve detaylı açıklaması şu yazıda var:

    http://bilgisayarkavramlari.sadievrenseker.com/2012/03/26/posix-thread-pthread-kutuphanesi/

    Başarılar

  11. Hasan Fatih KAVİ

    Hocam 3 adet iç içe for döngüsündeki değişkenler olan i,j,k değişkenleri bu sırayla değilde k,i,j şeklindeki sırayla olursa çarpım süresi neredeyse 6,7 kat azalıyor. Bunun sebebi nedir acaba projem içinde gerekli bir bilgi hocam ?
    İyi Çalışmalar.

  12. Ali Tatlı

    Hocam, ilgili kod, windows 8.1 üzerinde devc++ kullanmama rağmen doğru çalışmıyor, değeri her seferinde 1412210110.12 tarzı bir süre veriyor. ve bu kodu acilen kullanmam gerekiyor. yardımcı olur musunuz?

    #include
    #include
    #include
    int main ()
    {
    time_t start,end;
    time (&start);
    printf ("Bir tuşa basınız");
    getch();
    time (&end);
    printf ("Tuşa basmanız %.2lfsaniye sürdü.n", difftime (end,start));
    return 0;
    }

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir


3 × beş =