1

Тема: Як рахувати час виконання шматка кода?

Прів. Мені тре навчитись якось рахувати, скільки часу робить шматок коду, аби можна було сказати, шо ось реалізація А краща за реалізацію Б, бо виконується швидше і робе те саме.
Раніше я то робив за допомогою простих таймштампів, типу перед кодом запам'ятовую поточний час, а після виконання коду віднімаю від поточного часу ту часову мітку, котру запам'ятав до цього.
Але ж воно наче не вірно, ага? Адже не тілько одна моя прога виконується в даний час, а й купа інших, тому тре рахувати не час, а кількість якихось отих тактів процесора, котрі потрібні для виконання коду.
То як то все робити, аби точно вийшло?

Подякували: 0xDADA11C71

2 Востаннє редагувалося Itari (27.11.2015 17:47:54)

Re: Як рахувати час виконання шматка кода?

Але ж воно наче не вірно, ага?

Ага. Настіки невірно, як 2+2=4,000000000001
у тебе Ось реального часу, чи саме вінда?
Якщо друге - так і рахуй тактами, те зневажай, якщо перше, то... співчуваю, ті провтикав стратегію. Переробляй ПЗ.
А якщо це твій замначшефдіргенштаб дав наказ - посилай його туди, де сонця не буває ніколи.

3

Re: Як рахувати час виконання шматка кода?

То збільште приортиет вашої програми до реального часу і обрамляйте цікаві вам ділянки критичними секціями.

Подякували: FakiNyan, leofun012

4

Re: Як рахувати час виконання шматка кода?

Вимірюйте через microtime
В шарпі це буде якось так
http://2lx.ru/2010/02/microtime-v-c/

5

Re: Як рахувати час виконання шматка кода?

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

Подякували: FakiNyan1

6 Востаннє редагувалося raxp (27.11.2015 18:21:45)

Re: Як рахувати час виконання шматка кода?

SETPRIORITYCLASS(GETCURRENTPROCESS, REALTIME_PRIORITY_CLASS)
+
Gettickcount() до та пiсля декiлька разiв.

MSDN.

Подякували: 0xDADA11C71

7

Re: Як рахувати час виконання шматка кода?

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

Найпростіший метод визначення порядку росту - експеримент подвоєння. Він полягає в тому що виконується кілька ітерацій обробки даних з постійним подвоєнням кількості цих даних в кожній ітерації і заміром часу, затраченого на кожну ітерацію.
На пальцях:
1. береться кількість даних, наприклад 1000 і для цієї кількості даних виконується обробка і заміряється час
2. в наступній ітерації кількість даних подвоюється - 2000 і знову виконується обробка даних і заміряється час
3. в наступній - 4000... в наступній - 8000... 16000.

В результаті маємо простеньку табличку типу: кількість даних - час

1000 - 0.32
2000 - 1.24
4000 - 4.91
8000 - 19.93
16000 - 78.19

Для того щоб вирахувати порядок росту потрібно просто розділити час ітерації на час попередньої ітерації.

1.24 / 0.32;  4.91 / 1.24; 19.93 / 4.91; 78.19 / 19.93;

В даному прикладі якщо порахувати то видно що подвоєння даних вдвічі збільшує час виконання в 4 рази - це алгоритм квадтратичної складності (O) n^2. Квадратичну складність, зазвичай, мають алгоритми типу "цикл в циклі".  Наприклад, найпростіші алгоритми сортування такі як бульбашкове, шейкерне, виборкою, вставками мають квадратичний порядок росту.
За порядком росту можна порівнювати різні алгоритми і вибирати швидший.
Експериментальне поєднання це простий і примітивний спосіб оцінки алгоритму, який не завжди дає змогу визначити "кращий" алгоритм. Оцінка алгоритмів це взагалі ціла наука :)

Подякували: quez, leofun012

8

Re: Як рахувати час виконання шматка кода?

Ян

Прихований текст

:D

9

Re: Як рахувати час виконання шматка кода?

Arete написав:

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

Найпростіший метод визначення порядку росту - експеримент подвоєння. Він полягає в тому що виконується кілька ітерацій обробки даних з постійним подвоєнням кількості цих даних в кожній ітерації і заміром часу, затраченого на кожну ітерацію.
На пальцях:
1. береться кількість даних, наприклад 1000 і для цієї кількості даних виконується обробка і заміряється час
2. в наступній ітерації кількість даних подвоюється - 2000 і знову виконується обробка даних і заміряється час
3. в наступній - 4000... в наступній - 8000... 16000.

В результаті маємо простеньку табличку типу: кількість даних - час

1000 - 0.32
2000 - 1.24
4000 - 4.91
8000 - 19.93
16000 - 78.19

Для того щоб вирахувати порядок росту потрібно просто розділити час ітерації на час попередньої ітерації.

1.24 / 0.32;  4.91 / 1.24; 19.93 / 4.91; 78.19 / 19.93;

В даному прикладі якщо порахувати то видно що подвоєння даних вдвічі збільшує час виконання в 4 рази - це алгоритм квадтратичної складності (O) n^2. Квадратичну складність, зазвичай, мають алгоритми типу "цикл в циклі".  Наприклад, найпростіші алгоритми сортування такі як бульбашкове, шейкерне, виборкою, вставками мають квадратичний порядок росту.
За порядком росту можна порівнювати різні алгоритми і вибирати швидший.
Експериментальне поєднання це простий і примітивний спосіб оцінки алгоритму, який не завжди дає змогу визначити "кращий" алгоритм. Оцінка алгоритмів це взагалі ціла наука :)

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

10

Re: Як рахувати час виконання шматка кода?

Ви ж під Windows пишете? Гляньте QueryProcessCycleTime та (якщо у вас багатопоточна програма) QueryThreadCycleTime.

Подякували: FakiNyan, leofun012

11

Re: Як рахувати час виконання шматка кода?

QueryProcessCycleTime() под XP не буде працювати, наприклад. Та TC не вказав ОС досi.

Подякували: koala1

12

Re: Як рахувати час виконання шматка кода?

raxp написав:

QueryProcessCycleTime() под XP не буде працювати, наприклад. Та TC не вказав ОС досi.

Та і під 3.1 ніби ні. За замовчанням кажуть про підтримувані системи - а вже і 2003 не підтримується.

13

Re: Як рахувати час виконання шматка кода?

Зазвичай для такого використовують
https://msdn.microsoft.com/uk-ua/librar … .110).aspx

Подякували: koala, FakiNyan, leofun013

14

Re: Як рахувати час виконання шматка кода?

3.1 вже крайнощі, однак навiть 3.1 використовується, в аеропорту «Париж - Орлі» наприклад.

За замовчанням кажуть про підтримувані системи

виходячи з мого досвіду адміністрування та модерування форумiв cей висновок є думка за топикстартера. Нехай сам за себе скаже.

15

Re: Як рахувати час виконання шматка кода?

А ТС розмістив це питання в такій темі, яка, власне, виключає суперечки. truesupport дав правильну відповідь.

16 Востаннє редагувалося -=ЮрА=- (06.12.2015 20:41:51)

Re: Як рахувати час виконання шматка кода?

FakiNyan, QueryPerformanceCounter у допомогу
https://msdn.microsoft.com/uk-ua/librar … s.85).aspx
Та почитай ось це
"Acquiring high-resolution time stamps" https://msdn.microsoft.com/uk-ua/librar … s.85).aspx