C programının yürütme süresi


209

Birkaç işlemci üzerinde paralel çalıştırmayı amaçlayan bir C programım var. Yürütme süresini (1 saniye ile birkaç dakika arasında herhangi bir yerde olabilir) kaydedebilmeliyim. Cevapları aradım, ama hepsi clock()fonksiyonun kullanılmasını öneriyor gibi görünüyor , bu da programın aldığı saat sayısının Clocks_per_seconddeğere bölünmesini hesaplıyor .

Clocks_per_secondDeğerin nasıl hesaplandığından emin değilim ?

Java'da, yürütmeden önce ve sonra şimdiki zamanı milisaniye olarak alıyorum.

C'de benzer bir şey var mı? Bir baktım, ama ikinci bir çözünürlükten daha iyi bir şey elde etmenin bir yolunu bulamıyorum.

Bir profil oluşturucunun bir seçenek olacağını da biliyorum, ama kendime bir zamanlayıcı uygulamak istiyorum.

Teşekkürler


3
Hangi OS / API çerçevelerini kullanıyorsunuz / kullanıyorsunuz? Sadece düz C?
typo.pl

4
Oldukça küçük bir program, sadece düz C
Roger

Bu yanıtta taşınabilir bir çözüm uygulama hakkında ayrıntılı olarak yazdım: stackoverflow.com/questions/361363/…
Alexander Saprykin

fonksiyonun tamamlanması için geçen zaman stackoverflow.com/a/40380118/6180077
Abdullah Farweez

Yanıtlar:


344

CLOCKS_PER_SECiçinde bildirilen bir sabittir <time.h>. C uygulamasındaki bir görev tarafından kullanılan CPU zamanını almak için şunu kullanın:

clock_t begin = clock();

/* here, do your time-consuming job */

clock_t end = clock();
double time_spent = (double)(end - begin) / CLOCKS_PER_SEC;

Bunun süreyi kayan nokta türü olarak döndürdüğünü unutmayın. Bu bir saniyeden daha kesin olabilir (örneğin 4.52 saniyeyi ölçersiniz). Hassasiyet mimariye bağlıdır; modern sistemlerde kolayca 10ms veya daha düşüktür, ancak eski Windows makinelerinde (Win98 döneminden) 60ms'ye daha yakındı.

clock()R, standart C'dir; "her yerde" çalışır. getrusage()Unix benzeri sistemlerde olduğu gibi sisteme özgü işlevler vardır .

Java System.currentTimeMillis()aynı şeyi ölçmez. Bu bir "duvar saati" dir: programın yürütülmesi için geçen süreyi ölçmenize yardımcı olabilir, ancak ne kadar CPU zamanı kullanıldığını size söylemez. Çok görevli sistemlerde (yani hepsi), bunlar büyük ölçüde farklı olabilir.


1
Bana çok rasgele bir sonuç veriyor - Aynı kod parçası üzerinde büyük / küçük / negatif sayıların bir karışımını alıyorum. GCC 4.7 Linux 3.2 AMD64

3
Evet: clock()"saat" adı verilen iç ölçeğin bir zamanını döndürür ve CLOCKS_PER_SECsaniye başına saat sayısıdır, bu nedenle bölme işlemi CLOCKS_PER_SECsaniye cinsinden bir süre verir. Yukarıdaki kodda, değer bir olacaktır, doubleböylece istediğiniz zaman ölçekleyebilirsiniz.
Thomas Pornin

18
Büyük uyarı: clock (), işletim sisteminin geçen süreyi değil, işleminizi yürütmek için harcadığı süreyi döndürür. Bununla birlikte, bu bir kod bloğunu zamanlamak için iyidir, ancak gerçek dünyada geçen süreyi ölçmez.

2
Çok iş parçacıklı bir programı ölçmek istediğini söyledi. Bir saat () bunun için uygun olduğundan emin değilim, çünkü tüm kodların çalışma sürelerini toplar, böylece kod sıralı olarak çalıştırılmışsa sonuç gibi görünecektir. Bu tür şeyler için omp_get_wtime () kullanın, ama tabii ki emin olmak gerekir, sistem diğer süreçlerle meşgul değil.
Youda008

