Как увеличить временные метки в текстовом файле - PullRequest
0 голосов
/ 13 июня 2018

Я сравниваю два длинных файла журнала, которые в точности совпадают, за исключением метки времени.

Например: Log1

fn1-start 11:10:10
fn2-start 11:10:12
fn2-end   11:10:19
fn1-end   11:11:20
...
A long list
...

Log 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 к отметкам времени первого файла журнала и сравнить журналы.

Итак, увеличьте временные метки log 1 на 00:12:01.Журнал 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 занимает больше 20 секунд для завершения после вызова функции fn2 в журнале 2.

Как этого добиться?Какие инструменты я должен использовать?какие-нибудь альтернативные методы?

1 Ответ

0 голосов
/ 30 июля 2018

Таким образом, вы хотите сравнить время выполнения для отдельных функций, а не сместить их, чтобы первый запуск выполнялся в одно и то же время.

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

...