比较两个函数的执行时间

比较两个函数的执行时间

我正在尝试编写一个函数,该函数将两个命令作为输入,对这两个命令的执行进行计时,然后将这些时间输出到文本文件。看完之后这个帖子,我已经完成了大部分工作,并且可以一次将我的执行时间写入一个文件。我现在遇到的问题是让函数接受两个多字输入。我当前的代码如下所示:

timeDiff () {
  { time "$1" ; } 2> ~/file.txt
  { time "$2" ; } 2>> ~/file.txt
}

如果我使用我想要的函数顺序运行这些行,一切都很好。该文件将被两个函数的时间信息覆盖。以下是我对此的一些尝试和问题:

timeDiff grep "str" file1 query database lookup.sql

这将导致我的文件有时会出现有关 grep 的警告,并且会出现bash: str: command not found.

timeDiff 'grep "str" file1' 'query database lookup.sql'

这将导致我的文件有时出现 bash:grep "str" file1: No such file or directory 和 bash:query database Lookup.sql: No such file or directory。

我认为这与我的 grep 需要引号有关,但也许有更好的方法来编写函数的输入。我是初学者,所以我很想学习!谢谢!

答案1

和:

 { time "$1" ; } 2> ~/file.txt

bash对于像这样具有time关键字的shell ,您可以使用time关键字来计算 shell 代码的计算时间"$1""$1"是执行命令的代码,其名称位于函数的第一个位置参数中:

和:

timeDiff grep "str" file1 query database lookup.sql

您正在调用timeDiff作为grep第一个参数和str第二个参数(以及file1第三个参数等)

因此,time "$1"将计算不带参数调用的命令的执行时间grepgrep需要至少一个参数,所以会抱怨。

timeDiff 'grep "str" file1' 'query database lookup.sql'

这次$1会,grep "str" file1但不太可能有一个名为该名称的命令。

您想要的似乎是对第一个和第二个参数中传递的 shell 代码的评估进行计时,如下所示:

timeDiff () {
  time eval " $1"
  time eval " $2"
} 2> ~/file.txt

或者可能:

timeDiff () {
  eval "time {
    $1
  }"
  eval "time {
    $2
  }
} 2> ~/file.txt

评估由以下内容组成的 shell 代码:

time {
  contents-of-$1
}

对命令组进行计时,该命令组的主体是第一个位置参数的内容。

还要注意的是:

{ time cmd; } 2> file

计时将结束file,但也会出现错误cmd(以及 shell 无法运行的错误(cmd如果有的话))。

要得到仅有的的时间file,你需要这样的东西:

{ time cmd 2>&3 3>&-; } 3>&2 2> file

答案2

timeDiff grep "str" file1 query database lookup.sql

将使 $1=grep 和 $2=str

timeDiff 'grep "str" file1' 'query database lookup.sql'

将使 $1 成为字符串“grep“str”file1”,因此它会查找名为的文件

./grep_"str"_file1

其中_是空格字符:没有这样的文件。

你需要使用 bash评估函数将字符串转换为可执行的命令行语句。

但要小心他们说“评估是邪恶的”是有原因的:)

相关内容