1
Bu iş parçacığı bir yıl önce daha uygun olmasına rağmen bazı şeyler belirtmeliyim: CLOCKS_PER_SECBir olanlong int değerle 1000000, bölünmüş değilken mikrosaniye cinsinden süre vererek; CPU saat çevrimleri değil. Bu nedenle, buradaki saat mikrosaniye (belki 1 MHz CPU için saat döngüleri?) Olduğu için dinamik frekansı hesaba katmaya gerek yok. Bu değeri yazdıran kısa bir C programı yaptım ve i7-2640M dizüstü bilgisayarımda 1000000 idi, 800 MHz ila 2.8 GHz arası dinamik frekansa sahip olan Turbo Turbo, 3.5 GHz'e kadar çıkabiliyor.
DDPWNAGE 17:17

111

Unix kabuğunu çalıştırmak için kullanıyorsanız, time komutunu kullanabilirsiniz.

$ time ./a.out

çalıştırılabilir olarak a.out varsayarsak u bunu çalıştırmak için gereken zamanı verecektir


3
@ acgtyrant ancak yalnızca basit programlar içindir, çünkü girdi, çıktı vb. dahil tüm program süresini alacaktır.
phuclv

1
Linux'taysanız ve (mikro) kıyas ölçünüzü ihmal edilebilir başlangıç ​​yükü olan bir programa indirdiyseniz (örneğin, sıcak döngünüzü birkaç saniye çalıştıran statik bir yürütülebilir dosya), perf stat ./a.outönbellek özlemeleri için HW performans sayaçlarını almak için kullanabilirsiniz ve şube yanlış tahminleri ve IPC.
Peter Cordes

61

Düz vanilya C'de:

#include <time.h>
#include <stdio.h>

int main()
{
    clock_t tic = clock();

    my_expensive_function_which_can_spawn_threads();

    clock_t toc = clock();

    printf("Elapsed: %f seconds\n", (double)(toc - tic) / CLOCKS_PER_SEC);

    return 0;
}

6
Bir süredir gördüğüm en iyi değişken isimleri. tic = "saat içinde zaman", toc = "zaman aşımı saati". Ama aynı zamanda tic-toc = "tick-tock". Buradan zaman kapmalarını bu şekilde etiketliyorum.
Logan Schelly

60

İşlevsel olarak bunu istiyorsunuz:

#include <sys/time.h>

struct timeval  tv1, tv2;
gettimeofday(&tv1, NULL);
/* stuff to do! */
gettimeofday(&tv2, NULL);

printf ("Total time = %f seconds\n",
         (double) (tv2.tv_usec - tv1.tv_usec) / 1000000 +
         (double) (tv2.tv_sec - tv1.tv_sec));

Bunun sadece saniyeler değil mikrosaniye cinsinden ölçüldüğünü unutmayın.


2
MinGW derleyicisi GCC tabanlıdır. Böylece üzerinde çalışacaktır. Ancak görsel C derleyicisini kullanırsanız hata alırsınız.
user2550754

11
Evet, gettimeofday çağrısını destekleyen ac kütüphanesi olan pencerelerde çalışır. Aslında derleyicinin ne olduğu önemli değil, sadece iyi bir libc kütüphanesine bağlamanız gerekiyor. Hangi mingw durumunda, varsayılan pencerelerden biri değildir.
Wes Hardaker

1
Bu benim için Windows XP'de cygwin gcc ve Linux Ubuntu ile çalışıyor. Sadece istediğim buydu.
Sevgi ve barış - Joe Codeswell

