9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
1

Измерение времени выполнения потока

13.03.2010, 13:08. Показов 10699. Ответов 26
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
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
#include "stdafx.h"
#include <clocale>
#include <math.h>
#include <windows.h>
 
int l, m, n, geo, sum;
 
DWORD WINAPI proizv (PVOID Parametr)
{
    geo=1;
    for (int i=l; i<=m; i++)
    geo*=i;
    return 0;
}
 
DWORD WINAPI summa (PVOID Parametr)
{
    sum = (n+1)*(l+m)/2;
    return 0;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    do {
        printf( "Введите нижнюю границу диапазона(натуральное число): " );
        scanf_s("%d", & l );
        printf( "Введите верхнюю границу диапазона(натуральное число): " );
        scanf_s("%d", & m );
        if (l>m)
        {
            printf( "\nВводите нормальные числа!\n\n" );
        }
    } while (m<l);
 
    n = m-l+1;
    DWORD idThread;
    HANDLE h1, h2;
    h1 = CreateThread (NULL, NULL, proizv, &geo, NULL, &idThread);
    h2 = CreateThread (NULL, NULL, summa, &sum, NULL, &idThread);
    SetThreadPriority(h1, THREAD_PRIORITY_HIGHEST);
    SetThreadPriority(h2, THREAD_PRIORITY_IDLE);
 
    printf("\nЧисло членов: %i", n);
    WaitForSingleObject(h1, INFINITE);
    printf("\n\nПроизведение последовательности: %i", geo);
    WaitForSingleObject(h2, INFINITE);
    printf(" \nСумма последовательности %i", sum);
 
    CloseHandle(h1);
    CloseHandle(h2);
    getchar();
    getchar();
    return 0;
}
1) Правильно ли я изменил приоритет потока?
2) Как теперь измерить время работы обоих потоков?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.03.2010, 13:08
Ответы с готовыми решениями:

Измерение времени выполнения
Подскажите пожалуйста как измерить время выполнения чего-то с наносекундной точностью. ...

Измерение времени выполнения функции
Почему-то в конце постоянно получается elapsed_seconds = 0. #include &quot;stdafx.h&quot; #include...

Измерение времени
DWORD dwStart, dwFinish, dwDif; dwStart=GetTickCount();...

Измерение времени
while (Message.message!=WM_QUIT) { if(PeekMessage(&amp;Message, NULL, 0, 0, PM_REMOVE)) { ...

26
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 13:10 2
1) Смотря что ты подразумеваешь под словом "правильно".
2) GetThreadTimes.
1
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
13.03.2010, 13:15  [ТС] 3
1) чтобы потоки не перекрыли друг друга и один не смог выполниться?
2) спасибо
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 13:26 4
Цитата Сообщение от OffyGhost Посмотреть сообщение
чтобы потоки не перекрыли друг друга и один не смог выполниться?
Не совсем понял, что ты имеешь ввиду. Потоки выполнятся так или иначе без всяких изменений приоритетов, здесь это не к чему.
Обычно изменение приоритета необходимо при создании потока выполняющего некую фоновую работу некритичную по времени работу, например, сборку мусора. В таком случае можно понизить его приоритет по сравнению с основным потоком, чтобы поток, выполняющий фоновую работу, занимался ею когда основному потоку делать нечего.
0
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
13.03.2010, 13:26  [ТС] 5
Как вывести на экран
qwTotalTimeElapsed?
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 13:30 6
Цитата Сообщение от OffyGhost Посмотреть сообщение
Как вывести на экран
qwTotalTimeElapsed?
Если через printf, то так:
C++
1
printf("%lld", qwTotalTimeElapsed);
0
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
13.03.2010, 13:34  [ТС] 7
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
77
78
79
80
81
82
83
84
#include "stdafx.h"
#include <clocale>
#include <math.h>
#include <windows.h>
 
int l, m, n, geo, sum;
 
