Как проверить время работы программы в visual studio

Where in the VS2019 can I see the execution time of the code?
Sorry for stupid question

asked Sep 25, 2020 at 16:28

Maria Kamenskyh's user avatar

Maria KamenskyhMaria Kamenskyh

4671 gold badge3 silver badges20 bronze badges

5

That depends on the precision you’re interested in. If milliseconds then in Visual Studio 2019 you can see the time between two breakpoints under Diagnostic Tools -> Events -> Duration (opens automatically in Debug mode, or use Ctrl+Alt+F2).

VS2019 diagnostic tools events

Some notes:

  • Make sure to measure performance of the Release configuration. Debug build performance is meaningless.
  • Make sure the code under test is not optimized away.
  • If the code takes less than ~100ms to run, run it multiple times in a loop so that the measurement is on the order of 100ms or more, for better precision.
  • I don’t know about C#. I assume VS offers similar features for C#.

For a higher precision C++ code performance is measured in code itself using e.g. the <chrono> package.

answered Sep 25, 2020 at 19:11

rustyx's user avatar

rustyxrustyx

78.6k24 gold badges193 silver badges257 bronze badges

0



Я решаю некоторые задачи алгоритма в c# и запускаю их как консольное приложение.

Чтобы проверить эффективность приложений, я хотел бы посмотреть, каково их время выполнения.

В настоящее время я печатаю время в начале программы и в конце и вычисляю разницу во времени ,но есть ли способ уменьшить эффект наблюдателя ?

Какой-то встроенный инструмент/плагин, о котором я не знаю ?


876  


3  

3 ответов:

Вы должны использовать класс Stopwatch, который специально разработан для этого.

Чтобы избежать измерения времени JIT, вы также должны выполнить каждый алгоритм по крайней мере один раз, прежде чем измерять что-либо, чтобы у JIT было время для выполнения.

При измерении алгоритмов вы должны выполнить каждый из них сотни раз и взять среднее время выполнения.

Наиболее важным источником задержки, обусловленной эффектом наблюдателя, является сама печать. Другой потенциальный замедлитель-форматирование текста отладочного сообщения. Поэтому я предлагаю следующее:

  • Если вы можете предвидеть количество циклов и количество этапов в
    цикл, создайте массив для хранения информации о времени. Если не использовать
    динамический список.
  • во время выполнения сохраняйте время и дополнительную информацию в этом массиве
    или список.
  • Если возможно, не храните сообщения вместе со временем, но коды, для
    Пример 1=Стадия 1, 2=стадия 2 и т. д.
  • в конце выполнения сбросьте всю информацию на экран или файл и отформатируйте сообщения по мере необходимости.

Используйтекласс секундомера . Посмотрите на метод ниже для примера.

using System.Diagnostics;

    public void yourAlgorithm()
        {

            Stopwatch timePerParse = Stopwatch.StartNew();
            /** -- TODO --**/

            timePerParse.Stop();
            Console.WriteLine(timePerParse.ElapsedMilliseconds);


        }

I am solving some algorithm problems in c# and running them as a console application.

To check for the efficiency of the applications I would like to see what their run times are.

Currently I am printing the time at the start of a program and at the end and calculating the time difference ,but is there a way to reduce Observer’ effect ?
Some inbuilt tool/plugin that I am not aware of ?

asked Apr 25, 2012 at 15:03

Shashank Shekhar's user avatar

Shashank ShekharShashank Shekhar

3,9222 gold badges43 silver badges50 bronze badges

You should use the Stopwatch class, which is specifically designed to do that.

To avoid measuring the JIT time, you should also run each algorithm at least once before measuring anything so that the JIT has time to run.

When measuring the algorithms, you should run each one hundreds of times and take the average runtime.

answered Apr 25, 2012 at 15:05

SLaks's user avatar

The most important source of delay due to observer’s effect is printing itself. Another potential delayer is debug message text formatting. So I suggest the following:

  • If you can anticipate the number of loops and number of stages per
    loop, create an array to store timing information. If not, use a
    dynamic list.
  • During execution, store time and aditional information in that array
    or list.
  • If possible, don’t store messages along with time but codes, for
    example 1=Stage 1, 2=Stage 2, etc.
  • At the end of the execution, dump all the information to screen or file, and format messages as needed.

