[БЕЗ_ЗВУКА] В предыдущем
видео мы с вами разработали класс LogDuration,
который позволяет нам замерять время работы произвольного блока кода.
Им можно пользоваться для того, чтобы мерить,
сколько работает та или иная часть вашей программы и искать в ней узкое место.
Однако давайте посмотрим сейчас в код и посмотрим, как мы этим классом пользуемся.
Вот, например, мы объявляем объект класса LogDuration,
называем его total и в качестве сообщения также используем строчку total.
Дальше.
Мы, для того чтобы померить, сколько времени занимает
у нас ввод множества,
объявляем переменную с именем input и в
качестве сообщения тоже используем строчку input.
Наконец, когда мы хотим померить, сколько у нас обрабатываются все запросы,
мы объявляем объект с именем queries и используем строчку "Queries_processing".
На самом деле, вот эти вот имена переменных — они нам не нужны,
мы к этим переменным в коде нашем не обращаемся нигде.
И то, что нам при добавлении очередного измерения нужно
каждый раз придумывать имя переменной, это не очень удобно.
Потому что зачем тратить время на то, чтобы придумывать какое-то имя,
а если оно совпадет с именем другого какого-то объекта LogDuration?
Мы будем тратить лишнее время.
Поэтому, нам нужно придумать какой-то способ,
который позволит нам также объявлять объекты класса LogDuration,
но избавит от необходимости придумать имя для переменной.
И тут нам на помощь придут макросы.
Смотрите, что мы можем сделать.
Мы объявим макрос,
назовем его LOG_DURATION,
который в качестве параметра принимает сообщение.
Это вот то самое сообщение, которое мы передаем в конструктор.
Давайте даже, вот пока не наполняя этот макрос никаким
содержимым, мы покажем, как мы им будем пользоваться.
Ну собственно, вот так.
Мы будем писать LOG_DURATION, и в данном случае, "total".
Давайте сразу внедрим, а потом будем реализовывать.
[БЕЗ_ЗВУКА] Вот
таким образом мы нашим макросом будем пользоваться.
Теперь давайте его реализуем.
Ну как он будет выглядеть?
Понятно, что нам все равно нужно объявить объект
класса LogDuration, поэтому мы пишем LogDuration — тип объекта.
Дальше здесь у нас будет что-то, (пока многоточие),
и здесь мы передаем наше сообщение,
message, которое
передается в конструктор класса LogDuration.
Что мы укажем вместо многоточия?
Вместо многоточия мы вставим специальный
макрос UNIQ_ID,
в который передадим макрос __LINE__.
И устройство этого макроса UNIQ_ID я просто скопирую, вот оно.
Мы не будем сейчас останавливаться на том, как этот макрос устроен,
а просто, вы мне поверите на слово,
что вот эта вот конструкция UNIQ_ID(__LINE__) позволяет
объявить уникальный идентификатор в пределах заданного cpp-файла.
Давайте скомпилируем, что у нас получилось, оно компилируется, и запустим.
Наша программа работает.
Она работает, она что-то мерит, вот мы видим,
что ввод длится 102 секунды, обработка запросов — 76, вся программа — 181.
При этом, мы добились желаемого удобства.
Нам больше не нужно придумывать имя для объекта,
мы просто пишем LOG_DURATION и сообщение и получаем
в стандартный поток ошибок длительность работы соответствующего блока count.
Это действительно удобно.
То есть вот, допустим, мы захотим померить,
сколько работает одна итерация нашего цикла.
Мы просто пишем LOG_DURATION("Iter " (как итерация),
и + to_string(i); Компилируем.
Все. У нас все компилируется, мы одну строчку
написали, у нас теперь для каждой итерации цикла замеряется, сколько она работает.
Вот вы видите, что в консоль вывелось сообщение для каждой итерации цикла.
Прекрасно.
Ну и остался на самом деле один штришок,
чтобы сделать наш вот этот класс LogDuration, наш такой простенький,
можно сказать, «наколеночный» профайлер, чтобы сделать его переиспользованным.
Давайте его вынесем в отдельный файл.
Заведем заголовочный
файл в нашем проекте.
Назовем его profile.h и вынесем
сюда класс LogDuration
и необходимые include'ы.
Это include <chrono>,
[БЕЗ_ЗВУКА] using namespace,
здесь нам пространство chrono больше не нужно,
ну и так как мы выводим в std, нам понадобится его <iostream>.
Ну а здесь, давайте подключим файл profile.h.
Компилируем.
Не компилируется.
[БЕЗ_ЗВУКА], потому
что подключился какой-то другой файл.
Это очень странно.
У нас profile.h создался не в той папке.
Все, теперь у нас все нормально, у нас все компилируется, запускается, работает.
Длительность работы меряется, все нормально.
Мы смогли сделать такой вот простой профилировщик,
который можно теперь использовать для замера времени
работы отдельных блоков кода.
И давайте подведем итоги.
Мы с вами в этом и предыдущем видео смогли разработать класс LogDuration, который
можно использовать для замера времени работы программы и отдельных ее блоков,
а также сделали специальный макрос LOG_DURATION который нас избавляет от
придумывания ненужных идентификаторов и упрощает работу с этим профайлером.