Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.87/23: Рейтинг темы: голосов - 23, средняя оценка - 4.87
1 / 1 / 1
Регистрация: 02.11.2009
Сообщений: 8

Измерение времени исполнения алгоритма через Clock() периодически равно 0

02.11.2009, 22:46. Показов 4819. Ответов 9
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Здравствуйте!
Я в отчаянии
Была программа на C# и появилась необходимость перевести ее на С++. Но как переписать
System.Diagnostics.Stopwatch myStopWatch = new System.Diagnostics.Stopwatch();
myStopWatch.Start();
............
myStopWatch.Stop();
я так и не осилил. Необходимо выводить результат в милисекундах

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "stdafx.h"
#include <iostream>
#include "time.h"
#include <windows.h>
#include "conio.h"
using namespace std;
 
 
void Counting(int from, int To, double* & xx, double* & s, double* x, double* F, double h, double h1)
{
    double A;
    for (int i = from; i < 1.0 + To; i++)
    {
        for (int j = 0; j <= 9.0; j++)
        {
            xx[-10 + 10 * i + j] = x[i - 1] + j * h1;                    
            A = j * h1 / h;                    
            s[-10 + 10 * i + j] = F[i - 1] * (1.0 - A) + A * F[i];
        }
    }
}
 
 
long Res()
{
    int n = 30000;
    double h;
    double h1;
    int i;
    double* x = new double[1 + n];
    double* F = new double[1 + n];
    double* s = new double [10*n];
    double* xx = new double[10*n];
 
    h = 2.0 / n;
 
 
    for (i = 1; i <= 1.0 + n; i++)
    {
        x[i - 1] = -1.0 + i * h - h;
        F[i - 1] = 1 / (1.0 + 25.0 * x[i - 1] * x[i - 1]);
    }
    
    clock_t start,stop,myStopWatch;
    start=clock();
 
    h1 = h / 10.0;            
    Counting(1, n, xx, s, x, F, h, h1);
    stop = clock();
 
    myStopWatch = stop-start;
    delete []x;
    delete []xx;
    delete []s;
    delete []F;
 
    return myStopWatch;
}
 
 
 
int main()
{
    double d=0;
    int k;
    for (int i=0; i<1999; i++)
    {
        k=Res();
        cout<<k<<endl;
        d+=k;
    }
    d = d / 2000;
    cout<<d<<endl;
    getch();    
    return 0;
}
В чем конкретно проблема:
в~800 из 2000 запусков Res() возвращает 0, в оставшиеся запуски - ~16(ну вообщем достаточно ровные результаты)

Как бороться?

Заранее большое спасибо всем откликнувшимся
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
02.11.2009, 22:46
Ответы с готовыми решениями:

Измерение времени выполнения алгоритма
Подскажите, какие функции нужно использовать (и как их использовать) для замера времени выполнения алгоритма в миллисекундах в...

Возможно ли сделать отсчет времени в лотусе Clock In/ Clock Out
Привет лотусистам! Такая вот задача. Когда человек приходит на работу он в лотусе где то ставит что он начал работу, каждые 4 часа он...

Замер времени работы функции через clock()
Имеется некая функция, требуется замерить время её выполнения. Накидал такой код : #include &lt;iostream&gt; #include...

9
Эксперт С++
 Аватар для niXman
3211 / 1459 / 74
Регистрация: 09.08.2009
Сообщений: 3,441
Записей в блоге: 2
02.11.2009, 22:52
http://msdn.microsoft.com/en-u... 85%29.aspx
1
8 / 8 / 0
Регистрация: 25.11.2008
Сообщений: 32
02.11.2009, 22:55
16 - это погрешность, т.е. скорее всего это тоже ноль
либо ошибка в программе, либо попробуйте зациклить свой алгоритм, выполнить его раз 100 или 1000
1
1 / 1 / 1
Регистрация: 02.11.2009
Сообщений: 8
03.11.2009, 00:48  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
#include "stdafx.h"
#include <iostream>
#include "time.h"
#include <windows.h>
#include "conio.h"
using namespace std;
 
 
void Counting(int from, int To, double* & xx, double* & s, double* x, double* F, double h, double h1)
{
    double A;
    for (int i = from; i < 1.0 + To; i++)
    {
        for (int j = 0; j <= 9.0; j++)
        {
            xx[-10 + 10 * i + j] = x[i - 1] + j * h1;                    
            A = j * h1 / h;                    
            s[-10 + 10 * i + j] = F[i - 1] * (1.0 - A) + A * F[i];
        }
    }
}
 
 
double Res()
{
    int n = 30000;
    double h;
    double h1;
    int i;
    double* x = new double[1 + n];
    double* F = new double[1 + n];
    double* s = new double [10*n];
    double* xx = new double[10*n];
 
    h = 2.0 / n;
 
 
    for (i = 1; i <= 1.0 + n; i++)
    {
        x[i - 1] = -1.0 + i * h - h;
        F[i - 1] = 1 / (1.0 + 25.0 * x[i - 1] * x[i - 1]);
    }
    
    LARGE_INTEGER start2;
    LARGE_INTEGER stop2;
    QueryPerformanceCounter(&start2);
 
    h1 = h / 10.0;            
    Counting(1, n, xx, s, x, F, h, h1);
 
    QueryPerformanceCounter(&stop2);
    delete []x;
    delete []xx;
    delete []s;
    delete []F;
 
    return (stop2.QuadPart-start2.QuadPart);
}
 
 
 