answered Apr 25, 2012 at 15:11

Use stopwatch class. Look at at the method below for an example.

using System.Diagnostics;

    public void yourAlgorithm()
        {

            Stopwatch timePerParse = Stopwatch.StartNew();
            /** -- TODO --**/

            timePerParse.Stop();
            Console.WriteLine(timePerParse.ElapsedMilliseconds);


        }

answered Mar 1, 2014 at 20:23

Eduardo Dennis's user avatar

Eduardo DennisEduardo Dennis

13.5k13 gold badges81 silver badges105 bronze badges

4 ответа

Чтобы проверить время выполнения метода, вы можете использовать «Секундомер» .

Также есть встроенный профилировщик VS 2013 в меню ANALYZE = > Profiler. Я не помню, в какой версии VS он был добавлен, но я думаю, что он существует в VS 2012. Таким образом, вы можете начать профилирование, использовать свое приложение на некоторое время, а затем проверить, какие операции потребовалось больше времени для excecute.

UPDATE:
VS 2017 теперь показывает время выполнения в миллисекундах для каждой строки или когда Run To Click используется во время сеанса отладки.

Andrii Litvinov
16 март 2014, в 15:38

Поделиться

В Visual Studio 2013 — Перейти к ANALYZE → Производительность и диагностика. Проверьте мастер производительности, чтобы вычислить требуемое время. Нажмите «Пуск». Теперь выберите — Инструментарий для измерения вызовов функций и подсчета. Нажмите «Далее. Select — Будет показан один или несколько доступных проектов в этом названии вашего проекта. Нажмите» Далее. Снова нажмите «Далее». Проверка. Запустите профилирование после завершения мастера. Теперь нажмите кнопку «Готово».

ShaileshDev
20 май 2015, в 12:22

Поделиться

Visual Studio содержит много хороших встроенных инструментов для профилирования, а многие другие доступны в виде плагинов (также бесплатно).

http://msdn.microsoft.com/en-us/library/ms182372.aspx
Этот ресурс MSDN может быть хорошей отправной точкой.

Saverio Terracciano
16 март 2014, в 15:21

Поделиться

Вы найдете мастер производительности в меню «Анализ», если у вас достаточно хорошая версия Visual Studio (Professional?).

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

JF Meier
16 март 2014, в 14:39

Поделиться