_int64 FileTimeToQuadWord(PFILETIME pft)
{
    return(Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
 
DWORD WINAPI proizv (PVOID Parametr)
{
    geo=1;
    for (int i=l; i<=m; i++)
    geo*=i;
    return 0;
}
 
DWORD WINAPI summa (PVOID Parametr)
{
    sum = (n+1)*(l+m)/2;
    return 0;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    do {
        printf( "Введите нижнюю границу диапазона(натуральное число): " );
        scanf_s("%d", & l );
        printf( "Введите верхнюю границу диапазона(натуральное число): " );
        scanf_s("%d", & m );
        if (l>m)
        {
            printf( "\nВводите нормальные числа!\n\n" );
        }
    } while (m<l);
 
    n = m-l+1;
 
    FILETIME ftKernelTimeStart, ftKernelTimeEnd; 
    FILETIME ftUserTimeStart, ftUserTimeEnd; 
    FILETIME ftDummy;
 
    _int64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;
 
    GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,
                   &ftKernelTimeStart, &ftUserTimeStart);
 
 
 
    DWORD idThread;
    HANDLE h1, h2;
    h1 = CreateThread (NULL, NULL, proizv, &geo, NULL, &idThread);
    h2 = CreateThread (NULL, NULL, summa, &sum, NULL, &idThread);
    SetThreadPriority(h1, THREAD_PRIORITY_HIGHEST);
    SetThreadPriority(h2, THREAD_PRIORITY_IDLE);
 
    GetThreadTimes(GetCurrentThread(), &ftDummy, &ftDummy,
                   &ftKernelTimeEnd, &ftUserTimeEnd);
 
    qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) -
                          FileTimeToQuadWord(&ftKernelTimeStart);
 
    qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd) -
                        FileTimeToQuadWord(&ftUserTimeStart);
 
    qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
 
    printf("\nЧисло членов: %i", n);
    WaitForSingleObject(h1, INFINITE);
    printf("\n\nПроизведение последовательности: %i", geo);
    WaitForSingleObject(h2, INFINITE);
    printf(" \nСумма последовательности %i", sum);
    printf("%lld", qwTotalTimeElapsed);
 
    CloseHandle(h1);
    CloseHandle(h2);
    getchar();
    getchar();
    return 0;
}
Быдлокодинг такой вот,
что не так? 0 выводит вроде или вообще ничего, вместо printf("%lld", qwTotalTimeElapsed);
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 13:36 8
OffyGhost, нужно в GetThreadTimes первым аргументом передавать описатель потока, для которого нужно получить время выполнения, т.е. h1 и h2.
Ты же передаешь описатель главного потока.
1
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
13.03.2010, 13:57  [ТС] 9
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
OffyGhost, нужно в GetThreadTimes первым аргументом передавать описатель потока, для которого нужно получить время выполнения, т.е. h1 и h2.
Ты же передаешь описатель главного потока.
исправил,
в выводе пишет

-6871947672

Добавлено через 8 минут
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
77
78
79
#include "stdafx.h"
#include <clocale>
#include <math.h>
#include <windows.h>
 
int l, m, n, geo, sum;
 
_int64 FileTimeToQuadWord(PFILETIME pft)
{
    return(Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
 
DWORD WINAPI proizv (PVOID Parametr)
{
    geo=1;
    for (int i=l; i<=m; i++)
    geo*=i;
    return 0;
}
 
DWORD WINAPI summa (PVOID Parametr)
{
    sum = (n+1)*(l+m)/2;
    return 0;
}
 
int main()
{
    setlocale(LC_ALL, "Russian");
    do {
        printf( "Введите нижнюю границу диапазона(натуральное число): " );
        scanf_s("%d", & l );
        printf( "Введите верхнюю границу диапазона(натуральное число): " );
        scanf_s("%d", & m );
        if (l>m)
        {
            printf( "\nВводите нормальные числа!\n\n" );
        }
    } while (m<l);
 
    n = m-l+1;
 
    FILETIME ftKernelTimeStart, ftKernelTimeEnd; 
    FILETIME ftUserTimeStart, ftUserTimeEnd; 
    FILETIME ftDummy;
 
    _int64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;
 
    DWORD idThread;
    HANDLE h1, h2;
    h1 = CreateThread (NULL, NULL, proizv, &geo, NULL, &idThread);
    h2 = CreateThread (NULL, NULL, summa, &sum, NULL, &idThread);
    SetThreadPriority(h1, THREAD_PRIORITY_HIGHEST);
    SetThreadPriority(h2, THREAD_PRIORITY_IDLE);
 
    GetThreadTimes(h1, &ftDummy, &ftDummy,
                   &ftKernelTimeEnd, &ftUserTimeEnd);
 
    qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd) -
                          FileTimeToQuadWord(&ftKernelTimeStart);
 
    qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd) -
                        FileTimeToQuadWord(&ftUserTimeStart);
 
    qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
 
    printf("\nЧисло членов: %i", n);
    WaitForSingleObject(h1, INFINITE);
    printf("\n\nПроизведение последовательности: %i", geo);
    WaitForSingleObject(h2, INFINITE);
    printf(" \nСумма последовательности %i", sum);
    printf("\n\nВремя выполнение первого потока: %lld", qwTotalTimeElapsed);
 
    CloseHandle(h1);
    CloseHandle(h2);
    getchar();
    getchar();
    return 0;
}
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 14:05 10
OffyGhost,
C
1
2
3
4
5
6
7
8
9
10
#include <stdio.h>
 
int main()
{
  _int64 n = 123456789;
 
  printf("%lld", n);
 
  return 0;
}
Выводит 123456789. Проблем не должно быть.
Приведи полностью код.

Добавлено через 5 минут
OffyGhost,
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
77
#include <stdio.h>
#include <math.h>
#include <windows.h>
#include <locale.h>
 
int l, m, n, geo, sum;
 
_int64 FileTimeToQuadWord(PFILETIME pft)
{
  return(Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
 
DWORD WINAPI proizv (PVOID Parametr)
{
  geo=1;
  for (int i=l; i<=m; i++)
    geo*=i;
  return 0;
}
 
DWORD WINAPI summa (PVOID Parametr)
{
  sum = (n+1)*(l+m)/2;
  return 0;
}
 
int main()
{
  setlocale(LC_ALL, "Russian");
  do {
    printf( "Введите нижнюю границу диапазона(натуральное число): " );
    scanf_s("%d", & l );
    printf( "Введите верхнюю границу диапазона(натуральное число): " );
    scanf_s("%d", & m );
    if (l>m)
    {
      printf( "\nВводите нормальные числа!\n\n" );
    }
  } while (m<l);
 
  n = m-l+1;
 
  FILETIME ftKernelTimeEnd; 
  FILETIME ftUserTimeEnd; 
  FILETIME ftDummy;
 
  _int64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;
 
  DWORD idThread;
  HANDLE h1, h2;
  h1 = CreateThread (NULL, NULL, proizv, &geo, NULL, &idThread);
  h2 = CreateThread (NULL, NULL, summa, &sum, NULL, &idThread);
  SetThreadPriority(h1, THREAD_PRIORITY_HIGHEST);
  SetThreadPriority(h2, THREAD_PRIORITY_IDLE);
 
  GetThreadTimes(h1, &ftDummy, &ftDummy,
    &ftKernelTimeEnd, &ftUserTimeEnd);
 
  qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd);
 
  qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd);
 
  qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
 
  printf("\nЧисло членов: %i", n);
  WaitForSingleObject(h1, INFINITE);
  printf("\n\nПроизведение последовательности: %i", geo);
  WaitForSingleObject(h2, INFINITE);
  printf(" \nСумма последовательности %i", sum);
  printf("\n\nВремя выполнение первого потока: %lld", qwTotalTimeElapsed);
 
  CloseHandle(h1);
  CloseHandle(h2);
  getchar();
  getchar();
  return 0;
}
0
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
13.03.2010, 14:06  [ТС] 11
Вот этот код выводит 0

не знаю почему
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 14:07 12
OffyGhost, потому что поток выполняется практически мгновенно.

И еще вместо CreateThread используй _beginthread или _beginthreadex.
A thread in an executable that calls the C run-time library (CRT) should use the _beginthreadex and _endthreadex functions for thread management rather than CreateThread and ExitThread; this requires the use of the multi-threaded version of the CRT. If a thread created using CreateThread calls the CRT, the CRT may terminate the process in low-memory conditions.
1
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
13.03.2010, 14:15  [ТС] 13
Мне обязательно надо получить какие нибудь наносекунды- в этом и задача (
ну да, на 2х ядрах простейший поток решается за пол наносекунды наверное
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 14:20 14
OffyGhost, сразу не заметил, получать время выполнения надо уже после того как он завершит свою работу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  // ...
 
  printf("\nЧисло членов: %i", n);
  WaitForSingleObject(h1, INFINITE);
 
  GetThreadTimes(h1, &ftDummy, &ftDummy,
    &ftKernelTimeEnd, &ftUserTimeEnd);
 
  qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd);
 
  qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd);
 
  qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
  
  // ...
Если диапазон будет большим, то тогда время выполнения будет отлична от нуля. Правда произведение "не влезет" в стандартный int.
0
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
13.03.2010, 14:29  [ТС] 15
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
OffyGhost, сразу не заметил, получать время выполнения надо уже после того как он завершит свою работу:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
  // ...
 
  printf("\nЧисло членов: %i", n);
  WaitForSingleObject(h1, INFINITE);
 
  GetThreadTimes(h1, &ftDummy, &ftDummy,
    &ftKernelTimeEnd, &ftUserTimeEnd);
 
  qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd);
 
  qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd);
 
  qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
  
  // ...
Если диапазон будет большим, то тогда время выполнения будет отлична от нуля. Правда произведение "не влезет" в стандартный int.
все также 0
qwTotalTimeElapsed = (qwKernelTimeElapsed + qwUserTimeElapsed)*100000;

так тоже ниче не выводит
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 15:08 16
OffyGhost, попробуй ввести следующие границы диапазона: 0 и 1000000000.
Посмотри результат.
0
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
13.03.2010, 15:15  [ТС] 17
вводя такие параметры
я получаю кучу баговв формул)
и также 0

Введите нижнюю границу диапазона(натуральное число): 2
Введите верхнюю границу диапазона(натуральное число): 600000000

Число членов: 599999999

Произведение последовательности: 0
Сумма последовательности -11188736

Время выполнение первого потока: 0
Добавлено через 1 минуту
кстате вот кусок кода, выполенный одногруппником

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
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
int _tmain(void)
{
    setlocale(0, "Russian");
    char* enterDate = new char[SIZE_OF_STRING];
    do
    {
        enterDate = EnterDate();//ввод даты пользователем
    }
    while(!CheckEnterString(enterDate));//проверка корректности введённой даты
 
    bool flag = true;
    int counter = 0;
    do
    {
        HANDLE hMyThread;//создание дескриптора потока
        DWORD dwThreadId;//создание идентификатора потока
 
        // Создаётся поток
        hMyThread = CreateThread(NULL  // нет защиты потока
                                , NULL // размер стека
                                , DateToString // это функция потока
                                , enterDate //указатель на параметр функции потока
                                , CREATE_SUSPENDED // поток не запускается
                                , &dwThreadId // идентификатор потока
                                );
 
        bool printVar;
        if(flag && counter == 0)
        {
            // созданному потоку устанавливается приоритет THREAD_PRIORITY_ABOVE_NORMAL
            SetThreadPriority(hMyThread // дескриптор потока
                             , THREAD_PRIORITY_ABOVE_NORMAL // уровень приоритета
                             );
            ++counter;
            printVar = true;
        }
        else if(flag && counter == 1)
        {
            // созданному потоку устанавливается приоритет THREAD_PRIORITY_LOWEST
            SetThreadPriority(hMyThread // дескриптор потока
                             , THREAD_PRIORITY_LOWEST // уровень приоритета
                             );
            flag = false;
            printVar = false;
        }
 
        // выполнение потока в данном случае вызовом функции возобновления
        ResumeThread(hMyThread);
 
       const int NANOSECOND_BLOCKS_IN_MILLISECOND = 10000;
 
        FILETIME threadStart; // начало работы потока
        FILETIME threadEnd; // окончание работы потока
        FILETIME dummy; // неиспользуемое значение
   // Ожидание завершения потока
        WaitForSingleObject(hMyThread, INFINITE);
        GetThreadTimes(hMyThread
                      , &threadStart
                      , &threadEnd
                      , &dummy
                      , &dummy
                      );
 
 
     
 
        // результаты вызова потока
        DWORD rezultString;
        DWORD rezultStringSecond;
 
        // Получение результата работы функции потока
        GetExitCodeThread(hMyThread, &rezultString);
 
        // Запросы на уничтожение объекта-потока
        CloseHandle(hMyThread);
 
 
        __int64 qwStartTime;
        __int64 qwFinishTime;
        __int64 qwTotalTimeElapsed;
        qwStartTime = FileTimeToQuadWord(&threadStart);
        qwFinishTime = FileTimeToQuadWord(&threadEnd);
        qwTotalTimeElapsed = qwFinishTime - qwStartTime;
 
        if(flag && printVar)
        {
            printf("\nqwStartTime %d\n\n"
                  , qwStartTime /10000
                  );
printf("\nqwFinishTime %d \n\n"
                  , qwFinishTime /10000
                  );
            printf("\nВремя работы потока с приорететом 'THREAD_PRIORITY_ABOVE_NORMAL' %d милисекунд.\n\n"
                  , qwTotalTimeElapsed / 10000
                  );
 
            printVar = false;
        }
        else if(!flag && !printVar)
        {
            printf("\nВремя работы потока с приорететом 'THREAD_PRIORITY_LOWEST' %d милисекунд.\n\n"
                  , qwTotalTimeElapsed / 10000
                  );
        }
 
        printf("Дата прописью: %sгода\n\n", rezultString);
    }
    while(flag);
 
    system("pause");
    return NULL;
}
Его не стал брать, так как он какойто непонятный)
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 15:26 18
OffyGhost, как я уже тебе говорил, время которое первый поток тратит на выполнение своей работы стремиться к нулю, особенно на компьютере с высокими характеристиками. Нет смысла замерять время работы такого потока.
На моей конфигурации если задать границы приведенные тобой время выполнения получается порядка 5000 наносекунд.
0
9 / 9 / 7
Регистрация: 04.03.2010
Сообщений: 107
13.03.2010, 15:41  [ТС] 19
Цитата Сообщение от CyBOSSeR Посмотреть сообщение
OffyGhost, как я уже тебе говорил, время которое первый поток тратит на выполнение своей работы стремиться к нулю, особенно на компьютере с высокими характеристиками. Нет смысла замерять время работы такого потока.
На моей конфигурации если задать границы приведенные тобой время выполнения получается порядка 5000 наносекунд.
дело в том
что у меня в секунды три считает ))а впроге - 0
сейчас отправил программу нескльким юзерам с одноядерным целероном)

