测量使用预编译库(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_statement
和log_duration
并在postgresql.conf
中设置log_min_duration_statement=0
,运行您的程序,然后使用例如PQA 分析Postgres 日志。
【讨论】:
是的,这似乎是一个好方法。但是,如果可能的话,我更喜欢在不修改任何 conf 的情况下做所有事情。所以,我将首先寻求彼得的解决方案,并将其作为最后的手段。非常感谢您的建议。以上是关于测量使用预编译库(C++、Linux)的程序的总 CPU 时间的主要内容,如果未能解决你的问题,请参考以下文章