gettimeofdaykullanılmıyor ve yeni kod için önerilmez. POSIX kılavuz sayfası bunun yerine clock_gettime değerini önerir , bu CLOCK_MONOTONICda sistem saatindeki değişikliklerden etkilenmediğini sormanızı sağlar ve bu nedenle bir aralık süresi olarak daha iyidir. ( JohnSll'in cevabına bakınız ). Örneğin modern Linux sistemlerinde gettimeofday, temel olarak nanosaniyeyi mikrosaniyeye dönüştüren clock_gettime için bir sarıcıdır.
Peter Cordes

12

Basit programların çoğunun hesaplama süresi milisaniye cinsindendir. Yani, sanırım, bunu faydalı bulacaksınız.

#include <time.h>
#include <stdio.h>

int main(){
    clock_t start = clock();
    // Execuatable code
    clock_t stop = clock();
    double elapsed = (double)(stop - start) * 1000.0 / CLOCKS_PER_SEC;
    printf("Time elapsed in ms: %f", elapsed);
}

Tüm programın çalışma zamanını hesaplamak istiyorsanız ve bir Unix sistemindeyseniz, zaman komutunu kullanarak programınızı çalıştırıntime ./a.out


Windows'da en az faktör en az 100, ancak 1000 değil ve kesin değil
boctulus

6
Bu cevap, Alexandre C'nin iki yıl öncesinin cevabında olmayan bir şey eklemiyor.
Jonathan Leffler

3
@boctulus: 1s her zaman 1000 ms'dir , ayrıca pencerelerde.
alk

9

Bir sürü cevap önerdi clock()ve sonra CLOCKS_PER_SECgeldi time.h. Bu muhtemelen kötü bir fikir çünkü /bits/time.hdosyam şöyle diyor:

/* ISO/IEC 9899:1990 7.12.1: <time.h>
The macro `CLOCKS_PER_SEC' is the number per second of the value
returned by the `clock' function. */
/* CAE XSH, Issue 4, Version 2: <time.h>
The value of CLOCKS_PER_SEC is required to be 1 million on all
XSI-conformant systems. */
#  define CLOCKS_PER_SEC  1000000l

#  if !defined __STRICT_ANSI__ && !defined __USE_XOPEN2K
/* Even though CLOCKS_PER_SEC has such a strange value CLK_TCK
presents the real value for clock ticks per second for the system.  */
#   include <bits/types.h>
extern long int __sysconf (int);
#   define CLK_TCK ((__clock_t) __sysconf (2))  /* 2 is _SC_CLK_TCK */
#  endif

Bu nedenle CLOCKS_PER_SEC, derlemek için kullandığınız seçeneklere bağlı olarak 1000000 olarak tanımlanabilir ve bu nedenle iyi bir çözüm gibi görünmez.


1
Bilgi için teşekkürler ama daha iyi bir alternatif var mı?
ozanmuyes

4
Bu pratik bir sorun değildir: evet Posix sistemleri her zaman vardır CLOCK_PER_SEC==1000000, ancak aynı zamanda hepsi clock () uygulaması için 1 µs hassasiyet kullanır; Bu arada, paylaşım sorunlarını azaltmak için güzel bir özelliğe sahiptir. Potansiyel olarak çok hızlı olayları ölçmek istiyorsanız, örneğin 1 ms'nin altında, önce Posix'te mutlaka 1µs'den daha kaba olan, ancak genellikle çok daha kaba olan clock () işlevinin doğruluğu (veya çözünürlüğü) hakkında endişelenmelisiniz ; olağan çözüm, testi birçok kez çalıştırmaktır; sorulduğu gibi soru olsa gerek görünmüyordu.
AntoineL

Neden iyi bir çözüm olmasın? Eğer bir değer clock()alırsanız, eğer bu değeri bölerseniz, CLOCK_PER_SECişlemcinin saniye cinsinden zaman alacağı garanti edilir. Gerçek saat hızını ölçme sorumluluğu clock()sizin değil işlevin sorumluluğudur .
Zaffy

9

Thomas Pornin'in makro olarak cevabı:

#define TICK(X) clock_t X = clock()
#define TOCK(X) printf("time %s: %g sec.\n", (#X), (double)(clock() - (X)) / CLOCKS_PER_SEC)

Şöyle kullanın:

TICK(TIME_A);
functionA();
TOCK(TIME_A);

TICK(TIME_B);
functionB();
TOCK(TIME_B);

Çıktı:

time TIME_A: 0.001652 sec.
time TIME_B: 0.004028 sec.

4

Bir programın yürütülmesi için geçen sürenin ölçülmesinin , makinenin o andaki yüküne büyük ölçüde bağlı olduğunu dikkate almalısınız.

C'de şimdiki zamanı elde etmenin farklı yollarla elde edilebileceğini bilerek, daha kolay olanı:

#include <time.h>

#define CPU_TIME (getrusage(RUSAGE_SELF,&ruse), ruse.ru_utime.tv_sec + \
  ruse.ru_stime.tv_sec + 1e-6 * \
  (ruse.ru_utime.tv_usec + ruse.ru_stime.tv_usec))

