Настройка проверок во время выполнения машинного кода
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
При компиляции с параметром /RTC (проверки времени выполнения) или использовании прагмы runtime_checks библиотека времени выполнения языка C предоставляет проверки во время выполнения машинного кода. В некоторых случаях необходимо настроить проверки времени выполнения:
- для направления сообщений о проверке, осуществляемой во время выполнения, в файл или в другое место назначения, отличающиеся от используемого по умолчанию;
- чтобы определить место назначения для сообщения о проверке, осуществляемой во время выполнения отладчиком стороннего поставщика;
- для представления сообщений о проверке во время выполнения из программы, скомпилированной с рабочей версией библиотеки времени выполнения языка C. Для представления сообщения об ошибке во время выполнения окончательные версии библиотеки не используют _CrtDbgReportW . Вместо этого они отображают для каждой ошибки времени выполнения диалоговое окно Утверждение. Для настройки процесса проверки ошибок во время выполнения можно:
- написать функцию, сообщающую об ошибке времени выполнения. Дополнительные сведения см. в статье «Практическое руководство. Создание функции отчетов об ошибках во время выполнения».
- настроить место назначения для сообщения об ошибке;
- запросить сведения об ошибках проверок времени выполнения;
Настройка места назначения для сообщения об ошибке
Если для уведомления об ошибках используется функция _CrtDbgReportW , то для определения места назначения сообщений об этих ошибках можно использовать _CrtSetReportMode .
Когда применяется пользовательская функция, сообщающая об ошибках, для связывания ошибки и типа сообщения следует использовать функцию _RTC_SetErrorType .
Запрос сведений о проверках времени выполнения
_RTC_NumErrors возвращает количество типов ошибок, обнаруженных в процессе проверки во время выполнения. Для получения краткого описания каждой ошибки можно использовать цикл от 0 до возвращенного _RTC_NumErrors значения, передавая номер итерации на каждом шаге в функцию _RTC_GetErrDesc . Дополнительные сведения см. в статьях _RTC_NumErrors и _RTC_GetErrDesc.
См. также
- Практическое руководство. Настройка проверок во время выполнения машинного кода
- runtime_checks
- _CrtDbgReport, _CrtDbgReportW
Настройка проверок во время выполнения машинного кода
Область применения:
Visual Studio Visual Studio для Mac
Visual Studio Code ![]()
В проекте Visual Studio C++ можно использовать проверки в машинном коде runtime_checks для обнаружения таких распространенных ошибок, возникающих во время выполнения, как:
- повреждение указателя стека;
- переполнение локальных массивов;
- повреждение стека;
- зависимости от неинициализированных локальных переменных;
- потеря данных при присваивании переменным меньшего размера. Попытка использования опции /RTC с оптимизированным построением (/O) приведет к ошибке компилятора. Директивы runtime_checks при оптимизированном построении игнорируются. Если осуществляется отладка программы с включенным режимом проверки во время выполнения, по умолчанию при возникновении ошибки во время выполнения программа будет прервана и произойдет возврат в отладчик. Это используемое по умолчанию поведение можно изменить для любой проверки во время выполнения. Дополнительные сведения см. в статье Управление исключениями с помощью отладчика. В приведенной ниже процедуре описано, как включить в отладочном построении проверку в машинных кодах во время выполнения, и как изменить поведение проверки в машинных кодах во время выполнения. Другие разделы, представленные здесь, содержат следующие сведения:
- Настройка проверки кода во время выполнения с библиотекой среды выполнения языка C
Включение проверок в машинных кодах во время выполнения в отладочном построении
- Используйте опцию /RTC и компоновку с отладочной версией библиотеки времени выполнения языка С (например, /MDd). Сведения о настройке параметра в Visual Studio см. в разделе «Примечания» справочной статьи /RTC (ошибка времени выполнения проверка). Задайте значение в свойстве Basic Runtime Check , а не свойстве Smaller Type Check . Свойство Smaller Type Check не рекомендуется.
Изменение порядка проверки в машинных кодах во время выполнения
- Используйте директиву runtime_checks .
См. также
- Отладка в Visual Studio
- Первое знакомство с отладчиком
- runtime_checks
- Проверка ошибок во время выполнения
Как определить скорость выполнения кода средствами Visual Studio?