Ещё вопросы

  • 0Доступ к свойству области видимости в контроллере с помощью AngularJS
  • 1Создать новый список с изменениями значения предыдущего списка
  • 0Как непрерывно запускать программы MPI?
  • 0Пользовательский тег Java Jsp — Как установить базу атрибутов при выборе выпадающего списка
  • 0выбранные строки gridview не меняются, вместо этого все строки меняются
  • 0Rails / CSS: как мне сделать галерею изображений разной ширины?
  • 1Как включить HSDPA программно в Android?
  • 1Можно ли настроить приложения Android для подключения к серверам разработчиков?
  • 1Как выровнять тост в Android
  • 0Как определить вектор векторов в C ++? [Дубликат]
  • 1Возможно ли, что Postgresql может выполнять функцию куба для двоичных данных?
  • 1Почему мое приложение продолжает получать «Приложение <ClassName> (<package.ClassName>) неожиданно остановилось. Пожалуйста, попробуйте позже ». Ошибка?
  • 1Сканирование из устройства автоматической подачи документов (АПД) с использованием недавних принтеров
  • 1полный длинный побитовый в приложении C # / SQLServer
  • 1[React.js] Дочерние компоненты не работают
  • 1Невозможно получить разногласия, чтобы показать ошибку в чате
  • 1Ошибка в команде MapReduce с MongoDB Java API
  • 1Как вызвать метод, который принимает входной параметр в качестве другого объекта класса, используя Reflection в C #? (Метод дает исключение аргумента)
  • 1Тестирование производительности приложения Android
  • 0правильно настроить и использовать angular с asp.net-mvc
  • 1Очистка xUnit и Watin
  • 1Сложность в отношении «IOException Unhandled»
  • 1JavaFX ChoiceBox ContextMenu Позиция
  • 0Angular $ q выполняет «then» перед запросом http
  • 0Проверьте, существует ли идентификатор из таблицы в другой таблице, и если да, то сколько раз
  • 0boost :: asio :: deadline_timer вызывает ошибку «вызов функции не может появляться в выражении с константой»
  • 0C std :: lower_bound, использовать перегруженный оператор в качестве двоичного предиката comp?
  • 0angularjs ngRoute не перенаправлять
  • 0Волшебная линия JS / Jquery не работает при обновлении страницы
  • 1Структурирование последовательностей более длинных операций в Javascript
  • 0Компиляция mpeg4ip приводит к разыменованию ошибки указателя типа
  • 0вызов конкатенации в html и jsp скриптлетах со стояками
  • 1Как переключить параметр, возвращаемый ConnectivityManager.getBackgroundDataSetting ()?
  • 1Как я могу отображать прогресс при запуске приложения в Android
  • 0AngularJS Доступ к C # MVC Возвращаемый объект индекса
  • 0Пример HackHands Satellizer — неожиданная проблема с токеном
  • 0ЗАКАЗАТЬ до GROUP BY с РЕШЕНИЕМ
  • 1Метро C # В целевой многобайтовой кодовой странице нет сопоставления для символа Unicode
  • 1Графика DrawString слово перенос
  • 0тип элемента массива не может быть функцией
  • 1Как организовать упакованное приложение vue.js, обслуживаемое бэкэндом express / koa?
  • 1Подсчет количества вхождений слова в java
  • 1сумма столбца данных pyspark, содержащего словари
  • 1пытаясь проверить, является ли arraylist подмножеством другого
  • 1Пробелы между моими переменными не появятся в браузере
  • 0Могу ли я запустить приложение (или хранимую процедуру) и получить результат от триггера
  • 0Цикл Foreach и многомерный массив
  • 0PHP Count генерирует результаты из цикла
  • 1Почему locationManager.getBestProvider () возвращает ноль? (Nexus 5x)
  • 0GeoFire geoQuery возвращает данные

Содержание

  • System.Diagnostics
  • Простой пример использования Stopwatch
  • Stopwatch
    • Свойства Stopwatch
      • Elapsed
      • ElapsedMilliseconds
      • ElapsedTicks
      • IsRunning
    • Поля Stopwatch
      • Frequency
      • IsHighResolution
    • Методы Stopwatch
      • Start и Stop
      • StartNew
      • Reset
      • Restart
    • Итого

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

При разработке различных программ иногда бывает необходимо измерить точное время какой-либо операции, например, узнать сколько времени требуется на загрузку данных из файла, запись в базу данных и так далее. Сегодня мы рассмотрим то, как измерить время выполнения операции в 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# нам необходимо выполнить несколько простых шагов:

  1. Создать объект класса Stopwatch;
  2. Выполнить метод Start() для того, чтобы засечь время начала операции;
  3. Выполнить метод Stop() для того, чтобы засечь время окончания операции;
  4. Воспользоваться одним из свойств объекта для получения данных о затраченном на выполнение операции времени.

В примере использовано свойство 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.

уважаемые посетители блога, если Вам понравилась, то, пожалуйста, помогите автору с лечением. Подробности тут.

В этом посте мы обсудим, как измерить время выполнения фрагмента кода в C#.

1. Использование Stopwatch Class

The Stopwatch класс из System.Diagnostics пространство имен используется для точного измерения прошедшего времени. В следующем примере показано, как измерить время выполнения с помощью Stopwatch учебный класс.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

using System;

using System.Diagnostics;

using System.Threading;

public class Example

{

    public static void Main()

    {

        Stopwatch stopwatch = new Stopwatch();

        stopwatch.Start();

        Thread.Sleep(5000);

        stopwatch.Stop();

        Console.WriteLine(«Elapsed Time is {0} ms», stopwatch.ElapsedMilliseconds);

    }

}

/*

    результат: Elapsed Time is 5000 ms

*/

Скачать  Выполнить код

 
Чтобы получить прошедшее время в виде TimeSpan значение, мы можем сделать так:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

using System;

using System.Diagnostics;

using System.Threading;

public class Example

{

    public static void Main()

    {

        Stopwatch stopwatch = new Stopwatch();

        stopwatch.Start();

        Thread.Sleep(5000);

        stopwatch.Stop();

        TimeSpan ts = stopwatch.Elapsed;

        Console.WriteLine(«Elapsed Time is {0:00}:{1:00}:{2:00}.{3}»,

                        ts.Hours, ts.Minutes, ts.Seconds, ts.Milliseconds);

    }

}

/*

    результат: Elapsed Time is 00:00:05.14

*/

Скачать  Выполнить код

2. Использование DateTime.Now() метод

В качестве альтернативы мы можем получить общее прошедшее время в миллисекундах, используя DateTime.Now. Обратите внимание, что этому решению не хватает высокопроизводительного измерения Stopwatch учебный класс.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

using System;

using System.Threading;

public class Example

{

    public static void Main()

    {

        DateTime start = DateTime.Now;

        Thread.Sleep(5000);

        DateTime end = DateTime.Now;

        TimeSpan ts = (end start);

        Console.WriteLine(«Elapsed Time is {0} ms», ts.TotalMilliseconds);

    }

}

/*

    Прошедшее время 5005,1603 мс

*/

Скачать  Выполнить код

3. Использование секундомера GetTimestamp() метод

Stopwatch GetTimestamp() Метод возвращает текущее количество тиков базового механизма таймера. 10 000 тиков составляют миллисекунду.

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

using System;

using System.Threading;

using System.Diagnostics;

public class Example

{

    public static void Main()

    {

        long start = Stopwatch.GetTimestamp();

        Thread.Sleep(5000);

        long end = Stopwatch.GetTimestamp();

        Console.WriteLine(«Elapsed Time is {0} ticks», (end start));

    }

}

/*

    Прошедшее время 50111533 тиков

*/

Скачать  Выполнить код

Вот и все, что касается измерения времени выполнения в C#.

Спасибо за чтение.

Пожалуйста, используйте наш онлайн-компилятор размещать код в комментариях, используя C, C++, Java, Python, JavaScript, C#, PHP и многие другие популярные языки программирования.

Как мы? Порекомендуйте нас своим друзьям и помогите нам расти. Удачного кодирования 🙂

igorio4eg

4 / 4 / 1

Регистрация: 01.03.2010

Сообщений: 83

1

Как узнать время выполнения алгоритма

04.12.2010, 15:08. Показов 28537. Ответов 17

Метки нет (Все метки)


Мне нужно сравнить несколько алгоритмов сортировки.
Но таким способом как у меня, дает очень маленькие значения ….
дл массива int — ов, размером в [2000] было 0,016 для массива [20000] что то около 0,745 …. это нормально ? есть еще какие то методы ? …..
вот мой вариант

C++
1
2
3
4
5
6
    clock_t time;
    time = clock();
           // КОД
    time = clock() - time;
    cout << "Time: "; 
    printf("%f", (double)time / CLOCKS_PER_SEC);



0



asics

Freelance

Эксперт С++

2888 / 1823 / 356

Регистрация: 09.09.2010

Сообщений: 3,841

04.12.2010, 15:11

2

Так попробуй

C++
1
2
3
4
5
6
#include<windows.h>
 
double start = GetTickCount();
///// сортирока
double finish = GetTickCount();
finish - start; // время сортировки



0



4 / 4 / 1

Регистрация: 01.03.2010

Сообщений: 83

04.12.2010, 15:29

 [ТС]

3

в принципе тоже самое …
и почему то когда запускаю несколько раз, выдает знаеение то ноль, то 15, то 16
а для сортировки вставками, постоянно ноль



0



Vladimir.

377 / 228 / 79

Регистрация: 24.11.2009

Сообщений: 695

04.12.2010, 17:47

4

скажите пожалуйста, каким компилятором вы пользуетесь.

Добавлено через 15 минут
вобщем для g++:

код

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include<iostream>
using namespace std;
static inline unsigned long long int tick() 
{
unsigned long long int d;
__asm__ __volatile__ ("rdtsc" : "=A" (d) );
return d;
}
 
int main()
{
    unsigned long long int a = 0;
    unsigned long long int b = 0;
    a=tick();
   //сортировка
    b=tick();
    cout<<b-a<<endl;
    return 0;
}

(b-a) — количество процессорных тактов.



0



4 / 4 / 1

Регистрация: 01.03.2010

Сообщений: 83

04.12.2010, 19:50

 [ТС]

5

пользуюсь Visual Studio 2008 , для него пойдет ?



1



Vladimir.

377 / 228 / 79

Регистрация: 24.11.2009

Сообщений: 695

04.12.2010, 21:00

6

источник утверждает что пойдет для десятой(и вероятно для восьмой) студии следующее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// rdtsc.cpp
// processor: x86, x64
#include <stdio.h>
#include <intrin.h>
 
#pragma intrinsic(__rdtsc)
 
int main()
{
    unsigned __int64 i;
    i = __rdtsc();
    printf_s("%I64d ticksn", i);
}



0



igorio4eg

4 / 4 / 1

Регистрация: 01.03.2010

Сообщений: 83

04.12.2010, 21:07

 [ТС]

7

Цитата
Сообщение от Vladimir.
Посмотреть сообщение

источник утверждает что пойдет для десятой студии следующее:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
// rdtsc.cpp
// processor: x86, x64
#include <stdio.h>
#include <intrin.h>
 
#pragma intrinsic(__rdtsc)
 
int main()
{
    unsigned __int64 i;
    i = __rdtsc();
    printf_s("%I64d ticksn", i);
}

ясно, а что ставить в начало алоритма, а что в конец ? … не совсем понятно



0



Vladimir.

377 / 228 / 79

Регистрация: 24.11.2009

Сообщений: 695

04.12.2010, 21:13

8

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <intrin.h>
#pragma intrinsic(__rdtsc)
 
unsigned __int64 tick(){
    return (__rdtsc());
 
}
 
 
 
int main()
{
    unsigned __int64 a,b;
    a = tick();
    // проверяемый код
    b = tick();
    
    std::cout<<b-a<<std::endl;
}

в таком виде должно работать.



0



igorio4eg

4 / 4 / 1

Регистрация: 01.03.2010

Сообщений: 83

04.12.2010, 21:18

 [ТС]

9

Цитата
Сообщение от Vladimir.
Посмотреть сообщение

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <intrin.h>
#pragma intrinsic(__rdtsc)
 
unsigned __int64 tick(){
    return (__rdtsc());
 
}
 
 
 
int main()
{
    unsigned __int64 a,b;
    a = tick();
    // проверяемый код
    b = tick();
    
    std::cout<<b-a<<std::endl;
}

в таком виде должно работать.

не, не работает



0



377 / 228 / 79

Регистрация: 24.11.2009

Сообщений: 695

04.12.2010, 21:29

10

а код из шестого сообщения работает? (как Вы поняли у меня VS нет, поэтому проверить я не могу)
и «не работает» или «не компилируется»? если не копилируется — что в сообщении об ошибке?



0



RUSya82

242 / 120 / 14

Регистрация: 15.10.2010

Сообщений: 395

04.12.2010, 21:46

11

Попробуйте структуру SYSTEMTIME.
Сортировки

Цитата
Сообщение от igorio4eg
Посмотреть сообщение

и почему то когда запускаю несколько раз, выдает знаеение то ноль, то 15, то 16

Эта проблема решается запуском функции сортировки много много раз, с определением среднего времени.

C++
1
2
3
4
GetLocalTime(&st1);
for(int i =0;i<5000;i++)
Function();
GetLocalTime(&st2);

просто потом:

C++
1
2
3
4
5
     double T1 = (double)(st1.wMinute*60*1000 + st1.wSecond*1000 + st1.wMilliseconds); //вычисляем время
     double T2 = (double)(st2.wMinute*60*1000 + st2.wSecond*1000 + st2.wMilliseconds);
     cout << endl << RUS("Для size = ") << size2[j] << "   n" ;
     cout << RUS("время выполнения функции: ");
     cout << (T2 - T1)/5000 << RUS("   Миллисекунд") << endl;



0



igorio4eg

4 / 4 / 1

Регистрация: 01.03.2010

Сообщений: 83

04.12.2010, 21:46

 [ТС]

12

код из 6 сообщения работает, я разобрался ,

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#include <stdio.h>
#include <intrin.h>
 
#pragma intrinsic(__rdtsc)
 
int main()
{
    unsigned __int64 i, m, res;
    i = __rdtsc();
    // код
    m = __rdtsc();
    res = m - i;
    printf_s("%I64d ticksn", res);
}



0



377 / 228 / 79

Регистрация: 24.11.2009

Сообщений: 695

04.12.2010, 21:52

13

Хорошо, хотя теперь у меня возникли вопросы. Ладно, доберусь до машины с вс проверю.

Учитывайте, что есть тонкости с dts вроде общей загруженности проца другими программами и верной работы на некоторых многоядерных машинах.

зы: а вобще RUSya82 насчёт многоразового запуска сортировки прав.



0



igorio4eg

4 / 4 / 1

Регистрация: 01.03.2010

Сообщений: 83

04.12.2010, 22:22

 [ТС]

14

Цитата
Сообщение от RUSya82
Посмотреть сообщение

Попробуйте структуру SYSTEMTIME.
Сортировки

Эта проблема решается запуском функции сортировки много много раз, с определением среднего времени.

C++
1
2
3
4
GetLocalTime(&st1);
for(int i =0;i<5000;i++)
Function();
GetLocalTime(&st2);

просто потом:

C++
1
2
3
4
5
     double T1 = (double)(st1.wMinute*60*1000 + st1.wSecond*1000 + st1.wMilliseconds); //вычисляем время
     double T2 = (double)(st2.wMinute*60*1000 + st2.wSecond*1000 + st2.wMilliseconds);
     cout << endl << RUS("Для size = ") << size2[j] << "   n" ;
     cout << RUS("время выполнения функции: ");
     cout << (T2 - T1)/5000 << RUS("   Миллисекунд") << endl;

кажется я не совсем понял этот метод, тут их два, или один, а почему тогда разделили на два кода ?



0



242 / 120 / 14

Регистрация: 15.10.2010

Сообщений: 395

04.12.2010, 22:36

15

Один.
Объявите в начале функции main две переменные типа структуры SYSTEMTIME, в например st1 и st2.
Функция GetLocalTime(&st1) записывает в st1 время на момент вызова.
Далее Вы вызываете требуемую функцию сортировки 5000 раз(это число произвольно).
Далее GetLocalTime(&st2) записывает в st2 время окончания сортировок.

Вторая часть выводит на экран время в миллисекундах. Просто разница во времени делится на 5000, чтобы получить среднее время, на работу одной функции.
З.Ы. подключите windows.h



0



fasked

Эксперт С++

5038 / 2617 / 241

Регистрация: 07.10.2009

Сообщений: 4,310

Записей в блоге: 1

04.12.2010, 22:36

16

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
#include <stdio.h>
#include <time.h>
 
/*
int main()
{
        unsigned int x = 0xFFFFFFFF;
 
        // some code for calculate time
        while(--x != 0);
 
        printf("%gn", (double)clock() / CLOCKS_PER_SEC);
        return 0;
}
*/
 
int main()
{
        unsigned int x = 0xFFFFFFFF;
        time_t beg, end;
 
        time(&beg);
 
        // some code for calculate time
        while(--x != 0);
 
        time(&end);
 
        printf("%gn", difftime(end, beg));
        return 0;
}



0



242 / 120 / 14

Регистрация: 15.10.2010

Сообщений: 395

04.12.2010, 22:37

17

Цитата
Сообщение от igorio4eg
Посмотреть сообщение

а почему тогда разделили на два кода ?

Между первой и второй частью может быть какой то код, как в моей программе, из которой я ето взял.



0



igorio4eg

4 / 4 / 1

Регистрация: 01.03.2010

Сообщений: 83

04.12.2010, 23:15

 [ТС]

18

Разобрался, нормально. в принципе выдает тоже самое что

C++
1
2
3
    double start = GetTickCount();
    double finish = GetTickCount();
    cout << "Время: " << finish - start << endl;



0



Понравилась статья? Поделить с друзьями:
  • Как проехать в коломенское музей заповедник на метро
  • Как сейчас называется страховая компания росгосстрах
  • Как узнать банковские реквизиты по номеру карты рнкб
  • Как через госуслуги изменить реквизиты для соцзащиты
  • Какая помощь государства при открытии своего бизнеса