测量使用预编译库(C++、Linux)的程序的总 CPU 时间

Posted

技术标签:

【中文标题】测量使用预编译库(C++、Linux)的程序的总 CPU 时间【英文标题】:Measuring total CPU time of a program that uses precompiled libraries (C++, Linux) 【发布时间】:2010-10-20 14:47:46 【问题描述】:

我目前偶然发现了这个问题,我很想听听您的一些建议。

我有一个 C++ 程序,它使用预编译库对 PostgreSQL 数据库进行一些查询。现在的问题是我想找出执行程序源代码中描述的所有例程所需的总(组合)cpu 时间以及等待与数据库相关的活动所花费的时间.

我在Linux中使用了time命令,但是好像没有测量程序在数据库上花费的时间。

在我的情况下,我无法重新编译提供给我的库,所以我不认为像 gprof 这样的东西会起作用。

有什么建议吗?

谢谢。

【问题讨论】:

您想要获取您的程序的CPU时间,还是您的程序和数据库的综合CPU时间? (您的程序将只是等待,不花费 cpu 时间,而数据库则在工作 - 但如果您只想要总执行时间,您会很容易得到) 当然是程序和数据库的综合 CPU 时间。 :) 【参考方案1】:

试试ctime中的时钟功能。

clock_t start, end;
double cpu_time_used

start = clock(); // Do stuff end = clock(); cpu_time_used = ((double)(end - start)) / CLOCKS_PER_SEC;

【讨论】:

您好,感谢您的回答。但是,我认为在这种情况下它不会起作用,因为它只会测量当前进程中的 cpu 时间,不包括在数据库中执行查询所花费的时间。【参考方案2】:

使用 POSIX 的times,它测量一个进程及其子进程的真实、用户和系统时间。

链接的 Opengroup 页面上有一个示例:“Timing a Database Lookup”

【讨论】:

谢谢!这可能是我需要的。我会试一试,看看它是否真的能满足我的需求。【参考方案3】:

当然,无论如何您都会获得挂钟时间,但大概您正在尝试获得 CPU 时间。

当您涉及子流程(或不相关的流程)时,这是非常重要的。但是,您可能希望尝试采用更全面的基准测试方法。

测量应用程序的延迟很容易(只需观察挂钟),但吞吐量通常更难。

要了解应用程序在负载下的行为方式,您需要以可重现的方式将其置于负载下(在生产级硬件上)。

这通常意味着同时执行大量任务,因为现代硬件往往能够同时执行多项任务。此外,如果您的应用程序中的任何东西都在等待任何外部数据源(可能包括您自己机器的硬盘驱动器),那么通过一次处理多个请求,您甚至可以在单个内核上获得更好的吞吐量。

您可能需要查看像 oprofile 这样的工具,它是为分析而不是基准测试而设计的。

【讨论】:

谢谢!是的,我可能想稍后再找,但现在我会坚持要求。【参考方案4】:

您可以打开log_statementlog_duration 并在postgresql.conf 中设置log_min_duration_statement=0,运行您的程序,然后使用例如PQA 分析Postgres 日志。

【讨论】:

是的,这似乎是一个好方法。但是,如果可能的话,我更喜欢在不修改任何 conf 的情况下做所有事情。所以,我将首先寻求彼得的解决方案,并将其作为最后的手段。非常感谢您的建议。

以上是关于测量使用预编译库(C++、Linux)的程序的总 CPU 时间的主要内容,如果未能解决你的问题,请参考以下文章

XCode不能在预编译头中使用c++静态库。

使用预编译的C共享库与JNI / NDK

如何测量预编译的 java 类的执行时间?

使用 Linux g++ 编译带有附加库的 c++ 程序

在多线程 C++ 应用程序中测量时间

预编译标题问题