menghitung centang CPU

Saya sedang membangun proyek yang membandingkan beberapa metode untuk singleton dalam hal kecepatan.

Apa yang saya coba lakukan adalah meminta pengguna memasukkan berapa kali mereka ingin menjalankan setiap metode, mengulanginya, dan menghitung detak CPU.

Masalahnya tebal CPU semuanya 0. Apa yang harus saya lakukan?

Ini kode saya:

int numOfCalls;
cout << "How many calls do you want for each?";
cin >> numOfCalls;
clock_t beg, end;
beg = clock();
for (size_t i = 0; i != numOfCalls; i++)
    Object* p = GofFixed::instance_GofFixed();
end = clock();
cout << (beg-end) / CLOCKS_PER_SEC << endl;
beg = clock();
for (size_t i = 0; i != numOfCalls; i++)
    Boost::instance_Boost();
end = clock();
cout << (beg - end) / CLOCKS_PER_SEC << endl;

person PHG    schedule 28.05.2015    source sumber
comment
1) clock() memberikan beberapa ukuran waktu prosesor, tetapi mungkin tidak mewakili detak CPU 2) tipe clock_t dan CLOCKS_PER_SECOND mungkin tipe bilangan bulat, sehingga ekspresi pembagian Anda kemungkinan terpotong 3) tolok ukur Anda cukup sederhana, sehingga mungkin menjadi subjek ke pengoptimal yang menghilangkan banyak atau semua iterasi loop.   -  person Michael Burr    schedule 28.05.2015
comment
Centang jam default bisa sangat besar, Windows memiliki fiksasi pada 1/64 tick per detik, jadi hal pertama yang perlu Anda ketahui adalah seberapa besar tick sistem Anda. Jika Windows Lama memiliki waktu 15,625 ms, Anda mungkin harus menjalankan jutaan iterasi program pada PC 2 GHz untuk melihat 1 centang saja. Lihat: stackoverflow.com/questions/12244153/   -  person user4581301    schedule 28.05.2015
comment
Periksa perakitan yang dihasilkan, kompiler Anda mungkin telah menghilangkan loop for seluruhnya karena Anda tidak pernah melakukan apa pun dengannya atau hasilnya.   -  person Alejandro    schedule 28.05.2015
comment
Berikut perakitan yang dihasilkan untuk gcc 4.9.2 tanpa pengoptimalan, dan Di sini dikompilasi dengan -O2. Perhatikan main: . Build yang dioptimalkan bahkan tidak mencapai loop for (saya mengubah fungsinya sedikit, karena saya tidak memiliki akses ke GofFixed::), tetapi idenya sama.   -  person Alejandro    schedule 28.05.2015
comment
Apa yang saya coba lakukan adalah menghitung berapa lama waktu yang dibutuhkan untuk menjalankan setiap metode berapa pun kali pengguna memasukkan. Jadi, adakah cara paling sederhana untuk melakukannya?   -  person PHG    schedule 28.05.2015


Jawaban (1)


clock_t diperbolehkan menjadi tipe integer menurut standar. Jika ya, maka tunduk pada aturan pembagian bilangan bulat. Sepertinya benchmark Anda mungkin akan berjalan dalam waktu kurang dari satu detik. Jika ya, maka (beg - end) / CLOCKS_PER_SECOND akan menghasilkan hasil yang kurang dari 1, yang kemudian akan dipotong menjadi 0.

Cara yang lebih baik untuk mengukur waktu adalah dengan menggunakan std::chrono::high_resolution_clock. Anda kemudian dapat mengonversi ke satuan waktu apa pun yang didukung oleh perpustakaan standar. Akan lebih baik jika menggunakan satuan waktu yang lebih kecil agar pengukuran sub-detik tetap terjaga. Menggunakan chrono akan mengubah kode Anda menjadi ini:

auto beg = std::chrono::high_resolution_clock::now();
for (size_t i = 0; i != numOfCalls; i++)
    Object* p = GofFixed::instance_GofFixed();
auto end = std::chrono::high_resolution_clock::now();
cout << std::chrono::duration_cast<std::chrono::milliseconds>(beg - end).count() << endl;
                                           //   ^^^^^^^^^^^^ Used milliseconds instead
                                           //                for greater accuracy

Yang seharusnya berfungsi jika benchmark tidak dioptimalkan atau tidak memerlukan waktu kurang dari satu milidetik.

Anda dapat membaca lebih lanjut di std::chrono::high_resolution_clock di sini dan std::chrono::duration_cast di sini.

person phantom    schedule 28.05.2015