Diğerlerinin de belirttiği gibi, C standart kitaplığındaki time () işlevi bir saniyeden daha iyi bir çözünürlüğe sahip değildir. Daha iyi çözünürlük sağlayabilen tek tamamen taşınabilir C işlevinin saat () olduğu görülür, ancak bu, duvar saati yerine işlemci süresini ölçer. Eğer kişi kendini POSIX platformlarıyla (ör. Linux) sınırlandıracak içerikse, clock_gettime () fonksiyonu iyi bir seçimdir.
C ++ 11'den bu yana, farklı derleyiciler ve işletim sistemleri arasında çok taşınabilir olması gereken bir biçimde daha iyi çözünürlük sunan daha iyi zamanlama olanakları mevcuttur. Benzer şekilde boost :: datetime kütüphanesi, yüksek düzeyde taşınabilir olması gereken iyi yüksek çözünürlüklü zamanlama sınıfları sağlar.
Bu olanaklardan herhangi birinin kullanılmasındaki zorluklardan biri, sistem saatinin sorgulanmasıyla ortaya çıkan zaman gecikmesidir. Clock_gettime (), boost :: datetime ve std :: chrono ile denemeler yaparak , bu gecikme mikrosaniye ile ilgili olabilir. Bu nedenle, kodunuzun herhangi bir bölümünün süresini ölçerken, bu boyutta bir ölçüm hatası olmasına izin vermeniz veya bu sıfır hatayı bir şekilde düzeltmeye çalışmanız gerekir. İdeal olarak, fonksiyonunuz tarafından alınan zamanın çoklu ölçümlerini toplamak ve birçok çalışma boyunca ortalama veya maksimum / minimum süreyi hesaplamak isteyebilirsiniz.
Yardım için tüm bu taşınabilirlik ve istatistik toplama sorunları, ben üzerine kütüphane mevcuttur cxx-rtimers gelişmekte oldum Github sıfır hataları bilgisayar, C ++ kod zamanlama blokları için basit bir API sağlamaya çalışır ve çoklu sayaçları da istatistikler raporlama gömülü kodunuzda. Bir C ++ 11 derleyiciniz varsa, basitçe #include <rtimers/cxx11.hpp>
ve şöyle bir şey kullanın:
void expensiveFunction() {
static rtimers::cxx11::DefaultTimer timer("expensiveFunc");
auto scopedStartStop = timer.scopedStart();
// Do something costly...
}
Program çıkışında, std :: cerr'e yazılan zamanlama istatistiklerinin bir özetini alırsınız, örneğin:
Timer(expensiveFunc): <t> = 6.65289us, std = 3.91685us, 3.842us <= t <= 63.257us (n=731)
ortalama süreyi, standart sapmasını, üst ve alt limitleri ve bu fonksiyonun kaç kez çağrıldığını gösterir.
Linux'a özgü zamanlama işlevlerini kullanmak istiyorsanız #include <rtimers/posix.hpp>
, veya Boost kitaplıklarınız varsa ancak daha eski bir C ++ derleyiciniz varsa bunu yapabilirsiniz #include <rtimers/boost.hpp>
. Bu zamanlayıcı sınıflarının birden çok iş parçacığından istatistiksel zamanlama bilgisi toplayabilen sürümleri de vardır. Ayrıca, sistem saatinin hemen ardışık iki sorgusuyla ilişkili sıfır hatasını tahmin etmenizi sağlayan yöntemler de vardır.
time()
farklı bir değer döndürür.