比较同一任务的

时间:2017-09-14 08:24:54

标签: python shell memory valgrind performance-testing

假设有两个脚本:(a)调用JAVA jar的 bash shell脚本(以下称my_shell_script),以及(b)从其他Python包导入函数的Python脚本但是不会调用任何非Python包或软件(以下称my_Python_script)。这两个脚本具有相同的目的:它们采用相同的输入(以下为testinput)并生成大致相同的输出。

我想在执行时测量并比较两个脚本的内存使用情况作为时间的函数。

为此,我使用valgrind通过massif执行每个脚本(将time_unit设置为毫秒),然后通过ms_print汇总massif输出。

INF=testinput

# Testing Shell script
valgrind --tool=massif --pages-as-heap=yes --time-unit=ms --massif-out-file=${INF}_shell.out bash my_shell_script -f $INF -j my_java_jar
ms_print --threshold=50.0 ${INF}_shell.out > ${INF}_shell.summary

# Testing Python script
valgrind --tool=massif --pages-as-heap=yes --time-unit=ms --massif-out-file=${INF}_Python.out python2 my_python_script $INF
ms_print --threshold=50.0 ${INF}_Python.out > ${INF}_Python.summary

虽然valgrind / massif记录my_python_script的内存使用量与我通过htop看到的大致一致,但my_shell_script并非如此。 htop上的统计信息表示执行my_shell_script期间内存使用量为GB,但valgrind / massif仅记录了几十MB内存。

因此,我怀疑valgrind / massif记录了bash代码执行的内存使用情况,但没有记录bash代码正在调用的JAVA jar。

如何正确测量my_shell_script作为时间函数的内存使用情况?

1 个答案:

答案 0 :(得分:0)

选项--trace-children = yes | no表示跟踪(或不跟踪)子项。默认值为no,这意味着执行脚本的shell将会 在valgrind下,但不是启动的python或java进程。

因此,请指定--trace-children = yes。

请务必使用例如massif out文件参数中的%p,否则全部为 进程(例如shell及其子进程)将写入相同的文件,这将无法正常工作。