Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > Измерение времени выполнения потока


Автор: OffyGhost 13.3.2010, 14:23
Не могу измерить время выполнения, так как он выполняется слишком быстро и в принтф выводит просто 0
хотелось бы, чтобы он выводил хоть какие нибудь наносекунды! Помогите пожалуйста


Код
#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(h2, &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;
}


Автор: borisbn 13.3.2010, 15:22
Наверное GetThreadTimes стоит вызывать после WaitForSingleObject

Автор: OffyGhost 13.3.2010, 15:52
Код

#include <stdio.h>
#include <math.h>
#include <windows.h>
#include <locale.h>
 
int l, m, n, sum;
float geo;
 
_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Произведение последовательности: %f", geo);
  WaitForSingleObject(h2, INFINITE);
  printf(" \nСумма последовательности %i", sum);
  printf("\n\nВремя выполнение первого потока: %lld", qwTotalTimeElapsed);
 
  CloseHandle(h1);
  CloseHandle(h2);
  getchar();
  getchar();
  return 0;
}



Ага, вот рабочий вариант =)

Автор: ller 13.3.2010, 17:53
Если профайлер задействовать?

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)