Добавлено через 1 минуту
Введите нижнюю границу диапазона(натуральное число): 2
Введите верхнюю границу диапазона(натуральное число): 100000000

Число членов: 99999999

Произведение последовательности: 0
Сумма последовательности 1037459712

Время выполнение первого потока: 0










Чтонадо в проге еще изменить, чтобы он произведение считал?
я о том, какой тип поставить? double;float
0
Эксперт С++
2347 / 1720 / 148
Регистрация: 06.03.2009
Сообщений: 3,675
13.03.2010, 15:46 20
Вот код:
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
77
78
#include <stdio.h>
#include <math.h>
#include <windows.h>
#include <locale.h>
 
int l, m, n, geo, sum;
 
_int64 FileTimeToQuadWord(PFILETIME pft)
{
  return(Int64ShllMod32(pft->dwHighDateTime, 32) | pft->dwLowDateTime);
}
 
DWORD WINAPI proizv (PVOID Parametr)
{
  geo=1;
  for (int i=l; i<=m; i++)
    geo*=i;
  return 0;
}
 
DWORD WINAPI summa (PVOID Parametr)
{
  sum = (n+1)*(l+m)/2;
  return 0;
}
 
int main()
{
  setlocale(LC_ALL, "Russian");
  do {
    printf( "Введите нижнюю границу диапазона(натуральное число): " );
    scanf_s("%d", & l );
    printf( "Введите верхнюю границу диапазона(натуральное число): " );
    scanf_s("%d", & m );
    if (l>m)
    {
      printf( "\nВводите нормальные числа!\n\n" );
    }
  } while (m<l);
 
  n = m-l+1;
 
  FILETIME ftKernelTimeEnd; 
  FILETIME ftUserTimeEnd; 
  FILETIME ftDummy;
 
  _int64 qwKernelTimeElapsed, qwUserTimeElapsed, qwTotalTimeElapsed;
 
  DWORD idThread;
  HANDLE h1, h2;
  h1 = CreateThread (NULL, NULL, proizv, &geo, NULL, &idThread);
  h2 = CreateThread (NULL, NULL, summa, &sum, NULL, &idThread);
  SetThreadPriority(h1, THREAD_PRIORITY_HIGHEST);
  SetThreadPriority(h2, THREAD_PRIORITY_IDLE);
 
  printf("\nЧисло членов: %i", n);
  WaitForSingleObject(h1, INFINITE);
 
  GetThreadTimes(h1, &ftDummy, &ftDummy,
    &ftKernelTimeEnd, &ftUserTimeEnd);
 
  qwKernelTimeElapsed = FileTimeToQuadWord(&ftKernelTimeEnd);
 
  qwUserTimeElapsed = FileTimeToQuadWord(&ftUserTimeEnd);
 
  qwTotalTimeElapsed = qwKernelTimeElapsed + qwUserTimeElapsed;
 
  printf("\n\nПроизведение последовательности: %i", geo);
  WaitForSingleObject(h2, INFINITE);
  printf(" \nСумма последовательности %i", sum);
  printf("\n\nВремя выполнение первого потока: %lld", qwTotalTimeElapsed);
 
  CloseHandle(h1);
  CloseHandle(h2);
  getchar();
  getchar();
  return 0;
}
Вот результат:
Измерение времени выполнения потока
1
13.03.2010, 15:46
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
13.03.2010, 15:46
Помогаю со студенческими работами здесь

Измерение времени компиляции
как узнать время компиляции исходного текста и размер памяти, которую програма использует

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

Измерение времени переключения контекста
Кто может подсказать, какими способами это возможно реализовать в Windows? Есть ли способы, не...

Измерение времени исполнения алгоритма через Clock() периодически равно 0
Здравствуйте! Я в отчаянии :( Была программа на C# и появилась необходимость перевести ее на С++....


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru