C ++基准测试工具

时间:2011-03-19 15:21:17

标签: c++ database integration benchmarking connection

我有一些应用程序,它会产生数据库请求。 我想这实际上并不重要,我正在使用什么样的数据库,但是我们说这是一个简单的SQLite驱动的数据库。

现在,这个应用程序作为服务运行,并且每分钟执行一些请求(这个数字实际上可能很大)。

我愿意对查询进行基准测试以检索他们的数量,最大/最小/平均运行时间一段时间,我希望为此设计我自己的工具(显然,有一些,但我需要我的由于某些适当的原因而拥有:)。

那么 - 你能为这项任务提出建议吗?


我想有几种可能的情况:

1)我可以访问应用程序源代码。 在这里,显然,我想进行某种跨应用程序集成,可能使用管道。你能不能建议如何做到这一点以及(如果有的话)任何其他可能的解决方案?

2)我没有消息来源。那么,这甚至可以从我的应用程序执行一些整洁的注入来对另一个进行基准测试吗? 我希望有一种方法,也许是hacky,无论如何。

非常感谢。

8 个答案:

答案 0 :(得分:3)

有关各种分析器,请参阅C++ Code Profiler

C++ Logging and performance tuning library用于滚动您自己的简单版本

答案 1 :(得分:2)

我的回答仅适用于案例1)。

根据我的经验分析,这是一项有趣的艰巨任务。使用专业工具可能会有效,但可能需要花费大量时间才能找到合适的工具并学习如何正确使用它。我通常以一种非常简单的方式开始。我准备了两个非常简单的课程。第一个ProfileHelper类在构造函数中填充开始时间,在析构函数中填充结束时间。第二类ProfileHelperStatistic是一个具有额外统计功能的容器(std :: multimap +几种返回平均值,标准偏差和其他有趣内容的方法)。

ProfilerHelper有一个对容器的引用,在退出之前,析构函数会推送容器中的数据。你可以在main中声明ProfileHelperStatistic,如果在特定函数开头的堆栈上创建ProfilerHelper,则作业完成。 ProfileHelper的构造函数将存储开始时间,析构函数将在ProfileHelperStatistic上推送结果。

它很容易实现,只需稍加修改就可以实现跨平台。创建和销毁对象的时间不会被记录,因此您不会污染结果。计算最终统计数据可能很昂贵,所以我建议你最后运行一次。

您还可以自定义要存储在ProfileHelperStatistic中的信息,以添加额外信息(例如时间戳或内存使用情况)。

实现相当简单,两个类不超过50行。只有两个提示:

1)在析构函数中捕获所有内容!

2)如果要存储大量数据,请考虑使用需要花费一定时间的集合。

这是一个简单的工具,它可以帮助您以非常有效的方式分析您的应用程序。我的建议是从几个宏函数(5-7逻辑块)开始,然后增加粒度。请记住80-20规则:20%的源代码使用80%的时间。

关于数据库的最后注意事项:数据库动态调整性能,如果你在结束时多次运行查询,查询将比开始时更快(Oracle确实如此,我猜其他数据库也是如此)。换句话说,如果你大量和人为地测试应用程序只关注几个特定的​​查询,你可以获得过于乐观的结果。

答案 2 :(得分:1)

  

我想这实际上并不重要,   我正在使用什么样的数据库,   但是让我们说它很简单   SQLite驱动的数据库。

使用什么类型的数据库非常重要,因为数据库管理器可能具有集成监控功能。

我只能说IBM DB / 2,但我相信IBM DB / 2并不是唯一具有集成监控工具的dbm。

这里举例说明您可以在IBM DB / 2中监控的内容:

  • 语句(所有执行的语句,执行计数,准备时间,cpu-time,读/写次数:tablerows,bufferpool,logical,physical)
  • 表(读/写次数)
  • 缓冲池(数据和索引的逻辑和物理读/写,读/写时间)
  • 活动连接(运行语句,读/写次数,次数)
  • 锁(所有锁和类型)
  • 以及更多

可以通过SQL或API从自己的软件访问监控数据,例如DB2 Monitor

答案 3 :(得分:1)

在Unix下,你可能想要使用gprof及其图形前端kprof。使用-pg标志编译您的应用程序(我假设您使用的是g ++)并通过gprof运行它并观察结果。

但请注意,此类分析将衡量应用程序的整体性能,而不仅仅是SQL查询。如果是要测量的查询的性能,则应使用专为DBMS设计的特殊工具 - 例如,MySQL具有内置查询分析器(对于SQLite,请参阅此问题:Is there a tool to profile sqlite queries?

答案 4 :(得分:1)

有一个( linux )解决方案,您可能会感兴趣,因为它可以在两种情况下使用。

这是 LD_PRELOAD 技巧。这是一个环境变量,让您指定在程序执行之前加载的共享库。从该库加载的符号将覆盖系统上的任何其他可用符号。

基本思想是将这个自定义库作为原始函数的包装。

有很多资源可以解释如何使用这个技巧:123

答案 5 :(得分:0)

  

在这里,显然,我想进行某种跨应用程序集成,可能使用管道。

我认为这根本不是显而易见的。

如果您有权访问该应用程序,我建议将所有必要的信息转储到日志文件中,然后再处理该日志文件。 如果您希望能够在不重新启动服务的情况下即时激活和停用此行为,则可以使用支持即时启用/禁用日志通道的日志记录库。 然后,您只需要通过任何方式(套接字连接,...)向服务发送消息以启用/禁用日志记录。

如果您无法访问该应用程序,那么我认为最佳方式是MacGucky建议的:让DBMS的分析/监控工具执行此操作。例如。 MS-SQL有一个很好的分析器,可以捕获对服务器的请求,包括各种有用的数据(每个请求的CPU时间,IO时间,等待时间等)。

如果真的是SQLite(加上你无法访问来源)那么你的机会就相当低了。如果有问题的程序使用SQLite作为DLL,那么您可以替换自己的SQLite版本,修改后编写必要的日志文件。

答案 6 :(得分:0)

使用apache jmeter。 在高负载下测试sql查询的性能

答案 7 :(得分:-1)

您需要一个面向方面的解决方案。

查看AspectC++