Как добавить время, необходимое для выполнения функции внутри al oop? - PullRequest
0 голосов
/ 13 апреля 2020

У меня есть две реализации функции, и я хотел бы увидеть, какая из них быстрее. Назовите их foo1() и foo2(). У меня есть набор тестовых случаев, которые я хотел бы запустить против них обоих. Тестовые случаи хранятся в массиве, и я не хочу включать время, затраченное на доступ к массиву. Вот мой код Он не компилируется на duration += std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ) с сообщением об ошибке error: no match for 'operator<<' (operand types are 'std::basic_ostream<char>' and 'std::chrono::microseconds' {aka 'std::chrono::duration<long long int, std::ratio<1, 1000000> >'}) 52 | std::cout << "duration: " << duration << std::endl;.

Код:

/*[first argument, second argument, correct result]*/
 int inout[5][3] = {
    {10, 4, 5},
    {21, 4, 6},
    {22, 4, 7},
    {50, 5, 19},
    {100, 5, 7},
    //just example, real one is longer


};

std::chrono::microseconds duration = std::chrono::microseconds::zero();
for(auto& i : inout)
{
    auto t1 = std::chrono::high_resolution_clock::now();
    foo1(i[0], i[1]);
    auto t2 = std::chrono::high_resolution_clock::now();
    duration += std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();//this won't compile
}
std::cout << "duration of foo1(): " << duration << std::endl;

duration = std::chrono::microseconds::zero();
for(auto& i : inout)
{
    auto t1 = std::chrono::high_resolution_clock::now();
    foo2(i[0], i[1]);
    auto t2 = std::chrono::high_resolution_clock::now();
    duration += std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();//this won't compile
}
std::cout << "duration of foo2(): " << duration << std::endl;

Есть какие-нибудь предложения по чему-либо здесь? Я подумал, что было бы более целесообразно проверить скорость на предмет отсутствия кеша, поэтому должны ли чередоваться вызовы foo1() и foo2()? OTOH цель состоит в том, чтобы увидеть, какой из них быстрее, и оба извлекут выгоду из кеша, однако более крупный, вероятно, будет иметь больше пропусков кеша. Также из любопытства, какой тип на auto& i в foreach l oop?

Ответы [ 2 ]

3 голосов
/ 13 апреля 2020

Вот как это может быть:

std::chrono::microseconds duration = std::chrono::microseconds::zero();
for (auto &i : inout) {
  auto t1 = std::chrono::high_resolution_clock::now();
  // f1()
  auto t2 = std::chrono::high_resolution_clock::now();
  duration += std::chrono::duration_cast<std::chrono::microseconds>(
      t2 - t1);
}
std::cout << "duration of foo1(): " << duration.count() << std::endl;

duration = std::chrono::microseconds::zero();
for (auto &i : inout) {
  auto t1 = std::chrono::high_resolution_clock::now();
  // f2()
  auto t2 = std::chrono::high_resolution_clock::now();
  duration += std::chrono::duration_cast<std::chrono::microseconds>(
      t2 - t1);
}
std::cout << "duration of foo2(): " << duration.count() << std::endl;
}

Некоторое объяснение: Если у вас появляется сообщение об ошибке типа

<source>:23:14: error: no match for 'operator+=' (operand types are 'std::chrono::microseconds' {aka 'std::chrono::duration<long int, std::ratio<1, 1000000> >'} and 'std::chrono::duration<long int, std::ratio<1, 1000000> >::rep' {aka 'long int'})

   23 |     duration += std::chrono::duration_cast<std::chrono::microseconds>( t2 - t1 ).count();

Вы видите, что для microseconds нет оператора и long int. Таким образом, вы можете go обратиться к документации и посмотреть, какие операторы существуют для продолжительности, и вы найдете https://en.cppreference.com/w/cpp/chrono/duration/operator_arith3.

Вы видите, что вам нужно передать другую длительность, поэтому вам следует не звоните count() туда.

0 голосов
/ 13 апреля 2020

Если я предполагаю, что вы могли бы использовать time.h из библиотеки C, которая может помочь вам достичь того же. Только если вы не хотите использовать хронографический класс.

Вот что я хотел бы предложить.

#include <time.h>
#include <cstring>
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <unistd.h>
using namespace std;


  void foo1(){

    sleep(5);
  }
  int main(){

    time_t StarTime, EndTime;


    memset( &StarTime, 0x00, sizeof(StarTime));
    memset( &EndTime, 0x00, sizeof(EndTime));

    time(&StarTime);


    foo1();


    time(&EndTime);
    double secs = difftime(EndTime, StarTime);
    double mins =0.0;
    if(secs >= 60){
            mins = (secs/60);
            printf("Total Time:%-10.5f MINS\n",mins);
    }else{
            printf("Total Time:%-10.5f SECS\n",secs);
    }
    return 0;

  }

Это наблюдаемый результат.

Total Time:5.00000    SECS

Как вы можете видеть здесь, что у меня есть время, затраченное foo1 (), чтобы завершить, вы можете сделать это и для foo2 (), а затем сравнить их для бенчмаркинга.

...