int main()
{
    double d=0;
    double k;
    for (int i=0; i<1999; i++)
    {
        k=Res();
        cout<<k<<endl;
        d+=k;
    }
    d = d / 2000;
    cout<<d<<endl;
    getch();    
    return 0;
}
Написал вот так вот.. Результаты около 24000-25000. Этому можно верить? Или в QueryPerformanceCounter тоже есть подвох?? (+ еще один дилетантский вопрос - а 25000 чего? микросекунд?)

p.s. Random,niXman спасибо!
0
8 / 8 / 0
Регистрация: 25.11.2008
Сообщений: 32
03.11.2009, 10:44
мне кажется, это не совсем верно. у вас получается, что вы 1999 раз засекаете время и потом его суммируете. вам нужно засекать время единожды, а алгоритм выполнять много раз
а что такое счетчик производительности я к сожалению не знаю
0
1 / 1 / 1
Регистрация: 02.11.2009
Сообщений: 8
04.11.2009, 12:58  [ТС]
Написал вот так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include "stdafx.h"
#include <iostream>
#include "time.h"
#include <windows.h>
#include "conio.h"
using namespace std;
 
 
void Counting(int from, int To, double* xx, double* s, double* x, double* F, double h, double h1)
{
        double A;
    for (int i = from; i < 1.0 + To; i++)
    {
                for (int j = 0; j <= 9.0; j++)
                {
                        xx[-10 + 10 * i + j] = x[i - 1] + j * h1;                    
                        A = j * h1 / h;                    
                        s[-10 + 10 * i + j] = F[i - 1] * (1.0 - A) + A * F[i];
                }
        }
}
 
 
double Res()
{
    int n = 30000;
    double h;
    double h1;
    int i;
    double* x = new double[1 + n];
    double* F = new double[1 + n];
    double* s = new double [10*n];
    double* xx = new double[10*n];
 
    h = 2.0 / n;
 
 
    for (i = 1; i <= 1.0 + n; i++)
    {
        x[i - 1] = -1.0 + i * h - h;
        F[i - 1] = 1 / (1.0 + 25.0 * x[i - 1] * x[i - 1]);
    }
 
    h1 = h / 10.0;      
    int c = -GetTickCount();
    for (i=0; i<1999;i++) 
       Counting(1, n, xx, s, x, F, h, h1);
    c+=GetTickCount();
    delete []x;
    delete []xx;
    delete []s;
    delete []F;
 
    return c;
}
 
 
 
int main()
{
        double k=Res();
        k/=2000;
        cout<<k<<endl;
        getch();        
        return 0;
}
Гуру, подскажите, оно действительно меряет время измерения функции? И меряет правильно? Я уже столько всего перепробовал, что ничему не верю

И еще,почему если в int c = GetTickCount() "c" сделать типа double, а не int - выводятся результаты в духе 2.14439е+006, а в int - 6-7. Так и должно быть?
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2009, 12:58
Попробуй использовать GetThreadTimes, пример ниже:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
_int64 FileTimeToQuadWord(PFILETIME pft)
{
    return(Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
 
void PerformLongOperation ()
{
    FILETIME ftKernelTimeStart, ftKernelTimeEnd; 
    FILETIME ftUserTimeStart, ftUserTimeEnd; 
    FILETIME ftDummy;
 
    _int64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;
 
    // получаем начальные показатели времени 
    GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,
                   &ftKernelTimeStart, &ftUserTimeStart);
 
    // здесь выполняем сложный алгоритм 
 
    // получаем конечные показатели времени
    GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,
                   &ftKernelTimeEnd, &ftUserTimeEnd);
 
    // получаем значении времени, затраченного на выполнение ядра и User, 
    // преобразуя начальные и конечные показатели времени из FILETIME 
    // в учетверенные слова, а затем вычитая начальные показатели из конечных 
    qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) -
                          FileTimeToQuadWord(&ftKernelTimeStart);
 
    qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd) -
                        FileTimeToQuadWord(&ftUserTimeStart);
 
    // получаем общее время, складывая время выполнения ядра и User 
    qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
 
    // общее время хранится в qwTotalTimeElapsed
 
}
qwTotalTimeElapsed - время, выраженное в интервалах по 100 нс.
По поводу GetTickCount, цитата из книги Дж.Рихтер "Создание эффективных Win32 приложений ":
Иногда нужно знать, сколько времени затрачивает поток на выполнение той или иной операции. Многие в таких случаях пишут что-то вроде этого:
C++
1
2
3
4
5
6
7
8
// получаем стартовое время
 
DWORD dwStartTime = GetTickCount();
 
// здесь выполняем какой-нибудь сложный алгоритм 
// вычитаем стартовое время из текущего
 
DWORD dwElapsedTime = GetTickCount() - dwStartTime;
Этот код основан на простом допущении, что он не будет прерван. Но в операционной системе с вытесняющей многозадачностью никто не знает, когда поток получит процессорное время, и результат будет сильно искажен.
2
1 / 1 / 1
Регистрация: 02.11.2009
Сообщений: 8
04.11.2009, 13:01  [ТС]
CyBOSSeR,
Спасибо за ответ!
Пока писал прошлое сообщение меня вдруг осенило и переписал вроде как с виду адекватно работающее измерение + достаточно простое. Не могли бы Вы сказать, можно ли так считать, как в отредактированном выше моем посте.
0
Эксперт С++
 Аватар для CyBOSSeR
2348 / 1721 / 149
Регистрация: 06.03.2009
Сообщений: 3,675
04.11.2009, 14:53
Цитата Сообщение от Логос Посмотреть сообщение
Не могли бы Вы сказать, можно ли так считать, как в отредактированном выше моем посте.
Ты имеешь ввиду этот:
C++
1
2
3
4
5
6
int c = -GetTickCount();
 
for (i=0; i<1999;i++) 
  Counting(1, n, xx, s, x, F, h, h1);
 
c+=GetTickCount();
?
Если уж все таки решил использовать GetTickCount(), то нужно немного переписать этот фрагмент. А то вот такая конструкции:
C++
1
2
3
int c = -GetTickCount();
//...
c = +GetTickCount();
лично у меня вызывает недоумение.
Я бы написал так:
C++
1
2
3
4
5
6
DWORD start_time = GetTickCount();
 
for (i=0; i<1999;i++) 
  Counting(1, n, xx, s, x, F, h, h1);
 
DWORD execution_time = GetTickCount() - start_time;
Результат будет одним и тем же, но просто это выглядит более логично.
0
 Аватар для serrg
70 / 70 / 4
Регистрация: 02.07.2010
Сообщений: 228
21.07.2010, 21:51
Может тема и устарела, но кому-нибудь может понадобиться. Надо брать не 2500 а значение из QueryPerformanceFrequency(*LARGE_INTEGER ) работает аналогично QueryPerformanceCounter().
а GetTickCount() это системный тик и срабатывает один раз в 15 с хвостиком милисекунд, поэтому он не точен.
Попутный вопрос, может кто из экспертов знает как получает этот счетчик производительности?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.07.2010, 21:51
Помогаю со студенческими работами здесь

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

Через сколько времени после начала движения ускорение тела будет равно a=2m/c^2
Движение тела дается уравнением : S=0.1+0.1t+0.14t^2+0.01t^3 Через сколько времени после начала движения ускорение тела будет равно...

Определить в какой единице измерения времени считает clock()?
Добрый день, очень прошу помощи :wall: Есть код, вот часть, работающая со временем измерения... Подскажите пожалуйста в какой единице...

Автоматически сбрасываются частоты Core clock Шейдеров и Memory clock, AMD M2N-MX se plus
Добрый Вечер! У меня такая проблема: Во время игры падает фпс(Кол-во Кадров в секунду),нажимаю alt+tab и по мониторингу вижу что...

Укажите значение переменной k после исполнения алгоритма
Укажите значение переменной k после исполнения алгоритма VAR I,K: INTEGER; A: ARRAY OF INTEGER; BEGIN K:=1; FOR I:=1 TO 5 DO ...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru