Таким образом, вы хотите сравнить время выполнения для отдельных функций, а не сместить их, чтобы первый запуск выполнялся в одно и то же время.
Это означает, что вам нужно вычислить продолжительность времени выполнения функции перед сравнением двухфайлы.Это можно сделать с помощью довольно простого скрипта 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), поэтому, если у вас очень длинные журналы, вы должны найти другой подход.