Widzę bardzo zróżnicowaną wydajność w zależności od liczby nowych linii w pliku, który odwiedzam.
Oto przykład. Mam dwa pliki JSON:
$ wget https://github.com/Wilfred/ReVo-utilities/blob/a4bdc40dd2656c496defc461fc19c403c8306d9f/revo-export/dictionary.json?raw=true -O one_line.json
$ python -m json.tool <one_line.json >pretty_printed.json
Są to dwa pliki JSON o tej samej zawartości. one_line.json
wynosi 18 MB JSON bez żadnych nowych linii. pretty_printed.json
dodano nowe znaki i białe znaki, dzięki czemu wynosi 41 MB.
Jednak większy plik podzielony na wiele wierszy jest znacznie szybszy do otwarcia w Emacsie, zarówno w trybie Javascript, jak i trybie podstawowym.
Dlaczego Emacs ma tak niską wydajność z długimi liniami, skoro w rzeczywistości ma mniej bajtów? Czy mogę coś zrobić, aby poprawić wydajność bez formatowania danych poza Emacsem?
line-break
performance
Wilfred Hughes
źródło
źródło
View Large Files
(vlf) to niewielki tryb, którego celem jest pomoc w edycji dużych plików poprzez ładowanie ich w partiach . Oświadczenie: Nigdy go nie używałem i nie wiem, czy obsługuje on również długie linie w partiach .$ tail -f /some/file | fold -s
w buforze powłoki. To oczywiście nie jest dobre do edycji, ale bardzo pomaga w czytaniu.Odpowiedzi:
Obsługa długich linii przez Emacsa nie jest zbyt dobrze zoptymalizowana. W przypadku wielu operacji Emacs musi wielokrotnie skanować całą linię. Na przykład, aby wyświetlić linię, Emacs musi obliczyć wysokość linii, co wymaga zeskanowania całej linii w celu znalezienia najwyższego glifu. Ponadto skanowanie w celu wyświetlenia dwukierunkowego zużywa dużo czasu. Możesz uzyskać dodatkowe informacje, na przykład w dokumentacji
cache-long-line-scans
(zmienionejcache-long-scans
w 24.4).Można spróbować i sprawdzić, czy ustawienie
bidi-paragraph-direction
sięleft-to-right
poprawia szybkość dla ciebie [Settingbidi-display-reordering
donil
, robi mniej więcej to samo, ale jest przeznaczona tylko do użytku wewnętrznego / debugowania]. To usuwa jeden znaczący wkład w skanowanie linii, ale niestety nie jedyny.Najlepszą opcją jest dodanie nowych linii. Możesz potokować plik JSON, np. W
python -c 'import json, sys ; json.dump(json.load(sys.stdin), sys.stdout, indent=2)'
celu dodania nowych linii i ogólnej poprawy czytelności.źródło
(setq-default bidi-display-reordering nil)
- niektórzy użytkownicy mogą nie zdawać sobie sprawy, że jest to zmienna lokalna buforująca, która może wymagać ustawienia domyślnego w zakresie, w jakim użytkownik chce, aby była globalna. Chciałbym dodać to do moichinit.el
lat temu ... ale przynajmniej jest teraz. Dziękuję bardzo!!!bidi-display-reordering
: „Jeden komentarz, który mam, to to, że wyłączenie ponownego zamawiania wyświetlania BiDi… powoduje, że silnik wyświetlania jest w stanie, który nie jest testowany i może powodować niespójności a nawet błędy (ponieważ niektóre części kodu zostały napisane przy założeniu, że ta zmienna nigdy nie ma wartości zero). ”Zrobiłem z tym kilka krótkich eksperymentów, używając zminimalizowanej kopii jquery.
font-lock-mode
iflycheck-mode
oba przyczyniły się do spowolnienia, podobnie jakjs2-mode
iprettify-symbols-mode
.line-number-mode
icolumn-number-mode
miał niewielki efekt. Kiedyś wyłączyłem wszystkie różne tryby, chociaż wydajność była stosunkowo szybka. Użyj C-h mi zacznij wyłączać różne tryby, które są włączone, lub po prostu przełącz się nafundamental-mode
.Co ciekawe
hexl-mode
, mogłem bez problemu latać po pliku, choć oczywiście kolumny były dość krótkie. Niestetyvisual-line-mode
naprawdę spowolniło sytuację.Domyślam się, że tabela składniowa chętnie przestaje przetwarzać na końcach linii, a kiedy wszystko jest w jednym wierszu, musi ponownie wszystko analizować przy każdej aktualizacji.
źródło
Przesłałem http://www.emacswiki.org/emacs/OverLongLineMode
Ta biblioteka pozwala ustawić proste progi długości linii, powyżej których wariant
fundamental-mode
będzie używany dla pliku zamiast jego normalnego trybu (tylko dla trybów programowania).Potencjalnie coś podobnego można by domyślnie dodać do Emacsa, ale może to być tymczasowe obejście podstawowego problemu spowolnienia Emacsa podczas indeksowania po napotkaniu takiego pliku.
nb Jest to ulepszenie w stosunku do kodu, który pierwotnie opublikowałem w tej odpowiedzi, ale nadal jest w toku. Testowanie było minimalne. Komentarze są mile widziane.
Mile widziane są również sugestie dotyczące innych (poza
css-mode
)prog-mode
nieobsługiwanych głównych trybów domyślnej obsługi.źródło
so-long.el
aktywnym otworzył plik w niecałe 2 sekundy. W rzeczywistości edycja pliku jest nadal bardzo problematyczna (np. Próba przejścia do „następnej linii” zajmie bardzo dużo czasu), ale przywraca to moją wiarę w przydatność napisanej przeze mnie biblioteki, więc powinienem wznowić swoje plany dodaj go do GNU ELPA ...so-long.el
(z licznymi ulepszeniami) jest zawarta w aktualnych wersjach rozwojowych Emacsa 27 i będzie dostępna (dla wcześniejszych wersji Emacsa) za pośrednictwem GNU ELPA w najbliższej przyszłości.Oczekuję, że zauważysz, że różnica wynika z
font-lock
. Kiedy czcionkowanie ma zostać wykonane na podzbiorze pliku widocznym w oknie, następuje najpierw rozszerzenie obszaru czcionkowania, aby zawierał pełne jednostki semantyczne. Zobaczfont-lock-extend-region-functions
kod tego. Często obejmuje to rozszerzenie regionu o pełne linie. Gdy linie są bardzo długie, może to prowadzić do wykonania czcionek na znacznie większej części zawartości, niż jest to w rzeczywistości widoczne.Ponadto, gdy same znaki nowej linii mają informacje semantyczne, ich brak może czasami oznaczać, że wzory wyrażeń regularnych dla blokowania czcionek muszą skanować dalej, aby ustalić, czy pasują do siebie, czy nie.
źródło
Zazwyczaj rozwijam długie linie i wciskam według znaczników (takich jak HTML, XML, JSON).
Aby umożliwić taką operację, dodaję:
Podzielić przez linię regex, XML IT:
C-M-% >< RET >NL< RET !
.Po tym jak Emacs podzieli długie linie - możliwe jest włączenie wielu
*-modes
i ponowne wcięcie kodu.Uwaga: jak zapobiegać spowolnieniu, gdy gorsze procesy generują długie linie?
źródło
Stworzyłem własne rozwiązanie tego problemu tutaj: https://github.com/rakete/too-long-lines-mode
Nie byłem zadowolony z rozwiązania phils, które przełącza bufor z bardzo długimi liniami na tryb podstawowy, chciałem rozwiązania, które pozwoli mi zachować podświetlanie składni i inne funkcje trybu głównego. Więc stworzyłem tryb pomocniczy, który używa nakładek, aby ukryć większość znaków zbyt długich linii.
To rozwiązuje problem i sprawia, że emacs jest użyteczny nawet w buforach z bardzo długimi liniami, bez konieczności powrotu do trybu podstawowego.
źródło
W mojej konfiguracji Emacsa mam tryb z niestandardową czcionką, tj. Gdzie ustawiłem
font-lock-defaults
. Pojedyncza strona w dół zajęłaby 30 sekund, aby wyświetlić część 30000 linii znaków. To spowolnienie zostało naprawione przez ograniczenie cofania śledzenia wyrażeń regularnych. Zamiast:Zrób to
źródło
font-lock-defaults
ani wyrażenia regularnego.W moich buforach w trybie powłoki (powłoka Mx), próbuję
sed -r 's/(.{2000}).*/\1/' -u
unikać długich linii.źródło
Używam następującej funkcji do otwierania w
dired-mode
dużych plikach z długimi liniami:źródło
Oto obejście, zaczerpnięte z emacs-devel :
źródło
longlines-mode
oznaczono jako przestarzałevisual-line-mode
.visual-line-mode
nie pomaga w omawianym problemie, podczas gdylonglines-mode
robi. Z tego powodu oczekuję, że longlines.el zostanie przywrócony do stanu nieaktualnego.