2015-02-08 26 views
14

Bir keresinde clock() kullanmak yerine platform bağımlı bir yöntem (Windows için GetTickCount()) kullanmanız tavsiye edildi, çünkü bu kötü ya da güvenilir değil. Niye ya? Bununla birlikte, birçoklarının önerdiği <chrono> başlık işlevleri de var, ancak IDE'mde bulamıyorum (VS 2010).Saat() neden kötü sayılır?

Hedefim, eğer önemliyse, oyun geliştirme.

+3

Bu ilgisini çekebilir: http://en.cppreference.com/w/cpp/chrono/c/saat – Galik

+0

@Galik linkten bir cevap çıkart, oy verebilmemiz için! – Christophe

+0

@Galik işlevler düzgün görünüyor, yine de bu başlık yok. İndirmek mümkün mü? – Pilpel

cevap

19

O saat kötü olarak kabul edilir değil, mutlaka, insanların çoğu zaman. Yani, o üretmek için belirtilen değil düşünüyorum yolu çalışmasına tanımlı değil bile fazla . duvar saati, ya da 'gerçek', zaman

clock() nasıl kullanıldığı kadar CPU zamanı anlatmak için tanımlanır;. daha konuları kullanarak ipler az zaman kullanmak uyku daha fazla CPU zamanı kullanır

İkincisi, tüm platformlar imp aynı davranışı kirletmek; Bazı platformlar, clock()'u duvar saati saati verecekmiş gibi uygular. Böylece taşınabilir kod, her iki amaçla da kullanamaz.


Ancak bir nedeni clock() bile olmayan taşınabilir kullanımlar için, kötü düşünülebilir, zaman noktaları ve zaman süreleri arasında ayrım yapmaz bir 'tip-güvensiz' API olmasıdır ve bağlantıda bulunduğu Sizin için zaman birimlerini güvenli bir şekilde yönetemezsiniz. Örneğin, API'sini kullanarak, milisaniyeyi temsil etmek için kullanılan değerlerle mikrosaniyeyi temsil etmesi beklenen değerleri kolayca karıştırabilir.

C++ 11 <chrono> API

bu şeyler hakkında çok daha iyidir. Tek sorun, <chrono>'un bir CPU zaman saati içermemesidir. Duvar saati saati istiyorsanız, std::chrono::steady_clock en iyi seçimdir; Tip güvenli bir API'ye sahiptir ve 'gerçek zamanlı sabit bir hızda ilerlemek' için tanımlanmıştır.

0.1 saniye, her 4 mesajları uyku

http://coliru.stacked-crooked.com/a/6df6c71a436092e3


.
Geçen duvarın süresi: 0.101213 saniye.
Geçen işlem süresi: 0 saniye.
Her biri 0,1 saniye süreyle 4 konu dönüyor.
Geçen duvarın süresi: 0.100304 saniye.
Geçen işlem süresi: 0,4 saniye.

Ve burada eğlence için

std::clock() kullanmak için bir <chrono> tarzı saat var:

#include <chrono> 
#include <ratio> 
#include <ctime> 

struct cpu_clock { 
    using rep = std::clock_t; 
    using period = std::ratio<1, CLOCKS_PER_SEC>; 
    using duration = std::chrono::duration<rep, period>; 
    using time_point = std::chrono::time_point<cpu_clock, duration>; 

    static const bool is_steady = false; 

    static time_point now() noexcept { 
     return time_point{duration{std::clock()}}; 
    } 
}; 
+1

"Duvar saati zamanı" ile ne demek istiyorsun? – Pilpel

+1

Aşağıdaki kod göz önünde: 'void fonk (void * x) { \t süre (doğru) {} } void ana() { \t _beginthread (işlev, 0, 0); \t (true) \t \t cout << saat() << sonl; } ' CPU zamanı normal hızın iki katı artar, ancak olmaz. Niye ya? – Pilpel

+0

@Pilpel En belirgin cevap, kodun Windows olduğunu ve Visual Studio'daki 'clock'un bozuk olmasıdır. –

7

cppreference.com: std::clock(). işletim sistemi tarafından programa verilen yürütme kaynaklarına bağlı olarak std :: saat zamanı daha hızlı veya daha yavaş duvar saati daha ilerleyebilir

", . Örneğin, işlemci diğer süreçler tarafından paylaşılıyorsa , std :: saat saati duvar saatinden daha yavaş ilerleyebilir. diğer yandan, eğer mevcut işlem çok iş parçacıklı ise ve birden fazla yürütme çekirdeği varsa, std :: saat zamanı duvar saatinden daha hızlı ilerleyebilir. "

Ayrıca:

"saat ile döndürülen değeri() bazı uygulamaları etrafında sarın olabilir. Örneğin, 32 bit std :: clock_t, olan bir makinede, 2147 saniye veya 36 dakika sonra sarılır. "

Umut bu yardımcı olur.

İlgili konular