omaxphp
@omaxphp
Выучиться не значит знать

Как проверить скорость выполнения кода на C++?

#include <iostream>
using namespace std;

int main()
{

 int n = 12;
 int a[n];

 a[0]=-1;
 a[1]=5;
 a[2]=4;
 a[3]=6;
 a[4]=0;
 a[5]=9;
 a[6]=7;
 a[7]=10;
 a[8]=-5;
 a[9]=23;
 a[10]=-9;
 a[11]=1;

int i = 0;
int j = 0;
int buffer = 0;

for(i=0; i<n; ++i){
    for (j=0;j<(n-1-i); ++j){
      if (a[j]>a[j+1]) {
          buffer = a[j+1];
          a[j+1] = a[j];
          a[j] = buffer;
       }
    }
}

 for (i=0; i<n; ++i) {
     cout<<a[i]<<endl;
 }



 system("pause");
 return 0;
}


Как проверить скорость работы функции main()? в микро(нано) секундах?
  • Вопрос задан
  • 6192 просмотра
Решения вопроса 4
cjey
@cjey
#include <iostream>
#include <cstdio>
#include <ctime>

int main() {
    std::clock_t start;
    double duration;

    start = std::clock();

    /* Сюда вставить тестируемый код */

    duration = ( std::clock() - start ) / (double) CLOCKS_PER_SEC;

    std::cout<<"printf: "<< duration <<'\n';
}


Если значение будет чересчур мало, то можно повторить тестируемый код 1000 раз и итоговое время разделить на 1000.

А вообще нужно увеличить значение N хотя бы до 10000, и заполнять массив случайными значениями в цикле.
Ответ написан
Комментировать
Trrrrr
@Trrrrr
Если это Windows, то я бы порекомендовал бы использовать QueryPerfomanceCounter.
void StartCounter()
{
    LARGE_INTEGER li;
    if(!QueryPerformanceFrequency(&li))
	cout << "QueryPerformanceFrequency failed!\n";

    PCFreq = double(li.QuadPart)/1000.0;

    QueryPerformanceCounter(&li);
    CounterStart = li.QuadPart;
}
double GetCounter()
{
    LARGE_INTEGER li;
    QueryPerformanceCounter(&li);
    return double(li.QuadPart-CounterStart)/PCFreq;
}

int main()
{
    StartCounter();
    // твой код тут
    cout << GetCounter() <<"\n";
    return 0;
}
Ответ написан
Комментировать
jcmvbkbc
@jcmvbkbc
http://dilbert.com/strip/1998-08-24
Как проверить скорость работы функции main()? в микро(нано) секундах?

Это не имеет смысла по двум причинам:
- во-первых потому что вычислительных операций настолько мало, что флуктуации из-за кэша/виртуальной памяти/прерываний вам исказят всю картину,
- во-вторых у вас там вывод в поток, который сам занимается форматированием, а потом вызывает функцию ввода/вывода в ядре.
В итоге ваше замеренное время будет временем выполнения операции файлового ввода-вывода.
Ответ написан
Комментировать
SHVV
@SHVV
В институте использовали ассемблерную команду "rdtsc", она возвращает количество тактов с момента включения комьютера. Под win достаточно использовать QueryPerformanceCounter, как уже посоветовали, она внутри тоже испульзует "rdtsc".
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 2
smanioso
@smanioso
Отмечайте ответы на свои вопросы!
Можно предположить O(1) для оптимизирующего компилятора.
Ответ написан
@Kyberman
Если на Linux, то можно воспользоваться командой time.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы