std :: chrono дает другое значение при использовании из основного или из метода класса - PullRequest
0 голосов
/ 01 октября 2019

Я создал служебный класс в C ++, чтобы иметь возможность получать время выполнения различных методов. Я пытаюсь сохранить время, рассчитанное с использованием хронографа, в структуре, чтобы я мог сохранить все методы, которые я использую в программе, для измерения и печати в конце. Проблема в том, что большую часть времени, когда я вызываю это из другого кода, он возвращает 0 в качестве вывода, но если я использую chrono.now для непосредственного вычисления истекшего времени в основной функции, он дает фактический результат.

Ниже описано, как я создал методы в файле c ++ для сбора времени из разных функций (заголовок и cpp разные, но я объявил struct непосредственно в файле cpp):

Объявление структуры иинициализация:

struct analysis{
    const char * func_name;
    int calc_time;
    analysis(const char* x, const int y):
    func_name(x), calc_time(y){}
};
vector<analysis> time_coll {};

метод для начала сохранения времени:

void Utility::tStart(){
      auto chrono_strt = chrono::high_resolution_clock::now(); 
      sink = chrono_strt;
}

метод для сохранения времени окончания:

void Utility::tEnd(const char* func_name){
    std::chrono::high_resolution_clock::time_point chrono_stp = chrono::high_resolution_clock::now(); 
    std::chrono::microseconds elapsed = std::chrono::duration_cast<std::chrono::microseconds>(chrono_stp - sink);    
    time_coll.push_back((analysis(func_name, elapsed.count())));    
}

метод для печати времени в конце:

void Utility::pStat(){
    for( const auto& elem: time_coll){
        cout << elem.func_name  << " : " << elem.calc_time << endl;
    }
}

Пример использования в другом методе:

void Sort::BubbleSort(vector<int>& a){
    u.tStart();
    int temp;
    for (int i=0; i<=(a.size());i++){
        for(int j=0; j<=(a.size())-2;j++){
            if(a[j]>a[j+1]){
                temp = a[j];
                a[j] = a[j+1];
                a[j+1] = temp;
            }
        }

    }
    u.tEnd(__FUNCTION__);
}

Вышеуказанные методы в основном дают 0 в качестве результата, за исключением того, что я даю чрезвычайно большой вклад в проверяемую функцию (я проверял ее)на пузырьковую сортировку). Когда я вызываю хроно в главном файле от начала до конца (без использования вышеупомянутых методов), я получаю правильный результат.

1 Ответ

0 голосов
/ 01 октября 2019

В этом контексте это зависит от того, что вы имеете в виду с очень большим вводом. На современных компьютерах пузырьковая сортировка будет выполняться очень быстро, в том числе и при относительно больших затратах. Я подозреваю, что функция выполняется слишком быстро по сравнению с вашим разрешением длительности (микросекунды).

Мой совет будет не приводить продолжительность, рассчитанную по часам, а сохранять ее напрямую, что-то вроде следующих строк (не проверено):

struct analysis {
  analysis(const char* x, const chrono::nanoseconds y) : func_name{x}, calc_time{y} {}

  string func_name;
  chrono::nanoseconds calc_time;
};

void Utility::tEnd(const char* func_name) {
  std::chrono::nanoseconds elapsed{chrono::high_resolution_clock::now() - sink};    
  time_coll.emplace_back(func_name, elapsed);    
}

Затем, когда сообщаетсяистекшее время, преобразуйте в микросекунды в это время:

void Utility::pStat() {
  using FractionalUs = std::chrono::duration<double, std::micro>;
  for (const auto& elem: time_coll) {
    cout << elem.func_name  << " : " 
         << std::chrono::duration_cast<FractionalUs>(elem.calc_time).count() << "us\n";
  }
}
...