int main(void) {
    time_t start, end;
    double first, second;

    // Save user and CPU start time
    time(&start);
    first = CPU_TIME;

    // Perform operations
    ...

    // Save end time
    time(&end);
    second = CPU_TIME;

    printf("cpu  : %.2f secs\n", second - first); 
    printf("user : %d secs\n", (int)(end - start));
}

Umarım yardımcı olur.

Saygılarımızla!


4

(Sistem yöneticiniz sistem saatini değiştirirse veya saat diliminizde farklı kış ve sommer süreleri varsa, buradaki tüm cevaplar eksiktir. Bu nedenle ...)

Linux kullanımında: clock_gettime(CLOCK_MONOTONIC_RAW, &time_variable); Sistem yöneticisi zamanı değiştirirse veya kış saati yaz saatinden farklı bir ülkede yaşıyorsanız etkilenmez.

#include <stdio.h>
#include <time.h>

#include <unistd.h> /* for sleep() */

int main() {
    struct timespec begin, end;
    clock_gettime(CLOCK_MONOTONIC_RAW, &begin);

    sleep(1);      // waste some time

    clock_gettime(CLOCK_MONOTONIC_RAW, &end);

    printf ("Total time = %f seconds\n",
            (end.tv_nsec - begin.tv_nsec) / 1000000000.0 +
            (end.tv_sec  - begin.tv_sec));

}

man clock_gettime devletler:

CLOCK_MONOTONIC
              Clock  that  cannot  be set and represents monotonic time since some unspecified starting point.  This clock is not affected by discontinuous jumps in the system time
              (e.g., if the system administrator manually changes the clock), but is affected by the incremental adjustments performed by adjtime(3) and NTP.

Saniyeyi almak için kullandığınız hesaplamayı açıklayabilir misiniz? Neler olduğu belli değil.
Colin Keenan

1
Bu her zaman (end.tv_nsec - begin.tv_nsec) / 1000000000.0sonuç vermez mi 0?
alk

@alk: hiç bir bölünerek doubledeğişmez tetikler int veya longiçin doubledönüşüm öncesi bölümü. Tabii ki tam sayıya yapışabilir ve tv_secparçayı ve daha sonra kesirli kısmı sıfır gibi basabilirsiniz %ld.%09ld, ancak ikiye dönüştürmek kolaydır ve 53 bit hassasiyeti genellikle kıyaslama süreleri için bol miktarda bulunur.
Peter Cordes

1
(Hata, nanosaniye bölümünün çıkarılmasının saniye bölümüne taşınması gerekebilir, bu nedenle çift kullanmak ve negatif olmasına izin vermek bu sorunu önler. Saf bir tamsayı biçim dizesi kullanmak için glibc kılavuzunda önerilene timespec_subtractbenzer bir şeye ihtiyacınız olacaktır. timeval_subtract: gnu.org/software/libc/manual/html_node/Elapsed-Time.html )
Peter Cordes

3

ANSI C yalnızca ikinci hassas zaman fonksiyonlarını belirtir. Ancak, POSIX ortamında çalışıyorsanız gettimeofday () yöntemini kullanabilirsiniz. , UNIX Çağından bu yana geçen sürenin mikrosaniye çözünürlüğünü sağlayan işlevini .

