我正在比较两个长日志文件,除了时间戳之外完全相同。
例如:Log1
fn1-start 11:10:10
fn2-start 11:10:12
fn2-end 11:10:19
fn1-end 11:11:20
...
A long list
...
记录2
fn1-start 11:22:11
fn2-start 11:22:13
fn2-end 11:22:20
fn1-end 11:23:41
...
A long list
...
我想比较两个这样的日志文件,找出哪个函数使用某些比较工具导致性能下降。
我想要的是增加或减少其中一个日志文件中的所有时间戳。第二个文件的时间戳从11:22:11开始,在我的情况下,我可以将00:10:01添加到第一个日志文件时间戳并比较日志。
因此,将日志1时间戳增加00:12:01。 所以Log 1现在是:
fn1-start 11:22:11
fn2-start 11:22:13
fn2-end 11:22:20
fn1-end 11:23:21
...
A long list
...
在这种情况下,fn1在日志2中调用fn2函数后需要20秒才能完成。
我怎样才能做到这一点?我应该使用哪些工具?任何替代方法?
答案 0 :(得分:0)
因此,您希望比较各个函数的运行时间,而不是将它们抵消,以便第一个函数在同一时间开始。
这意味着您需要在比较两个文件之前计算函数运行时间。这可以通过一个相当简单的awk脚本来完成:
function get_durations() {
awk '
BEGIN{
# Split spaces and dashes
FS="[ ]*|-"
}
/start/ {
start[$1] = $3
}
/end/ {
if($1 in start)
end[$1] = $3
else
print "No corresponding \"start\" for function " $1 > "/dev/stderr"
}
# Function to convert timestamps into seconds using gnu coreutils date
function timestamp_to_seconds(ts) {
close(sprintf("date \"+%%s\" --date=\"%s\"", ts) | getline sec)
return sec
}
END {
for (x in start){
if(end[x]){
end_seconds = timestamp_to_seconds(end[x])
start_seconds = timestamp_to_seconds(start[x])
printf("%s %s\n", x, end_seconds - start_seconds)
}
else{
printf("%s inf\n", x)
print "No corresponding \"end\" for function " x > "/dev/stderr"
}
}
}
' "${1}"
}
要比较持续时间,您可以使用awk数组以类似的方式进行操作:
function compare_durations() {
gawk -P '
BEGIN{
print "function,file1_duration,file2_duration,12_difference"
}
f[$1] {
printf("%s,%s,%s,%s\n",
$1,
$2,
f[$1],
($2 == "inf" || f[$1] == "inf" ? "inf" : $2 - f[$1]))
}
!f[$1]{
f[$1] = $2
}
' "${1}" "${2}"
}
此功能将两个文件作为输入,并打印出具有两个文件之间比较结果的csv。
最后,您可以将这些功能一起使用来比较文件:
compare_durations <(get_durations input1) <(get_durations input2) > summary.csv
此解决方案假定函数名称不重复(如果重复) 重复一次,您可以更改脚本以为每个功能添加一个计数器。 该脚本的时间复杂度为O(n),但它占用O(n)空间,因此 如果日志真的很长,应该找到另一种方法。