Я использую полночь Commander с Cygwin 64 бит на Windows 10 64 бит.
После перехода на новую машину и чистой переустановки Windows и Cygwin мой полуночный командир время от времени начинал очень тормозить. Перезапуск помогает, но это случается слишком часто, чтобы это было жизнеспособным решением. (перезапуск не помогает).
Я понятия не имею, что может быть причиной этих икоты. MC нормально работает: нажатия на стрелки работают хорошо, просмотр и редактирование выполняются мгновенно, но одна вещь занимает до 10 секунд - смена каталогов. Поиск в файлах имеет аналогичную задержку, но только один раз (то есть не в каждом chdir
он мог бы сделать). В не-mc Cygwin эта проблема не возникает.
Диспетчер задач не показывает ненормально высокую загрузку ЦП или памяти ни в одном процессе. У меня запущен cygserver
, я использую bash
качестве оболочки и у меня нет необычных настроек PS1
, мой $CYGWIN
- это только winsymlinks:native
.
Вот strace
лог, может, у кого-то есть идея, что пошло не так?
http://pastebin.pl/view/9b839815
(записано с LOCALE=C strace -q -o /tmp/mc-log mc /tmp
)
В записанном сеансе у меня есть:
- запустил mc в каталоге
/tmp
- введен
/tmp/NVIDIA Corporation
каталог корпорации NVIDIA - вернулся (
..
) - поступил в каталог
/tmp/mc-chanibal
- вернулся (
..
) - выход с F10
Дополнительная информация о времени:
Поиск всех каталогов в моем $HOME
занимает 4,6 секунды:
$ time find ~ -type d | wc -l
(snipped two directories without permissions)
19919
real 0m4.626s
user 0m0.796s
sys 0m3.765s
Проверка всех этих каталогов на ls -al
заняла много времени, но в среднем была довольно низкой:
time (find ~ -type d | while read f; do { time ls -al $f; } \
|& awk '$1 == "real" { printf $2 }' \
| awk -Fm '{printf( "%2.4f", $1 * 60 + $2 )}'; \
echo -e "\t$f"; done \
) >/tmp/ls-time-log ;
(snipped two dirs without permissions)
real 12m21.870s
user 7m4.576s
sys 16m34.446s
Среднее время выполнения ls -al
-al составляет 0,020 с, минимальное значение 0,017, максимальное значение 0,154:
$ awk 'BEGIN { sum=0; min=9999; max=0; minf=""; maxf=""; } \
$1 { sum += $1; \
if(min > $1) { min = $1; minf = $2; }; \
if(max < $1) { max = $1; maxf = $2; } } \
END { print "avg: " sum/NR; print "min: " min " " \
minf; print "max: " max " " maxf }' </tmp/ls-time-log
avg: 0.0204292
min: 0.0170 /cygdrive/c/Users/chanibal/AppData/Roaming/OculusClient/Local
max: 0.1540 /cygdrive/c/Users/chanibal/AppData/Local/Android/sdk/platforms/android-23/data/res/drawable-hdpi
Затраты времени на измерение составляют в среднем 16 м34 с /19919 = 0,499 с за вызов ls -al
, два awk
с и итерацию find
. Не очень хорошо, но не четыре секунды.
Нормализация с помощью cygpath
не займет много времени:
$ time strace cygpath -aw /tmp/NVIDIA\ Corporation/ | grep normalize_posix_path
116 11175 [main] cygpath 3524 normalize_posix_path: src /tmp/NVIDIA Corporation/
20 11195 [main] cygpath 3524 normalize_posix_path: /tmp/NVIDIA Corporation/ = normalize_posix_path (/tmp/NVIDIA Corporation/)
real 0m0.034s
user 0m0.015s
sys 0m0.000s
РЕДАКТИРОВАТЬ: Добавлен этот вопрос в трассировку MC