В этом посте будет обсуждаться, как найти время выполнения программы C в средах Windows и Linux.
Существует четыре широко используемых метода определения времени выполнения программы на C:
1. Использование clock() функция
Мы можем использовать clock() функция, предоставляемая <time.h> заголовочный файл для расчета времени ЦП, потребляемого задачей в приложении C. Он возвращает clock_t type, в котором хранится общее количество тактов часов.
Чтобы вычислить общее количество прошедших секунд, нам нужно разделить общее количество прошедших тактов часов на CLOCKS_PER_SEC макрос (также присутствует в <time.h>) как показано ниже:
| 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 | #include <stdio.h> #include <time.h> // for clock_t, clock(), CLOCKS_PER_SEC #include <unistd.h> // for sleep() // основная функция для определения времени выполнения программы на C int main() { // для хранения времени выполнения кода double time_spent = 0.0; clock_t begin = clock(); // делаем здесь что-нибудь sleep(3); clock_t end = clock(); // рассчитать прошедшее время, найдя разницу (end — begin) и // деление разницы на CLOCKS_PER_SEC для перевода в секунды time_spent += (double)(end — begin) / CLOCKS_PER_SEC; printf(«The elapsed time is %f seconds», time_spent); return 0; } |
Скачать Выполнить код
Выход (может варьироваться):
The elapsed time is 0.000014 seconds
Обратите внимание, что clock() Функция не возвращает фактическое количество прошедшего времени, а возвращает количество времени, которое потребовалось базовой операционной системе для запуска процесса. Другими словами, фактическое время настенных часов может быть намного больше.
2. Использование time() функция
The <time.h> заголовок также предоставляет time() функция, которая возвращает общее количество секунд, прошедших с начала Эпохи (00:00:00 UTC, 1 января 1970 г.). Он принимает указатель на time_t в качестве аргумента, который обычно передается как NULL и возвращает time_t тип. Если аргумент не NULL, то возвращаемое значение также сохраняется в памяти, на которую указывает аргумент.
Его использование аналогично clock() функцию, как показано ниже:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | #include <stdio.h> #include <time.h> // for time() #include <unistd.h> // for sleep() // основная функция для определения времени выполнения программы на C int main() { time_t begin = time(NULL); // делаем здесь что-нибудь sleep(3); time_t end = time(NULL); // вычислить прошедшее время, найдя разницу (end — begin) printf(«The elapsed time is %d seconds», (end — begin)); return 0; } |
Скачать Выполнить код
результат:
The elapsed time is 3 seconds
3. Использование gettimeofday() функция
The gettimeofday() Функция возвращает время настенных часов, прошедшее с начала эпохи, и сохраняет его в timeval структура, выраженная в секундах и микросекундах.
Он определен в <sys/time.h> заголовочный файл и принимает два аргумента — первый аргумент является ссылкой на timeval структура, а второй аргумент — нулевой указатель. timeval структура объявляется следующим образом: <time.h> заголовок:
struct timeval {
long tv_sec; /* seconds */
long tv_usec; /* microseconds */
};
Следующий код демонстрирует использование gettimeofday() путем измерения времени настенных часов:
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | #include <stdio.h> #include <sys/time.h> // for gettimeofday() #include <unistd.h> // for sleep() // основная функция для определения времени выполнения программы на C int main() { struct timeval start, end; gettimeofday(&start, NULL); // делаем здесь что-нибудь sleep(5); gettimeofday(&end, NULL); long seconds = (end.tv_sec — start.tv_sec); long micros = ((seconds * 1000000) + end.tv_usec) — (start.tv_usec); printf(«The elapsed time is %d seconds and %d microsn», seconds, micros); return 0; } |
Скачать Выполнить код
Выход (может варьироваться):
The elapsed time is 5 seconds and 5000147 micros
Эта функция поддерживается компиляторами GCC и может не работать в Windows.
4. Использование clock_gettime() функция
Мы также можем использовать clock_gettime() функция, определенная в <time.h> заголовочный файл, который поддерживает точность до наносекунд. Он принимает два аргумента: первый аргумент — это тип часов, а второй аргумент — указатель на timespec структура. timespec структура обеспечивается <time.h> заголовок и объявляется как:
struct timespec {
time_t tv_sec; /* seconds */
long tv_nsec; /* nanoseconds */
};
Следующий код вычисляет прошедшее время, используя общесистемные часы реального времени, обозначенные как CLOCK_REALTIME, время которого представляет секунды и наносекунды с начала Эпохи.
| 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 | #include <stdio.h> #include <time.h> // for clock_t, clock() #include <unistd.h> // for sleep() #define BILLION 1000000000.0 // основная функция для определения времени выполнения программы на C int main() { struct timespec start, end; clock_gettime(CLOCK_REALTIME, &start); // делаем здесь что-нибудь sleep(3); clock_gettime(CLOCK_REALTIME, &end); // time_spent = конец — начало double time_spent = (end.tv_sec — start.tv_sec) + (end.tv_nsec — start.tv_nsec) / BILLION; printf(«The elapsed time is %f seconds», time_spent); return 0; } |
Скачать код
Обратите внимание, что clock_gettime() будет работать только на очень немногих машинах UNIX.
Вот и все, что касается нахождения времени выполнения программы на C.
Связанный пост:
Измерьте прошедшее время программы C++ с помощью библиотеки Chrono
Спасибо за чтение.
Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.
Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂
Содержание
- System.Diagnostics
- Простой пример использования Stopwatch
- Stopwatch
- Свойства Stopwatch
- Elapsed
- ElapsedMilliseconds
- ElapsedTicks
- IsRunning
- Поля Stopwatch
- Frequency
- IsHighResolution
- Методы Stopwatch
- Start и Stop
- StartNew
- Reset
- Restart
- Итого
- Свойства Stopwatch
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
При разработке различных программ иногда бывает необходимо измерить точное время какой-либо операции, например, узнать сколько времени требуется на загрузку данных из файла, запись в базу данных и так далее. Сегодня мы рассмотрим то, как измерить время выполнения операции в C#, используя стандартные средства и возможности языка.
System.Diagnostics
Пространство имен System.Diagnostics содержит классы, позволяющие нашим приложениям взаимодействовать с журналами событий, системными процессами и счётчиками производительности. В числе прочего, это пространство имен содержит класс под названием Stopwatch, который можно в своих приложениях C# использовать для точного измерения затраченного времени. Именно об этом классе мы сегодня и поговорим.
Простой пример использования Stopwatch
Для начала, рассмотрим простой пример использования класса Stopwatch для измерения затраченного времени на выполнение операции.
namespace StopwatchExample
{
class Program
{
static void Main(string[] args)
{
//создаем объект
Stopwatch stopwatch = new Stopwatch();
//засекаем время начала операции
stopwatch.Start();
//выполняем какую-либо операцию
for (int i = 0; i < 10001; i++)
{
Console.WriteLine(i);
}
//останавливаем счётчик
stopwatch.Stop();
//смотрим сколько миллисекунд было затрачено на выполнение
Console.WriteLine(stopwatch.ElapsedMilliseconds);
}
}
} Чтобы измерить время выполнения операции в C# нам необходимо выполнить несколько простых шагов:
- Создать объект класса
Stopwatch; - Выполнить метод
Start()для того, чтобы засечь время начала операции; - Выполнить метод
Stop()для того, чтобы засечь время окончания операции; - Воспользоваться одним из свойств объекта для получения данных о затраченном на выполнение операции времени.
В примере использовано свойство ElapsedMilliseconds, которое позволяет получить количество миллисекунд, затраченных на выполнение операции. Рассмотрим какие ещё есть свойства и методы у класса Stopwatch.
Stopwatch
Свойства Stopwatch
Elapsed
Свойство Elapsed позволяет получить общее затраченное время, измеренное текущим экземпляром класса Stopwatch. Описание свойства выглядит следующим образом:
public TimeSpan Elapsed { get; } Свойство возвращает объект типа TimeSpan — интервал времени, используя который, можно получить время выполнения операции в удобном для вас виде. Например,
//получаем объект TimeSpan
TimeSpan ts = stopwatch.Elapsed;
// Создаем строку, содержащую время выполнения операции.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine(elapsedTime); ElapsedMilliseconds
Свойство ElapsedMilliseconds позволяет получить общее затраченное время, измеренное текущим экземпляром класса Stopwatchв миллисекундах. В примере использования класса Stopwatch выше продемонстрировано использование этого свойства.
ElapsedTicks
Свойство ElapsedTicks позволяет получить общее время выполнение операции в тактах таймера, измеренное текущим экземпляром Stopwatch. Такт — это наименьшая единица времени, которую Stopwatch может измерять таймер. В следующем примере показано использование свойства ElapsedTicks для измерения времени, затраченного на преобразование строки в целое число типа int.
int num;
//создаем объект
Stopwatch stopwatch = new Stopwatch();
//засекаем время начала операции
stopwatch.Start();
num = int.Parse("135");
//останавливаем счётчик
stopwatch.Stop();
Console.WriteLine($"num = {num}");
//смотрим сколько тактов было затрачено на выполнение
Console.WriteLine(stopwatch.ElapsedTicks); Результатом выполнения этого кода может быть вот такой вывод консоли:
IsRunning
Свойство IsRunning позволяет получить значение типа bool, указывающее на то запущен ли в данный момент таймер Stopwatch.
Поля Stopwatch
Класс Stopwatch содержит два статических поля, позволяющих получить сведения о настройках таймера.
Frequency
Поле Frequency содержит частоту таймера в виде количества тактов в секунду.
public static readonly long Frequency;
Это поле удобно использовать вместе со свойством ElapsedTicks для преобразования количества тактов в секунды. Например,
int num;
long freq = Stopwatch.Frequency; //частота таймера
Stopwatch stopwatch = new Stopwatch();
stopwatch.Start();
num = int.Parse("135");
//останавливаем счётчик
stopwatch.Stop();
double sec = (double)stopwatch.ElapsedTicks / freq; //переводим такты в секунды
Console.WriteLine($"num = {num} rn Частота таймера {freq} такт/с rn Время в тактах {stopwatch.ElapsedTicks} rn Время в секундах {sec}");
Обращу внимание только на то, как происходит перевод тактов в секунды. Учитывая особенности деления целых чисел в C#, для того, чтобы получить конкретное значение секунд нам потребовалось привести одно из значений (в данном случае значение свойства ElapsedTicks) к типу double.
IsHighResolution
Свойство IsHighResolution указывает, зависит ли таймер Stopwatch от счетчика производительности высокого разрешения (true) или же использует класс DateTime (false).
public static readonly bool IsHighResolution;
Пример использования поля
class Program
{
static void Main(string[] args)
{
DisplayTimerProperties();
}
public static void DisplayTimerProperties()
{
if (Stopwatch.IsHighResolution)
{
Console.WriteLine("Операции рассчитываются с использованием системного счетчика производительности с высоким разрешением.");
}
else
{
Console.WriteLine("Операции рассчитываются с использованием класса DateTime.");
}
long frequency = Stopwatch.Frequency;
Console.WriteLine($" Частота таймера = {frequency}");
long nanosecPerTick = (1000L * 1000L * 1000L) / frequency;
Console.WriteLine($" Таймер работает с точностью до {nanosecPerTick} наносекунд");
}
} Вывод консоли будет иметь следующий вид:
Операции рассчитываются с использованием системного счетчика производительности с высоким разрешением.
Частота таймера = 10000000
Таймер работает с точностью до 100 наносекунд
Методы Stopwatch
Рассмотрим основные методы класса Stopwatch, которые мы можем использовать для измерения точного времени выполнения операции в C#.
Start и Stop
Метод Start() запускает или возобновляет работу таймера Stopwatch. В свою очередь, Stop() выполняет противоположную операцию — останавливает работу таймера. Использование этих методов продемонстрировано в самом первом примере из этой статьи.
StartNew
Метод StartNew() выполняет сразу несколько операций — он инициализирует новый экземпляр класса Stopwatch, обнуляет счётчик затраченного времени и запускает таймер. То есть, этот метод позволяет немного сократить исходный код программы. Например, код из первого примера можно было бы записать вот так:
Stopwatch stopwatch = Stopwatch.StartNew();//создаем и запускаем таймер
for (int i = 0; i < 10001; i++)
{
Console.WriteLine(i);
}
//останавливаем счётчик
stopwatch.Stop(); //смотрим сколько миллисекунд было затрачено на выполнение
Console.WriteLine(stopwatch.ElapsedMilliseconds); Reset
Метод Reset() останавливает измерение интервала времени и обнуляет счётчик затраченного времени. Использование Reset() позволяет избежать создания новых экземпляров Stopwatch для измерения времени, затраченного на выполнение нескольких операций в C#.
Stopwatch stopwatch = Stopwatch.StartNew();//создаем и запускаем таймер
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i);
}
//останавливаем счётчик
stopwatch.Stop(); //смотрим сколько миллисекунд было затрачено на выполнение
Console.WriteLine($"Первая операция {stopwatch.ElapsedMilliseconds}");
stopwatch.Reset(); //сбросили счётчик
stopwatch.Start(); //запустили счётчик
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i*i);
}
stopwatch.Stop(); //смотрим сколько миллисекунд было затрачено на выполнение
Console.WriteLine($"Вторая операция {stopwatch.ElapsedMilliseconds}"); Restart
Метод Restart() останавливает измерение интервала времени, обнуляет затраченное время и повторно запускает таймер. Таким образом, предыдущий пример можно переписать следующим образом:
Stopwatch stopwatch = Stopwatch.StartNew();//создаем и запускаем таймер
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i);
}
//останавливаем счётчик
stopwatch.Stop(); //смотрим сколько миллисекунд было затрачено на выполнение
Console.WriteLine($"Первая операция {stopwatch.ElapsedMilliseconds}");
stopwatch.Restart(); //перезапускаем счётчик
for (int i = 0; i < 100; i++)
{
Console.WriteLine(i*i);
}
stopwatch.Stop(); //смотрим сколько миллисекунд было затрачено на выполнение
Console.WriteLine($"Вторая операция {stopwatch.ElapsedMilliseconds}"); Итого
Класс Stopwatch из пространства имен System.Diagnostics C# позволяет измерить время выполнения операции с точностью до 100 наносекунд в зависимости от того, что используется для работы с интервалами времени — таймер высокого разрешения или же класс DateTime.
уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.
I want to measure the execution of a piece of code and I’m wondering what the best method to do this is?
Option 1:
DateTime StartTime = DateTime.Now;
//Code
TimeSpan ts = DateTime.Now.Subtract(StartTime);
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine(elapsedTime, "RunTime");
Option 2:
using System.Diagnostics;
Stopwatch stopWatch = new Stopwatch();
stopWatch.Start();
//Code
stopWatch.Stop();
// Get the elapsed time as a TimeSpan value.
TimeSpan ts = stopWatch.Elapsed;
// Format and display the TimeSpan value.
string elapsedTime = String.Format("{0:00}:{1:00}:{2:00}.{3:00}",
ts.Hours, ts.Minutes, ts.Seconds,
ts.Milliseconds / 10);
Console.WriteLine(elapsedTime, "RunTime");
This isn’t simply for benchmarking, its actually part of the application. The time the function takes to execute is relevant data. It doesn’t however need to be atomic or hyper-accurate.
Which option is better for production code, or does anybody else use something different and perhaps better?
The execution time of a task is defined as the time taken by the system to execute that task. The execution time of a program is equal to the sum of the execution time of its statements. There are numerous ways to calculate the execution time of a program in C#. In this article, we will see three ways to measure execution time in C#.
Method 1: Using StartNew() and Stop() method
We can calculate the execution time of the code using StartNew() and Stop() methods. StartNew() method comes under the Stopwatch class and it basically used to initialize a new Stopwatch instance. Internally it marks the elapsed time property equal to zero and then it starts measuring the elapsed time. This method is almost the same as calling the Stopwatch constructor first and then calling class on the new instance.
Syntax:
public static StartNew ();
Stop() method also comes under the Stopwatch class and it is used to stop the current measuring time for an interval. Firstly we can call StartNew() method in Stopwatch to start the elapsed time and at the end, we can call this method to end the current measuring time interval. Eventually, the total execution time is calculated with the help of elapsed property. Whenever a Stopwatch instance measures more than one interval, this method is similar to pausing the elapsed time measurement. Like StartNew() method, this method is also defined under System.Diagnostics namespace.
Syntax:
public void Stop ();
Example:
C#
using System;
using System.Diagnostics;
class GFG{
static public void Main()
{
var watch = Stopwatch.StartNew();
for(int i = 0; i < 5; i++)
{
Console.WriteLine("GeeksforGeeks");
}
watch.Stop();
Console.WriteLine(
$"The Execution time of the program is {watch.ElapsedMilliseconds}ms");
}
}
Output
GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks The Execution time of the program is 37ms
Method 2: Using the GetTimestamp() method
We can also find the execution time of the code using the GetTimestamp() method. This method is quite helpful for finding the number of ticks for a duration in the timer mechanism. We can use the high-resolution performance counter of the Stopwatch class to get the current value of that counter. We can use the system timer also to get the current DateTime.Ticks property of the DateTime.UtcNow instance. Its return type is a long integer that represents the tick counter value of the timer mechanism.
Syntax:
public static long GetTimestamp ();
Example:
C#
using System;
using System.Diagnostics;
class GFG{
static public void Main()
{
var start = Stopwatch.GetTimestamp();
for(int i = 0; i < 5; i++)
{
Console.WriteLine("GeeksforGeeks");
}
var end = Stopwatch.GetTimestamp();
Console.WriteLine("Elapsed Time is {0} ticks", (end - start));
}
}
Output
GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks Elapsed Time is 343095 ticks
Method 3: Using DateTime.Now property
We can calculate the execution time of the code using the DateTime.Now property. This property is quite helpful to get a DateTime object that is initially marked with the current date and time on the device (as the local time). The property value of this method is DateTime which is an object whose value is current local data and time. The Now property returns a DateTime value which depicts the current date and time on the device or computer. This is defined under the System namespace.
Syntax:
public static DateTime Now { get; } Example:
C#
using System;
class GFG{
static public void Main()
{
DateTime start = DateTime.Now;
for(int i = 0 ; i < 5 ; i++)
{
Console.WriteLine("GeeksforGeeks");
}
DateTime end = DateTime.Now;
TimeSpan ts = (end - start);
Console.WriteLine("The execution time of the program is {0} ms",
ts.TotalMilliseconds);
}
}
Output:
GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks The execution time of the program is 176.095 ms
The execution time of a task is defined as the time taken by the system to execute that task. The execution time of a program is equal to the sum of the execution time of its statements. There are numerous ways to calculate the execution time of a program in C#. In this article, we will see three ways to measure execution time in C#.
Method 1: Using StartNew() and Stop() method
We can calculate the execution time of the code using StartNew() and Stop() methods. StartNew() method comes under the Stopwatch class and it basically used to initialize a new Stopwatch instance. Internally it marks the elapsed time property equal to zero and then it starts measuring the elapsed time. This method is almost the same as calling the Stopwatch constructor first and then calling class on the new instance.
Syntax:
public static StartNew ();
Stop() method also comes under the Stopwatch class and it is used to stop the current measuring time for an interval. Firstly we can call StartNew() method in Stopwatch to start the elapsed time and at the end, we can call this method to end the current measuring time interval. Eventually, the total execution time is calculated with the help of elapsed property. Whenever a Stopwatch instance measures more than one interval, this method is similar to pausing the elapsed time measurement. Like StartNew() method, this method is also defined under System.Diagnostics namespace.
Syntax:
public void Stop ();
Example:
C#
using System;
using System.Diagnostics;
class GFG{
static public void Main()
{
var watch = Stopwatch.StartNew();
for(int i = 0; i < 5; i++)
{
Console.WriteLine("GeeksforGeeks");
}
watch.Stop();
Console.WriteLine(
$"The Execution time of the program is {watch.ElapsedMilliseconds}ms");
}
}
Output
GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks The Execution time of the program is 37ms
Method 2: Using the GetTimestamp() method
We can also find the execution time of the code using the GetTimestamp() method. This method is quite helpful for finding the number of ticks for a duration in the timer mechanism. We can use the high-resolution performance counter of the Stopwatch class to get the current value of that counter. We can use the system timer also to get the current DateTime.Ticks property of the DateTime.UtcNow instance. Its return type is a long integer that represents the tick counter value of the timer mechanism.
Syntax:
public static long GetTimestamp ();
Example:
C#
using System;
using System.Diagnostics;
class GFG{
static public void Main()
{
var start = Stopwatch.GetTimestamp();
for(int i = 0; i < 5; i++)
{
Console.WriteLine("GeeksforGeeks");
}
var end = Stopwatch.GetTimestamp();
Console.WriteLine("Elapsed Time is {0} ticks", (end - start));
}
}
Output
GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks Elapsed Time is 343095 ticks
Method 3: Using DateTime.Now property
We can calculate the execution time of the code using the DateTime.Now property. This property is quite helpful to get a DateTime object that is initially marked with the current date and time on the device (as the local time). The property value of this method is DateTime which is an object whose value is current local data and time. The Now property returns a DateTime value which depicts the current date and time on the device or computer. This is defined under the System namespace.
Syntax:
public static DateTime Now { get; } Example:
C#
using System;
class GFG{
static public void Main()
{
DateTime start = DateTime.Now;
for(int i = 0 ; i < 5 ; i++)
{
Console.WriteLine("GeeksforGeeks");
}
DateTime end = DateTime.Now;
TimeSpan ts = (end - start);
Console.WriteLine("The execution time of the program is {0} ms",
ts.TotalMilliseconds);
}
}
Output:
GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks GeeksforGeeks The execution time of the program is 176.095 ms
Замерить время работы функции на С++
- В этой теме 2 ответа, 2 участника, последнее обновление 6 лет, 7 месяцев назад сделано .
-
Сообщения
-
-
Мне нужно замерить время выполнения фрагмента кода (можно функции) на С++.
Я прочитал, что для этого используется
clock()из модуляtime.h (ctime)— она возвращает число таков, измеряемое процессором от начала выполнения программы.
Глобальная константаCLOCKS_PER_SECхранит число тактов, выполняемое процессором в секунду. Соответственно, чтобы получить время работы программы в секундах достаточно результат работы функции разделить на эту константу:
clock() / CLOCKS_PER_SEC;Для определения времени работы фрагмента программы нужно определить моменты времени до фрагмента и после него, а затем — посчитать разницу. Однако следующий фрагмент кода работает не так, как мне хотелось бы:
#include <stdio .h> #include <time .h> int main() { clock_t start = clock(); getchar(); clock_t end = clock(); double seconds = (double)(end - start) / CLOCKS_PER_SEC; printf("The time: %f secondsn", seconds); }В данном случае я надеюсь получить время, которое пользователь тратит на нажатие клавиши, однако вне зависимости от того, как долго я жду — результат получается примерно одинаковый, а время очень маленьким (см. скриншот). Хотя, если вместо
getcharя ставлю фрагмент кода, выполняющий какие-либо вычисления — выводится правдоподобный результат.Подскажите в чем проблема и как ее решить.

