【问题标题】:Average execution time平均执行时间
【发布时间】:2011-04-15 10:56:30
【问题描述】:

有没有什么好的 GNU 方法可以测量某些命令行程序的平均(最坏情况,最好情况)执行时间?我有图像过滤器,未指定数量的图片,在 bash 中使用 for-loop 过滤它们。到目前为止,我正在使用 time,但我找不到获取一些统计信息的方法。

【问题讨论】:

标签: c bash profiling


【解决方案1】:

您应该考虑是否对外部循环进行计时并除以重复次数,而不是单独计时每次迭代。如果您担心丢弃高低,只需再进行几次迭代即可将它们淹没。

time for i in {1..1000}
do
    something
done

你可以capture the output from time in a variable:

foo=$( { time {
    echo "stdout test message demo"
    for i in {1..30}
    do
        something
    done
    echo "stderr test message demo" >&2
} 1>&3 2>&4; } 2>&1 )

做一些假数学

foo=${foo/.}          # "divide" by ...
echo "0.00${foo/#0}"  # ... 1000

或者直接使用bc

echo "scale=8; $foo/1000" | bc

【讨论】:

    【解决方案2】:

    有一个有趣的 Perl 程序,名为 dumbbench,它本质上是对 time 命令的包装。它会多次运行您的程序,丢弃异常值,然后计算一些统计数据。

    作者有几篇文章(herehere)概述了 a)为什么基准测试很糟糕,以及 b)你可以制作什么样的漂亮图表来让你的基准测试数字少一点。

    【讨论】:

    • 只希望每次运行都能传递不同的参数,今晚就测试一下。
    【解决方案3】:
    #!/bin/bash
    for i in {1..100}
    do
      env time --append -o time_output.txt   ./test_program --arguments-to-test-program
    done
    exit
    

    如果您发现 {1..100} 语法不适合您,那么您应该查看 seq 命令。

    我使用env time 来执行时间程序,而不是shell 的内置命令,它不会接受时间程序需要的所有参数。 time 程序还接受其他参数来更改其输出的格式,您可能希望使用它来使数据更容易被另一个程序处理。 -p (--portability) 参数使其以 POSIX 格式输出(就像 BASH 的内置时间一样),但使用 -f 选项可以获得更多控制权。 man 1 time 了解更多信息。

    收集数据后,一个简单的 perl 或 python 脚本可以轻松解析和分析计时数据。

    【讨论】:

    • 您不必使用seq。你可以做for ((i=1; i<=100; i++))
    • 如果可能的话,如果其他人这样做,我想避免自己编写分析器。
    【解决方案4】:

    您可以将时间输出发送到某个文件,然后“工作”该文件

    echo "some info" >> timefile.txt
    time ( ./yourprog parm1 parm2 ) 2>> timefile.txt
    

    【讨论】:

    • 你不需要括号。
    • 在我的电脑上(bash 版本 4.1.5(1)-release (x86_64-pc-linux-gnu)),没有括号,2>> 适用于内部程序
    • @DennisWilliamson 也一样,我也确实需要括号。
    【解决方案5】:

    time 让您走在正确的轨道上。这是我用来执行小型代码执行分析的工具。

    然后我使用 python 通过读取time 的输出来收集统计信息。为了提高准确性,我通常会尝试 10 到 1000 次,具体取决于每个过程需要多长时间。

    我不熟悉任何进行此类分析的预安装 GNU 应用程序。

    【讨论】:

    • 如果你打算使用 Python,你可能想要使用timeit
    • 在过去,我们使用time 运行程序 12 次,扔掉最好和最差的时间,然后取其余 10 个值的平均值。
    • 我喜欢timeit!我只是建议从time 导入数据,因为我不想让python 控制我的命令的执行,从而可能通过捕获stdin 和诸如此类的东西来减慢执行速度。这有点像,我应该使用 C 还是使用 Python:那种感觉。
    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-11
    • 1970-01-01
    • 2010-11-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多