- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在实现一个算法,想测量它的时间和内存消耗。为了帮助我,我编写了自己的测量实用程序,它从 /proc/[pid]/stat
读取用户和系统消耗的时间量,以及虚拟内存和驻留集峰值大小。 (我不是 100% 清楚这两个内存统计数据之间的区别,但这不是手头的问题。)
到目前为止一切顺利,但随之而来的是第三方实现,我希望将其与我自己的程序进行比较。由于我不想摆弄它的来源,我无法使用我自己的测量程序来收集有关其效率的数据(我也许可以,但这需要我重新考虑我的测量方案)。所以我发现 /usr/bin/time
也采取了这些措施。
当我比较输出时,我发现 /usr/bin/time
确实报告了与我自己的工具相同的时间使用情况,但内存数据却大不相同。首先,/usr/bin/time
不报告任何有关虚拟内存使用情况的信息,它仅提供有关最大驻留集大小的帖子。其次,/usr/bin/time
报告的驻留集大小大约是我自己测量的六到八倍。
所以,我一直在努力找出 /usr/bin/time
实际上是如何进行测量的,以及为什么差异如此根本。另外,哪个是正确的值?
输出示例(单位为 MB):
<program>: <virtual mem> <resident set size>
autotest (my own utility): 23.2266 2.19531
/usr/bin/time: N/A 11.23437
我正在使用 GNU/Linux 3.8.13 Mageia 3 x86_64。
编辑:为了增强信心,我发现 KDE 系统监视器支持我自己的实用程序报告的数据。事实上,它和我一样从同一个地方获取信息。因此,信任来自 /proc/[pid]/stat
的数据应该是非常安全的。但问题仍然存在......
EDIT2:根据以下答案的帮助,推断wait3()
是GNU time
使用的命令。它以手册页 getrusage(2) 中描述的形式返回数据。在 RSS 上,它说:
This is the maximum resident set size used (in kilobytes).
手册页还提到了 proc/[pid]/stat
,它说
Resident Set Size: number of pages the process has in real memory. This is just the pages which count toward text, data, or stack space. This does not include pages which have not been demand-loaded in, or which are swapped out.
那么,第二个版本是否更准确地测量我的程序的内存使用情况,而第一个版本也测量某种外部库的使用情况?
最佳答案
我没有检查time
的来源。但是有 wait3
和 wait4
函数来获取子进程的usage
:
pid_t wait3(int *status, int options, struct rusage *rusage);
pid_t wait4(pid_t pid, int *status, int options, struct rusage *rusage);
struct usage
包含最大驻留集大小值。
手册页 getrusage(2) 描述了 struct usage
。
关于c++ -/usr/bin/time 是如何衡量内存使用情况的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19494298/
我正在创建一个 sql server 存储过程,它将输入作为逗号分隔的 productid 或选项“全部”。当用户传入逗号分隔的产品 ID 时,查询应输出所有产品 ID 的数据。我使用“IN”语句执行
我有一个自动生成的 Web 服务客户端。我有很多复杂的类,我必须对其进行模式匹配。现在我的结构如下所示: val response = client.getResponse response matc
关闭。这个问题是opinion-based .它目前不接受答案。 想改进这个问题?更新问题,以便 editing this post 可以用事实和引用来回答它. 7年前关闭。 Improve this
我需要正确的 tsql 语法来解决这个问题: Select * from table where var_A='10' select * from table where var_B='10' 何时使
我遇到了这个问题。每当我运行程序并在需要时键入字母 m 时,我的 if 语句都不会识别它。有人知道为什么吗?我已经这样做了一个小时,但没有结果。 #include #include #includ
我从数据库列名称“你有护照”创建了一个表,用户回答是或否我如何将 css 应用到这个动态工作的表。 table, th, td { border: 1px solid black;
我对 LocationListener 类的 onStatusChanged 有一些疑问。 它知道它可以呈现三种状态:AVAILABLE、TEMPORARILY_UNAVAILABLE 和 OUT_O
当引入新的异常类型时,我总是不确定如何正确地做到这一点。有共同约定吗?你怎么做呢? 我对您组织它们的范围感兴趣(将它们保留在它们所使用的单元中?在组件级别有一个单元?包级别?应用程序?) 这也会影响命
我使用以下内容创建了日期维度: https://www.codeproject.com/Articles/647950/Create-and-Populate-Date-Dimension-for-D
您好,我正在使用 Android 完全 Kiosk 浏览器,该浏览器使用 chrome Webview。但是 javascript 中的某些方法或函数无法正常工作,例如 window.print()。
我有以下代码: public void OpenFile(string FileName) { if (FileName == null)
获取索引越界异常 for (int recordData = 0; recordData < recordDataList.size(); recordData++) {
我使用它在发生错误时在登录中显示一条消息: × Invalid user or password
这是我的场景,我有一个异常列表,其中包含来自不同层次结构的任意异常,下面的代码快照将解释我需要做什么 private List connectionExceptions; try { // tryin
我尝试动态更新 Jtextpane 中的左缩进。但我不能!这是我尝试过的! DefaultStyledDocument document = (DefaultStyledDocument) textp
我不知道为什么这个异常不起作用...... import java.util.*; public class a { public static void main(String[] args
我目前在 case 中使用多个 when 时遇到问题。当我删除第二个当时,它就起作用了。这是什么问题? 报告的MYSQL错误为: #1064 - You have an error in your S
例如,我有一个表记录用户查看和下载文件的事件, file_id user activity 2 Tim view 1 Ron
这是一个非常愚蠢的问题,但我需要一点安慰/帮助。我有当前的“递归”情况: void add( int value ) { // do something ... // if ( conditi
我尝试使用以下代码在按钮数组上注册回调。但我似乎无法理解如何绑定(bind)回调中需要的字符串。任何建议将不胜感激! for (var i = 0; i < this.car_types.length
我是一名优秀的程序员,十分优秀!