Я пытаюсь реализовать класс таймера, который печатает время, необходимое для данной области. Как-то не могу заставить его работать должным образом. Мой код на данный момент:
Main.cpp:
#include "scopetimer.hpp"
#include <cstdlib>
#include <cmath>
#include <string>
#include <chrono>
#include <iostream>
void work01()
{
double numbers[10000];
for (int i = 0; i < 10000; ++i)
{
numbers[i] = double(std::rand()) / double(RAND_MAX);
}
for (int n = 10000; n > 1; n = n - 1) {
for (int i = 0; i < n - 1; i = i + 1) {
if (numbers[i] > numbers[i + 1]) {
double tmp = numbers[i];
numbers[i] = numbers[i + 1];
numbers[i + 1] = tmp;
}
}
}
}
void work02()
{
int* buf[1024];
for (int i = 2; i < 1024; ++i)
buf[i] = new int[i];
for (int i = 2; i < 1024; ++i)
delete[] buf[i];
}
// counts the number of primes in an interval
int work03(int n0, int n1)
{
int freq = n1 - n0 + 1;
for (int i = n0; i <= n1; ++i)
{
// Have fun: use the alternative iteration direction and see how fast
// it gets!
// for(int j = 2; j < i; ++j)
for (int j = i - 1; j > 1; --j)
{
if (i%j == 0)
{
--freq;
break;
}
}
}
return freq;
}
int main(int, char**)
{
{ ScopeTimer("work01");
work01();
}
{
ScopeTimer("work02");
work02();
}
{
ScopeTimer("work03");
work03(0, 10000);
}
std::cout << std::endl << "Tests" << std::endl << std::endl;
{
clock_t start_(std::clock());
work01();
clock_t end_(std::clock());
std::cout << "Test Timer: " << end_ - start_ << "ns" << std::endl;
}
{
clock_t start_(std::clock());
work02();
clock_t end_(std::clock());
std::cout << "Test Timer: " << end_ - start_ << "ns" << std::endl;
}
{
clock_t start_(std::clock());
work03(0,10000);
clock_t end_(std::clock());
std::cout << "Test Timer: " << end_ - start_ << "ns" << std::endl;
}
system("Pause");
}
scopetimer.cpp
#include "scopetimer.hpp"
#include <cmath>
#include <string>
#include <chrono>
#include <iostream>
ScopeTimer::ScopeTimer(const std::string& name)
:name_(name),
start_(std::clock()) {
}
ScopeTimer::~ScopeTimer() {
double elapsed = (double(std::clock() - start_) / double(CLOCKS_PER_SEC));
std::cout << name_ << ": " << int(elapsed) << "ns" << std::endl;
}
Я тестировал функции часов вне ScopeTimer (), и они отлично работают. Итак, насколько я могу судить, единственная проблема заключается в том, что я не могу заставить работать ScopeTimer (). Он всегда печатает 0ns. Я в основном следил за турориалом: https://felix.abecassis.me/2011/09/cpp-timer-raii/
С уважением
В ~ScopeTimer()
вы печатаете, сколько полных секунд прошло, а не сколько наносекунд, тогда как во второй части main
вы печатаете количество тактов часов, которое может быть или не совпадать с наносекундами.
Я столкнулся с той же проблемой
Решение для меня - определить экземпляр ScopeTimer, а не просто вызвать его конструктор, я имею в виду:
{
ScopeTimer _scopetimer("work01");
work01();
}
Это должно работать
Я предполагаю, что компилятор игнорирует (оптимизирует) это, потому что когда вы просто вызываете ScopeTimer ("work01").
На самом деле не отвечаю на ваш вопрос:
clock()
- это функция c. Если вам нужен C++, вам лучше взглянуть на<chrono>
.