C ++ Benchmark Tool - PullRequest
       41

C ++ Benchmark Tool

1 голос
/ 19 марта 2011

У меня есть приложение, которое делает запросы к базе данных. Полагаю, на самом деле не имеет значения, какую базу данных я использую, но, скажем, это простая SQLite управляемая база данных.

Теперь это приложение работает как служба и выполняет некоторое количество запросов в минуту (это число может быть огромным).

Я желаю сравнить запросы, чтобы получить их количество, максимальное / минимальное / среднее время выполнения за некоторый период, и я хочу разработать свой собственный инструмент для этого (очевидно, что есть некоторые, но мне нужны мои владеть по некоторым причинам:).

Итак - не могли бы вы посоветовать подход для этой задачи?


Я думаю, есть несколько возможных случаев:

1) У меня есть доступ к исходному коду приложения. Здесь, очевидно, я хочу провести некоторую интеграцию между приложениями, возможно, с использованием конвейеров. Не могли бы вы что-нибудь посоветовать? о том, как это должно быть сделано, и (если есть) любое другое возможное решение?

2) У меня нет источников. Итак, возможно ли вообще выполнить аккуратную инъекцию из моего приложения для сравнения другого? Я надеюсь, что есть способ, может быть, хакерский, что угодно.

Большое спасибо.

Ответы [ 8 ]

3 голосов
/ 21 марта 2011

См. C ++ Code Profiler для диапазона профилировщиков.

Или C ++ Библиотека ведения журнала и настройки производительности для развертывания вашей собственной простой версии

2 голосов
/ 24 марта 2011

Мой ответ действителен только для случая 1).

По моему опыту, профилирование - это сложная задача. Использование профессиональных инструментов может быть эффективным, но может потребоваться много времени, чтобы найти правильный и научиться правильно его использовать. Я обычно начинаю очень просто. Я подготовил два очень простых занятия. Первый ProfileHelper класс заполняет время начала в конструкторе и время окончания в деструкторе. Второй класс ProfileHelperStatistic - это контейнер с дополнительными статистическими возможностями (std :: multimap + несколько методов для получения среднего, стандартного отклонения и других забавных вещей).

ProfilerHelper имеет ссылку на контейнер, и перед выходом деструктор помещает данные в контейнер. Вы можете объявить ProfileHelperStatistic в главном, а если вы создадите в стеке ProfilerHelper в начале определенной функции, задание выполнено. , Конструктор ProfileHelper сохранит время запуска, а деструктор отправит результат в ProfileHelperStatistic.

Он довольно прост в реализации и с незначительными изменениями может быть реализован как кроссплатформенный. Время создания и уничтожения объекта не записывается, поэтому вы не будете загрязнять результат. Расчет итоговой статистики может быть дорогостоящим, поэтому я предлагаю вам запустить его один раз в конце.

Вы также можете настроить информацию, которую вы собираетесь хранить в ProfileHelperStatistic, добавив дополнительную информацию (например, метку времени или использование памяти).

Реализация довольно проста, два класса, которые не превышают 50 строк каждый. Всего две подсказки:

1) Поймай всех в деструкторе!

2) рассмотрите возможность использования коллекции, для вставки которой требуется постоянное время, если вы собираетесь хранить много данных.

Это простой инструмент, который может помочь вам очень эффективно профилировать ваше приложение. Я предлагаю начать с нескольких макро-функций (5-7 логических блоков), а затем увеличить степень детализации. Помните правило 80-20: 20% исходного кода используют 80% времени.

Последнее замечание о базе данных: база данных динамически настраивает производительность, если вы выполняете запрос несколько раз в конце, запрос будет выполняться быстрее, чем вначале (Oracle, я полагаю, и другую базу данных). Другими словами, если вы интенсивно и искусственно тестируете приложение, фокусируясь на нескольких конкретных запросах, вы можете получить слишком оптимистичные результаты.

1 голос
/ 27 марта 2011

Существует решение ( linux ), которое может вас заинтересовать, поскольку оно может использоваться в обоих случаях.

Это LD_PRELOAD трюк. Это переменная окружения, которая позволяет вам указать разделяемую библиотеку , которая будет загружена непосредственно перед выполнением вашей программы. Символы, загруженные из этой библиотеки, переопределяют любые другие доступные в системе.

Основная идея заключается в том, чтобы использовать эту пользовательскую библиотеку как оболочку для исходных функций.

Существует множество ресурсов, объясняющих, как использовать этот трюк: 1 , 2 , 3

1 голос
/ 25 марта 2011

В Unix вы можете использовать gprof и его графический интерфейс kprof.Скомпилируйте ваше приложение с флагом -pg (я предполагаю, что вы используете g ++) и запустите его через gprof и наблюдайте за результатами.

Обратите внимание, однако, что этот тип профилирования будет измерять общую производительность приложения, а не только запросы SQL.Если вы хотите измерять производительность запросов, вам следует использовать специальные инструменты, разработанные для вашей СУБД - например, MySQL имеет встроенный профилировщик запросов (для SQLite см. Этот вопрос: Существует ли инструмент для профилирования sqlite?запросы? )

1 голос
/ 22 марта 2011

Я думаю, это не имеет значения, какую базу данных я использую, но скажем, это просто SQLite-управляемая база данных.

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

Я мог бы говорить только о IBM DB / 2, но я считаю, что IBM DB / 2 - не единственная база данных с интегрированными инструментами мониторинга.

Вот, например, краткий обзор того, что вы можете отслеживать в IBM DB / 2:

  • операторы (все выполняемые операторы, количество выполнений, время подготовки, время процессора, количество операций чтения / записи: табличные, пул буферов, логические, физические)
  • таблицы (количество операций чтения / записи)
  • буферные пулы (логическое и физическое чтение / запись для данных и индекса, время чтения / записи)
  • активные соединения (выполняемые операторы, количество операций чтения / записи, время)
  • замки (все замки и тип)
  • и многие другие

Данные монитора могут быть доступны через SQL или API из собственного программного обеспечения, как, например, Монитор DB2 делает.

0 голосов
/ 26 марта 2011

Используйте апач jmeter .Чтобы проверить производительность ваших запросов SQL под высокой нагрузкой

0 голосов
/ 24 марта 2011

Здесь, очевидно, я хочу провести некоторую интеграцию между приложениями, возможно, с использованием конвейеров.

Не думаю, что это вообще очевидно.

Если у вас есть доступ к приложению, я бы предложил выгрузить всю необходимую информацию в файл журнала и обработать этот файл позже.Если вы хотите иметь возможность активировать и деактивировать это поведение на лету, без перезапуска службы, вы можете использовать библиотеку журналов, которая поддерживает включение / отключение каналов журналов на лету.Тогда вам нужно будет только отправить сообщение в службу любыми средствами (сокетное соединение, ...), чтобы включить / отключить ведение журнала.

Если у вас нет доступа к приложению, то я думаю,лучшим способом было бы то, что предложил МакГаки: пусть это делают инструменты профилирования / мониторинга СУБД.Например, MS-SQL имеет хороший профилировщик, который может захватывать запросы к серверу, включая все виды полезных данных (время процессора для каждого запроса, время ввода-вывода, время ожидания и т. Д.).

И если это действительно SQLite (плюс у вас нет доступа к источнику), тогда ваши шансы довольно низки.Если рассматриваемая программа использует SQLite в качестве библиотеки DLL, вы можете заменить свою собственную версию SQLite, измененную для записи необходимых файлов журнала.

0 голосов
/ 22 марта 2011

Вам необходимо аспектно-ориентированное решение.

Выезд AspectC ++ .

...