Всё что нашёл, это Debug — Start Diagnostic Tool Есть 2 функции. Их измеряю. Он выдаёт такие результаты. Собственно, суть вопроса, верен ли способ, достаточен ли для обычных, не критичных к точности, проверок. И правильно ли я понимаю что затраченное время это четвёртый столбец (1.52 против 559.31). Ну, и, быть может есть иной способ замерять скорость (без сторонних include’ов и т.д.).
- visual-studio
- visual-studio-2015
- профилирование
Отслеживать
13.7k 12 12 золотых знаков 43 43 серебряных знака 75 75 бронзовых знаков
задан 20 янв 2018 в 12:24
user185136 user185136
1 ответ 1
Сортировка: Сброс на вариант по умолчанию
То, что Вы нашли — это профилирование. И это достаточно хороший способ искать узкие места и тормозящий код. Главное, уметь правильно трактовать и понимать результаты.
Там 4 основных столбца. Два первые показывают результаты текущего запуска в процентах, два последних — усредненное (я так понимаю в секундах, но давно я студии этого не делал).
Также они подписаны словами Inclusive (включительно) и Exclusive (исключая). Первое — это время выполнения кода, если бы замерять секундомером. А второе — это время выполнение функции, исключая вложенные вызовы. То есть, если внутри Вашей функции только вызов одной другой функции, то exclusive может быть почти нулевым.
Теперь к примеру с вопроса. Да, Ваш код в несколько сот раз быстрее (1.52 против 559.31). И это реальное время исполнение кода. Интересно то, что «функция с std» внутри себя вызывает что то очень тяжелое.
Как найти время работы программы на С++
У многих начинающих программистов рано или поздно возникает вопрос: «Как найти время работы программы?». В интернете много ответов на данный вопрос: написать свой мини-дебаггер, посчитать количество тактов и т. д. Самый простой вариант — это посчитать разницу между начальным временем и конечным. То есть, есть начальное значение времени, после которого объявлен фрагмент кода, время выполнения которого необходимо измерить. После фрагмента кода фиксируется ещё одно, конечное, значение времени. После чего, из конечного значения времени вычитаем начальное время и получим время, за которое выполнился измеряемый фрагмент кода или вся программа. Время работы программы необходимо найти для того, чтобы проверить, насколько эффективнее стал работать отдельный алгоритм или программа в целом! Как это сделать,смотрите ниже.
// Как найти время работы фрагмента кода? // заголовочный файл с прототипом функции clock() #include // . unsigned int start_time = clock(); // начальное время // здесь должен быть фрагмент кода, время выполнения которого нужно измерить unsigned int end_time = clock(); // конечное время unsigned int search_time = end_time - start_time; // искомое время
Для того, чтобы найти время работы программы, нужно воспользоваться функцией clock() . Прототип функции clock() находится в заголовочном файле , который нужно подключить, строка 4. Функция clock() возвращает значение времени в миллисекундах (1с = 1000млс). Причём отсчёт времени начинается с момента запуска программы. Если надо измерить работу всей программы, то в конце программы, перед оператором return 0; нужно запустить функцию clock() , которая покажет рабочее время. Для поиска времени работы фрагмента кода нужно найти разницу между конечным и начальным временем, как показано выше.
// Как найти время работы программы? // заголовочный файл с прототипом функции clock() #include // . // здесь должен быть код программы, время выполнения которой нужно измерить unsigned int end_time = clock(); // время работы программы
Разработаем программу, в которой с помощью функции clock() вычислим время работы программы. Программа ищет минимальное значение в массиве размером в 200000 элементов. Размер массива специально выбран большим, для того, чтобы было заметно, как работает программа. Так как числа генерируются случайно, то при каждом запуске получается новый случай, и время может не совпадать. К тому же, время выполнения программы зависит от того, насколько загружен компьютер и от того, какая у компьютера вычислительная мощность. На разных машинах по-разному будет затрачиваться время на выполнение программы, на более мощных компьютерах затрачиваемое время будет меньше и наоборот.
// runtime.cpp: определяет точку входа для консольного приложения. // Как найти время работы программы? #include "stdafx.h" #include #include using namespace std; int main(int argc, char* argv[]) < srand(time(0)); const int array_size = 200000; // размер одномерного массива int array1[array_size]; // объявление одномерного массива for (int counter = 0; counter < array_size; counter++) < array1[counter] = rand() % 50 - rand() % 50; // заполняем массив случайными значениями в диапазоне от -49 до 49 включительно cout int min = array1[0]; // переменная для хранения минимального значения for (int counter = 1; counter < array_size; counter++) < if ( min >array1[counter] ) // поиск минимального значения в одномерном массиве min = array1[counter]; > cout
// runtime.cpp: определяет точку входа для консольного приложения. // Как найти время работы программы? #include #include #include using namespace std; int main(int argc, char* argv[]) < srand(time(0)); const int array_size = 200000; // размер одномерного массива int array1[array_size]; // объявление одномерного массива for (int counter = 0; counter < array_size; counter++) < array1[counter] = rand() % 50 - rand() % 50; // заполняем массив случайными значениями в диапазоне от -49 до 49 включительно cout int min = array1[0]; // переменная для хранения минимального значения for (int counter = 1; counter < array_size; counter++) < if ( min >array1[counter] ) // поиск минимального значения в одномерном массиве min = array1[counter]; > cout
В строке 26 запускается функция clock() , которая скажет сколько потребовалось время программе. Разбирать алгоритм поиска не нужно, так как это совсем другая тема. Главное, нужно понять, как использовать функцию clock() , для поиска времени работы программы или отдельного фрагмента кода. А именно, в строке 26, после основного кода программы, но до оператора return 0; объявлена функция clock() , которая вернёт значение времени. Результат работы программы (см. Рисунок 1).
CppStudio.com
-13 4 -2 30 8 9 27 10 11 -14 -31 1 6 -16 38 31 38 -26 22 21 13 16 42 11 2 11 25 12 0 3 -7 -38 -8 -4 0 42 29 -27 -8 6 -24 12 -12 -5 27 -21 11 5 -28 33 -6 -27 19 8 -24 -4 20 -33 16 13 30 38 -3 25 -8 30 13 -19 -7 -19 12 11 -11 -14 -33 12 -5 -2 7 10 16 -14 -23 10 -10 4 -19 15 27 20 23 -5 34 12 19 -19 -13 30 -11 6 -7 -16 27 -11 -19 -9 26 -3 0 -7 41 -3 -31 10 2 -4 5 15 -37 6 -10 -10 25 -28 7 17 19 -38 15 12 -27 -48 6 36 -35 18 -17 -20 28 -13 -32 -27 7 38 16 1 25 -16 -10 5 -26 31 -15 8 22 13 6 -5 11 -31 -3 -31 10 8 -3 19 -43 8 -29 -21 -8 3 44 32 -5 9 -23 19 -6 3 6 -7 -9 23 -31 2 -19 -2 -3 -5 -5 36 12 -14 21 5 9 10 13 21 -21 12 12 14 18 -27 - 26 -6 -6 -46 7 12 -16 -24 -26 18 -1 9 2 15 -12 17 20 19 -6 0 -1 -16 11 26 -12 0 -28 12 -26 -2 23 -1 0 11 -13 -34 6 22 4 -35 37 15 -15 -26 31 25 -4 2 19 0 7 -21 26 -1 -13 37 28 -13 4 22 22 5 34 2 8 6 -15 -1 25 25 0 22 -17 3 -27 1 43 8 41 -25 12 -15 32 -14 -6 -2 24 22 -33 0 -31 32 17 -32 -22 22 -32 0 3 -24 7 2 40 -28 -39 24 -5 12 -1 -1 27 min = -49 runtime = 59.449 Для продолжения нажмите любую клавишу . . .
Рисунок 1 — Как найти время работы программы
На рисунке 1 видно, что время выполнения программы приблизительно равно 59 секунд. Даже если элементы массива неизменны, время всё равно будет немного отличаться при повторном запуске программы, так как некоторые ресурсы компьютера постоянно будут заняты, а значит, не доступны программе. Если Вы запустите эту программу у себя на компьютере, то время выполнения программы может быть совсем другим, так как наши машины не идентичны.