Мой ответ действителен только для случая 1).
По моему опыту, профилирование - это сложная задача. Использование профессиональных инструментов может быть эффективным, но может потребоваться много времени, чтобы найти правильный и научиться правильно его использовать. Я обычно начинаю очень просто. Я подготовил два очень простых занятия. Первый ProfileHelper класс заполняет время начала в конструкторе и время окончания в деструкторе. Второй класс ProfileHelperStatistic - это контейнер с дополнительными статистическими возможностями (std :: multimap + несколько методов для получения среднего, стандартного отклонения и других забавных вещей).
ProfilerHelper имеет ссылку на контейнер, и перед выходом деструктор помещает данные в контейнер. Вы можете объявить ProfileHelperStatistic в главном, а если вы создадите в стеке ProfilerHelper в начале определенной функции, задание выполнено. , Конструктор ProfileHelper сохранит время запуска, а деструктор отправит результат в ProfileHelperStatistic.
Он довольно прост в реализации и с незначительными изменениями может быть реализован как кроссплатформенный. Время создания и уничтожения объекта не записывается, поэтому вы не будете загрязнять результат. Расчет итоговой статистики может быть дорогостоящим, поэтому я предлагаю вам запустить его один раз в конце.
Вы также можете настроить информацию, которую вы собираетесь хранить в ProfileHelperStatistic, добавив дополнительную информацию (например, метку времени или использование памяти).
Реализация довольно проста, два класса, которые не превышают 50 строк каждый. Всего две подсказки:
1) Поймай всех в деструкторе!
2) рассмотрите возможность использования коллекции, для вставки которой требуется постоянное время, если вы собираетесь хранить много данных.
Это простой инструмент, который может помочь вам очень эффективно профилировать ваше приложение. Я предлагаю начать с нескольких макро-функций (5-7 логических блоков), а затем увеличить степень детализации. Помните правило 80-20: 20% исходного кода используют 80% времени.
Последнее замечание о базе данных: база данных динамически настраивает производительность, если вы выполняете запрос несколько раз в конце, запрос будет выполняться быстрее, чем вначале (Oracle, я полагаю, и другую базу данных). Другими словами, если вы интенсивно и искусственно тестируете приложение, фокусируясь на нескольких конкретных запросах, вы можете получить слишком оптимистичные результаты.