Єдина Країна!

Головне меню

Наша кнопка

Українські уроки про ІТ

Друзі

Підтримка української армії


Головна Програмування - C++ Базовий курс програмування на С++. Визначення швидкодії (часу виконання) програми

Базовий курс програмування на С++. Визначення швидкодії (часу виконання) програми
Написав Joker   
Вівторок, 24 травня 2016 22:39
Переглядів: 1498

 

 

- 4хвилини за чашку кави!? Вчора це коштувало 3!

- Вам потрібна кава чи спогади?

© фільм «Time»

 

Під час спортивного програмування одним із дуже важливих чинників є час роботи програми, її швидкодія. Це важливо і у інших випадках. Якщо ваша програма повільна чи працює не раціонально, то її корисність різко падає.

Якщо уявити, що ми навчимо якусь мавпу писати літери німецького алфавіту і ця мавпа буде вічно жити і весь час писати (вона буде забезпечена папером). То таким чином, колись у майбутньому вона може слово в слово переписати роман Е.М. Ремарка «Тріумфальна арка». Це ж по-суті теж можна вважати хорошим результатом. Мавпа виконала свою роботу, сама не знаючи цього. Але витрачений час повністю знецінює результат. Це звісно дещо перебільшений приклад, але проблема така ж.

Отже, все повинно бути швидко. У спортивному програмуванні використовують таке поняття як «обчислювальна складність». Але спершу варто вміти просто визначати скільки часу працює програма.

Для цього знадобиться секундомір. Все як у житті. Візьмемо спортсмена, який повинен пробігти одне коло навколо стадіону. Після команди «СТАРТ» вмикаємо секундомір і коли він перетне фінішну пряму ми зупиняємо відлік часу.

Тепер за роботу! Потрібно підключити бібліотеку

#include <ctime>

І використати функцію clock(), яка не приймає параметрів.

#include  <iostream>
#include  <ctime>
using namespace std;

int main()
{
   cout << "Hello world!" << endl;
   int a = clock();

   cout << a << endl;
   cout << ((float)a/CLOCKS_PER_SEC) << endl;

   return  0;
}

сlock() повертає час процесора на опрацювання програми. Але число представлене у часових тіках. Щоб перейти до секунд треба до програми додати закоментований рядок.

Це і все. Таким чином можна визначати і час роботи не цілої,  а лише фрагмента коду. Для цього потрібно використати ф-цію clock двічі. На початку того фрагменту, час якого потрібно підрахувати і у кінці. Віднявши від кінцевої функцію початкову ми отримаємо різницю, яка дорівнює часу виконання фрагмента.

Ось приклад такої програми:

// big array

#include  <iostream>
#include  <iomanip>
#include  <vector>
#include  <time.h>
#include  <cstdlib>
#include  <conio.h>
#include  <cstring>
#include  <cmath>
#include  <algorithm>
#include  <ctime>
using namespace std;


typedef unsigned int ui;

int main ()
{
   // system ("color B");
   const short int size = 200;
   srand(time(NULL));
   // cout << size << endl;

   int ar[size][size];

   // input
   for (int i=0; i<size; ++i)
   {
      for (int j=0; j<size; ++j)
      {
         ar[i][j] = -100 + rand() % 200;
         cout << ar[i][j] << "\t";
      }
      cout << endl;
   }

   ui a = clock();


   int Max = ar[0][0],
      Min = ar[0][0];

   // Search
   for (int i=0; i<size; ++i)
   {
      for (int j=0; j<size; ++j)
      {
         if (Min > ar[i][j])
            Min = ar[i][j];
         if (Max < ar[i][j])
            Max = ar[i][j];
      }
   }

   cout << "Max = " << Max << endl;
   cout << "Min = " << Min << endl;
   cout << "Finish!!!" << endl;
   ui b = clock();

   double t1 = ((double)b/CLOCKS_PER_SEC),
      t2 = ((double)a/CLOCKS_PER_SEC);

   cout << "Results: " << "\n" << "all program - " << t1 << endl;
   cout << "only search - " << t1 - t2 << endl;

   _getch();
   return  0;
}

P.S. Якщо вам цікаво дізнатися про обчислювальну складність, то відпишіть будь ласка у коментарях і я продовжу статтю.

Дякую за увагу.


( 10 Проголосувало )

Схожі статті:
Новіші матеріали:
Старіші матеріали:

Коментарі
Добавити новий
Галина  - Спортивне програмування   |2016-10-20 01:37:07
Дуже класне пояснення. Я завжди чула про
спортивне програмування, але не
приходилося визначати час особисто. А це
виявляэться просто.
Залишити коментар
Ім`я:
e-mail:
 
Тема:
 
:angry::0:confused::cheer:B):evil::silly::dry::lol::kiss::D:pinch:
:(:shock::X:side::):P:unsure::woohoo::huh::whistle:;):s
:!::?::idea::arrow:
 
Введіть цей настирливий код
Русская редакция: www.freedom-ru.net & www.joobb.ru

3.26 Copyright (C) 2008 Compojoom.com / Copyright (C) 2007 Alain Georgette / Copyright (C) 2006 Frantisek Hliva. All rights reserved."

 

Ввійти



Підписка

Хто онлайн?

Немає
На даний момент 132 гостей на сайті

Український рейтинг
TOP.TOPUA.NET