-
Функция
clock()возвращает количество тиков процессора, которое сделала именно ваша программа, т.е. если программа ожидает ввод данных пользователем, то она не работает (операционная система вытесняет процесс из очереди задач). Следовательно нельзя замерить время ожидания ввода при помощи функцииclock()— хотя подход, который вы привели, идеально подходит если вы хотите сравнить два алгоритма, т.к. в этом случае меньшее влияние оказывает загруженность системы.Определить количество секунд, которое выполняется программа можно с помощью функции
time():#include <stdio .h> #include <time .h> int main() { time_t start, end; time(&start); getchar(); time(&end); double seconds = difftime(end, start); printf("The time: %f secondsn", seconds); }Время при этом сохраняет с типом данных
time_t— это целое число секунд, прошедшее с 1 января 1970 года. Функцияdifftimeвычисляет разницу двух моментов времени. С помощью такого подхода вы сможете замерить время работы части программы, однако результат будет в секундах. -
При помощи средств, появившихся в стандартной библиотеке С++11 можно получить более высокую точность измерения и замерить время независимо от системных часов (с помощью так называемых стабильных часов). Обзор библиотеки chrono.
Следующий фрагмент кода выполняет замер времени с использованием стабильных часов:
#include <iostream> #include <chrono> int main() { auto begin = std::chrono::steady_clock::now(); getchar(); auto end = std::chrono::steady_clock::now(); auto elapsed_ms = std::chrono::duration_cast<std::chrono::milliseconds>(end - begin); std::cout << "The time: " << elapsed_ms.count() << " msn"; }Функция
std::chrono::duration_cast преобразует объект типа <code>time_pointво временной интервал (duration), при этом в качестве параметра шаблона передается промежуток времени в виде долей секунды (в данном случае миллисекунды).Использование библиотеки chrono — лучший способ если нужно фактическое замерить время выполнения программы (в отличии функции
time(), модуляtime.hона позволяет получить время в миллисекундах и даже наносекундах). Однако если программа работает на многопроцессорной системе и часто ожидает какие-либо данные (не только пользовательский ввод, но и данных от других потоков/процессов) — то больший интерес может представлять реальное время выполнения, возвращаемое функциейclock()модуляtime.h. Реальное время лучше отражает потребляемый ресурс процессора, т.к. если текущий процесс простаивает на кластере (где выполняются сотни других приложений), то он вытесняется операционной системой и практически не загружает процессор.
-
-
Автор
Сообщения
- Вы должны войти в систему, чтобы ответить на эту тему.
| -1 / 2 / 0 Регистрация: 27.02.2013 Сообщений: 95 | |
| 1 | |
Посчитать время выполнения программы10.10.2013, 21:17. Показов 12008. Ответов 10
в visual 2012 можно как? или в коде прописать что? __________________
0 |
| yariktst 27 / 27 / 1 Регистрация: 06.10.2012 Сообщений: 58 | ||||
| 10.10.2013, 21:19 | 2 | |||
0 |
| Diman777 368 / 340 / 108 Регистрация: 12.02.2013 Сообщений: 653 | ||||
| 10.10.2013, 21:43 | 3 | |||
|
1
KostyaMoscow,
0 |
| 184 / 184 / 29 Регистрация: 14.04.2013 Сообщений: 499 | |
| 10.10.2013, 21:55 | 4 |
|
Environment.TickCount чисто гипотетически,если запустить систему и не выключать в течении чуть меньше 25 дней,то Environment.TickCount будет равно Int32.MinValue(-2 147 483 648) Не по теме: Таким образом мы получаем,что наша программа перенеслась в прошлое:)
1 |
| 27 / 27 / 1 Регистрация: 06.10.2012 Сообщений: 58 | |
| 10.10.2013, 21:57 | 5 |
|
Сообщение от yariktst упс, это время от загрузки ос, мой косяк
0 |
| Thypson 21 / 21 / 19 Регистрация: 10.09.2013 Сообщений: 285 | ||||
| 11.10.2013, 00:59 | 6 | |||
| Пихаешь таймер на форму и…
0 |
| 968 / 771 / 171 Регистрация: 12.04.2009 Сообщений: 1,700 | |
| 11.10.2013, 09:24 | 7 |
| не выдумывайте со всякими таймерами, Stopwatch как раз для этого и сделан.
1 |
| buntar 543 / 544 / 181 Регистрация: 16.03.2012 Сообщений: 1,160 Записей в блоге: 2 | ||||
| 11.10.2013, 09:59 | 8 | |||
1 |
| -1 / 2 / 0 Регистрация: 27.02.2013 Сообщений: 95 | |
| 13.10.2013, 12:53 [ТС] | 9 |
| подскажите, а почему счет именно до Добавлено через 36 секунд
0 |
| 21 / 21 / 19 Регистрация: 10.09.2013 Сообщений: 285 | |
| 13.10.2013, 13:38 | 10 |
|
подскажите, а почему счет именно до Добавлено через 36 секунд 20000000 приблизительные пределы integer
0 |
| 2 / 2 / 0 Регистрация: 02.11.2013 Сообщений: 27 | |
| 05.05.2019, 22:50 | 11 |
|
не выдумывайте со всякими таймерами, Stopwatch как раз для этого и сделан. Согласен. Самый лучший вариант подсчета времени.
0 |