Yan not olarak, birçok (hepsi değilse de?) Sistemlerde kötü bir şekilde uygulandığı ve doğru olmadığı için clock () kullanılmasını önermem, ayrıca programınızın CPU üzerinde ne kadar zaman harcadığını ve programın toplam ömrü değil, sorunuza göre ölçmek istediğinizi varsayıyorum.


ISO C Standardı ( ANSI C'nin ne anlama geldiğini varsayarak ) bilerek zaman fonksiyonlarının hassasiyetini belirtmez . Daha sonra özellikle bir POSIX uygulamasında veya Windows'ta, duvar saati (bkz. Thomas'ın cevabı) işlevlerinin saniyeler içinde hassasiyeti vardır. Ancak saatin () hassasiyeti genellikle daha büyüktür ve her zaman Posix'te 1µs'dir (doğruluktan bağımsız olarak)
AntoineL

2

Her çözüm benim sistemimde çalışmıyor.

Kullanabilirim

#include <time.h>

double difftime(time_t time1, time_t time0);

2
Bu iki time_tdeğer arasındaki farkı çift ​​olarak verir . Yana time_tdeğerlerin ikinci bir tek doğru bu programlar için uzun süreler boyunca bu çalıştırma yararlı olabilir ancak, bu, kısa çalışan programlar tarafından harcanan zaman üzerinden baskı sınırlı bir kullanıma sahiptir.
Jonathan Leffler

Her ne sebeple olursa olsun, bir çift clock_ts'ye geçmek difftimebenim için saniyenin yüzde biri hassasiyetinde çalışıyor gibi görünüyor. Bu linux x86'da. Ben de çıkarılmasını alamayan stopve startişe.
ragerdl

@ragerdl: difftime() clock() / CLOCKS_PER_SECSaniyeler beklediği için geçmeniz gerekiyor .
alk

2
    #include<time.h>
    #include<stdio.h>
    int main(){
clock_t begin=clock();

    int i;
for(i=0;i<100000;i++){
printf("%d",i);

}
clock_t end=clock();
printf("Time taken:%lf",(double)(end-begin)/CLOCKS_PER_SEC);
}

Bu program cazibe gibi çalışacaktır.


2

Ben her zamanki saat (), herkesin burada tavsiye, bazı nedenlerle ekrandan çizim veya okuma dosyaları gibi herhangi bir yan etkisi olmayan statik kod için bile, çalıştırmak çalıştırmak için çılgınca saptığını buldum. Bunun nedeni CPU'nun güç tüketimi modlarını, işletim sisteminin farklı öncelikler vermesini vb.

Bu nedenle, clock () ile her seferinde aynı sonucu güvenilir bir şekilde almanın tek yolu, ölçülen kodu bir döngüde birkaç kez (birkaç dakika) çalıştırmak ve derleyicinin optimize etmesini önlemek için önlemler almaktır: modern derleyiciler kodu önceden hesaplayabilir yan etkiler olmadan bir döngü içinde çalışır ve döngüden çıkarır, örneğin her yineleme için rasgele girdi kullanmak gibi.

Bir diziye yeterince örnek toplandıktan sonra, bir dizi bu diziyi sıralar ve medyan adı verilen orta öğeyi alır. Ortalamadan daha iyidir, çünkü antivirüsün tüm CPU'yu kapladığı veya işletim sisteminin bir miktar güncelleme yapması gibi aşırı sapmaları atar.

İşte medyan yakınındaki değerlerin ortalamasını alan C / C ++ kodunun yürütme performansını ölçmek için basit bir yardımcı program: https://github.com/saniv/gauge

Kendimi hala kod ölçmek için daha sağlam ve daha hızlı bir yol arıyorum. Muhtemelen herhangi bir işletim sistemi olmadan çıplak metal üzerinde kontrollü koşullarda kod çalıştırmayı deneyebilir, ancak bu gerçekçi olmayan sonuç verecektir, çünkü gerçekte işletim sistemi devreye girer.

x86, çalıştırılan gerçek talimatları içeren bu donanım performans sayaçlarına sahiptir, ancak işletim sistemi yardımı olmadan erişmek zordur, yorumlanması zordur ve kendi sorunları vardır ( http://archive.gamedev.net/archive/reference/articles /article213.html ). Yine de şişe boynunun doğasını araştırmaya yardımcı olabilirler (veri erişimi veya bu verilerdeki gerçek hesaplamalar).


Evet, modern x86 CPU'lar maksimum turbodan çok daha yavaş rölantide. "Regülatör" ayarlarına bağlı olarak, maksimum saat hızına kadar rampa milisaniye (donanım P-durum yönetimine sahip Skylake, özellikle enerji_performans_preference olarak ayarlanmış performance) veya onlarca milisaniye sürebilir . en.wikipedia.org/wiki/Dynamic_frequency_scaling . Ve evet, medyan performans genellikle iyi bir seçimdir; üst uçta genellikle parazitlenmeden bazı ani artışlar olur.
Peter Cordes

Genellikle işinizi optimize etmekten kaçınmak için en iyi bahsiniz bir komut satırı girdisidir ve sonucu döndürür. Ya da bağımsız bir dosyaya mainargüman alıp sonuç döndüren bir işlev yazın ve bağlantı zamanı optimizasyonu kullanmayın. Sonra derleyici onu çağıranın içine yerleştiremez. Yalnızca işlev zaten bir tür döngü içeriyorsa çalışır, aksi takdirde çağrı / ret ek yükü çok yüksektir.
Peter Cordes

Derleyici, herhangi bir yan etkisi olmadan statik kodla işlerseniz, tek komut satırı girişini döngü dışında optimize edebilir. Bu nedenle her yineleme için rastgele bir girdi oluşturmak en iyisidir. Açıkçası rand (), ölçülen kodun dışında, ilk saatten () önce çağrılmalıdır, çünkü rand () bir sistem çağrısına neden olabilir ve bazı donanım entropi jeneratörünü (eski sistemlerde fare hareketi olan) örnekleyebilir. Çıktının her bitini yazdırmayı unutmayın, aksi takdirde derleyici tüm çıktının tamamı veya bir kısmı olarak ihtiyacınız olmadığına karar verebilir. Bu CRC32 ile yapılabilir.
SmugLispWeenie

Test altındaki kodunuz ayrı bir dosyada ise ve bağlantı zamanı optimizasyonu kullanmıyorsanız, derleyicinin çağrılar arasında optimizasyon yapmak için ÖAM yapması mümkün değildir. Arayan kişi, görünür yan etkilere sahip olmadığı konusunda herhangi bir şey üstlenemez. Bu nispeten kısa bir şey koymak sağlayan sadece çağrı / ret havai ile, zaman yeterince uzun bunu yapmak için tekrar döngü. Satır içi olmasına izin verirseniz, o zaman hesapladığınız bir döngüden hesaplamayı kaldırmadığından emin olmak için oluşturulan topluluğu kontrol etmeniz gerekir.
Peter Cordes

Derleyiciye özgü yol, (örneğin) bir derleyiciyi bir kayıttaki bir sonucu gerçekleştirmeye zorlamak ve / veya bir değişkenin değeri hakkında bildiklerini gerçekte ekstra talimatlar vermeksizin kullanmaktır (örneğin). MSVC'deki "Escape" ve "Clobber" eşdeğeri profil oluşturma ve mikrobenchmarking ile ilgili bir videoya bağlanır (clang geliştiricisi Chandler Carruth'un CppCon 2015 konuşması) MSVC eşdeğeri yoktur, ancak sorunun kendisi GNU C işlevlerini ve bunların nasıl kullanılacağını gösterir.
Peter Cordes

0

Bazıları farklı türde bir girdi yararlı bulabilir: NVidia CUDA ile GPGPU programlama üzerine bir üniversite dersinin bir parçası olarak bu zaman ölçme yöntemi verildi ( ders açıklaması ). Önceki yazılarda görülen yöntemleri birleştirir ve gereksinimler güvenilirlik verdiği için gönderirim:

unsigned long int elapsed;
struct timeval t_start, t_end, t_diff;
gettimeofday(&t_start, NULL);

// perform computations ...

gettimeofday(&t_end, NULL);
timeval_subtract(&t_diff, &t_end, &t_start);
elapsed = (t_diff.tv_sec*1e6 + t_diff.tv_usec);
printf("GPU version runs in: %lu microsecs\n", elapsed);

Örneğin 1.0 / 1000.0ihtiyaçlarınızı karşılayan ölçü birimini almak için çarpabileceğinizi düşünüyorum.


1
gettimeofday kullanılmıyor ve önerilmez. Bunun clock_gettimeyerine POSIX kılavuz sayfası CLOCK_MONOTONIC, sistem saatindeki değişikliklerden etkilenmediğini sormanızı sağlar ve bu nedenle bir aralık zamanlayıcısı olarak daha iyidir. Örneğin modern Linux sistemlerinde, gettimeofdaytemel clock_gettimeolarak nanosaniyeleri mikrosaniyeye dönüştüren bir sarıcıdır. (JohnSll'in cevabına bakınız).
Peter Cordes

Bu yöntem @Wes Hardaker tarafından eklendi, ana fark kullanıyor timeval_subtract.
ぐ イ き ん ぐ

Tamam, bu yüzden cevabınızın tek yararlı kısmı, tanımlamadığınız ve standart kütüphanede olmayan bir fonksiyonun adıdır. (Yalnızca glibc kılavuzunda: gnu.org/software/libc/manual/html_node/Elapsed-Time.html ).
Peter Cordes

-2

Kabarcık sıralama ve seçim sıralama yürütme süresinin karşılaştırılması Kabarcık sıralama ve seçim sıralama yürütme süresini karşılaştıran bir program var. Bir kod bloğunun yürütülme zamanını bulmak için, bloktan önceki ve sonraki zamanı hesaplayın.

 clock_t start=clock();
 
 clock_t end=clock();
 CLOCKS_PER_SEC is constant in time.h library

Örnek kod:

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
   int a[10000],i,j,min,temp;
   for(i=0;i<10000;i++)
   {
      a[i]=rand()%10000;
   }
   //The bubble Sort
   clock_t start,end;
   start=clock();
   for(i=0;i<10000;i++)
   {
     for(j=i+1;j<10000;j++)
     {
       if(a[i]>a[j])
       {
         int temp=a[i];
         a[i]=a[j];
         a[j]=temp;
       }
     }
   }
   end=clock();
   double extime=(double) (end-start)/CLOCKS_PER_SEC;
   printf("\n\tExecution time for the bubble sort is %f seconds\n ",extime);

   for(i=0;i<10000;i++)
   {
     a[i]=rand()%10000;
   }
   clock_t start1,end1;
   start1=clock();
   // The Selection Sort
   for(i=0;i<10000;i++)
   {
     min=i;
     for(j=i+1;j<10000;j++)
     {
       if(a[min]>a[j])
       {
         min=j;
       }
     }
     temp=a[min];
     a[min]=a[i];
     a[i]=temp;
   }
   end1=clock();
   double extime1=(double) (end1-start1)/CLOCKS_PER_SEC;
   printf("\n");
   printf("\tExecution time for the selection sort is %f seconds\n\n", extime1);
   if(extime1<extime)
     printf("\tSelection sort is faster than Bubble sort by %f seconds\n\n", extime - extime1);
   else if(extime1>extime)
     printf("\tBubble sort is faster than Selection sort by %f seconds\n\n", extime1 - extime);
   else
     printf("\tBoth algorithms have the same execution time\n\n");
}

4
Bu gerçekten yeni kıyasla şey katmıyor adimoh 'ın cevabı , bu doldurur o hariç 'bazı gerçek kod ile çalıştırılabilir kod' bloğunun (bunlardan veya iki). Ve bu cevap Alexandre C'nin iki yıl öncesinin cevabında olmayan hiçbir şeyi eklemiyor.
Jonathan Leffler
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.