Vim verbosefile с отметками времени - PullRequest
0 голосов
/ 17 августа 2011

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

Есть ли способ создания файла журнала внутренней активности Vim (в стилеverbosefile), которая также включает временные метки для каждого вызова функции, что позволяет мне отлаживать эти проблемы.Кроме того, есть ли другие инструменты, которые помогут мне в этой задаче?

Большое спасибо.

Ответы [ 3 ]

2 голосов
/ 17 августа 2011

Одна вещь, которую вы можете попробовать, это вызвать vim с помощью --startuptime some_file.Это сбросит шаги, выполненные во время запуска, вместе с временными метками.Попробуйте :help --startuptime для получения дополнительной информации.

К сожалению, здесь отображаются метки времени для файлов, а не функций.Если вы хотите узнать, сколько времени занимает определенная функция, вы можете поместить ее в файл в каталоге plugin, чтобы она выполнялась при загрузке.Это не будет возможно во всех случаях, и это не даст вам много детализации, но это может помочь вам сузить проблему.У кого-то еще может быть идея получше, но я бы попробовал что-то вроде этого.

РЕДАКТИРОВАТЬ :

Я только что нашел две вещи, которые могут помочь с этой проблемой,Одним из них является reltime().Вот пример из справки vim:

let start = reltime()
call MyFunction()
echo reltimestr(reltime(start))

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

Второй должен быть намного более мощным, команда :profile.Это позволяет вам профилировать кусок vimscript и поместить результаты в файл.: справочный профиль должен рассказать вам все, что вам нужно знать.К сожалению, он доступен только с функцией +profile, которая, кажется, включена только в "огромном" наборе функций.Если у вашего vim его нет, вам нужно перекомпилировать.Если это проблема, или вы не хотите беспокоиться, вы могли бы достичь хороших результатов только с reltime.

0 голосов
/ 17 февраля 2013

Лучше поздно, чем никогда? Я искал, чтобы посмотреть, смогу ли я, чтобы vim включил некоторые метки времени в &verbosefile, так как это заставляет vim добавлять файл, не указывая, когда началось добавление.

Я адаптировал решение из ответа ZyX здесь и, попробовав некоторые вещи, обнаружил, что простой echo "foo\n" добавит foo и символ новой строки к &verbosefile:

let s:VerboseLS = ' **** V'.'E'.'RB'.'OSE LO'.'GG'.'ING S'.'TA'.'RTED ****'
let s:VerboseLE = ' **** V'.'E'.'RB'.'OSE LO'.'GG'.'ING E'.'ND'.'ED ****'
function! ToggleVerbose()
    let l:timestamp = strftime("%c")
    if !&verbose
      let l:msg = "\n\n" . l:timestamp . s:VerboseLS . "\n\n"
      set verbosefile=~/.vim/log/verbose.log
      set verbose=100
      echo l:msg
    else
      let l:msg = "\n" . l:timestamp . s:VerboseLE . "\n"
      echo l:msg
      set verbose=0
      set verbosefile=
    endif
endfunction
nnoremap <silent> <Leader>vl :call ToggleVerbose()<CR>

Теперь я получаю красивые баннеры в своем журнале:

Sun Feb 17 14:18:02 2013 **** VERBOSE LOGGING STARTED ****

...[snip]...

Sun Feb 17 14:18:08 2013 **** VERBOSE LOGGING ENDED ****

Я определил эти баннеры так, как я сделал, чтобы, если я получу этот файл скрипта, когда включена подробная регистрация, то, если я буду искать в журнале «VERBOSE LOGGING» или подобное, я не буду совпадать с ними.

Таким образом, вы можете адаптировать этот метод для использования reltime, если ваш vim has('reltime') для точности менее секунды, и, возможно, сделать оболочку синхронизации равной call, которая отображает время начала / окончания для вызовов функций (хотя вы ' пришлось бы выполнять рефакторинг, когда вы вызываете вещи в строке без команды call).

Ооо, у меня просто возникла идея ... Интересно, можно ли установить &verbosefile на именованный канал, который идет к util, который добавляет метки времени ... Давайте посмотрим ...

0 голосов
/ 16 октября 2011

Если --startuptime не соответствует вашим потребностям, вы можете использовать следующую команду:

vim --cmd 'profile start profile.log' \ 
    --cmd 'profile func *' \ 
    --cmd 'profile file *' \ 
    -c 'profile pause' \ 
    -c 'qa!'

(замените --cmd на -c и добавьте -c 'Command that causes slowdown', если проблема возникает не при запуске). Вы получите все время в profile.log. Таблица с временными интервалами функций будет присутствовать в конце файла, чтобы получить временные характеристики для каждого сценария, используйте следующее скрипт:

" Open profile.log file in vim first 
let timings=[] 
g/^SCRIPT/call add(timings, [getline('.')[len('SCRIPT  '):], matchstr(getline(line('.')+1), '^Sourced \zs\d\+')]+map(getline(line('.')+2, line('.')+3), 'matchstr(v:val, ''\d\+\.\d\+$'')')) 
enew 
call setline('.', ['count total (s)   self (s)  script']+map(copy(timings), 'printf("%5u %9s   %8s  %s", v:val[1], v:val[2], v:val[3], v:val[0])')) 

Откроется новый файл, содержащий ту же таблицу, что и в конце profile.log, но 1) для скриптов, а не для функций, 2) несортированные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...