Saya melihat kinerja sangat bervariasi tergantung pada berapa banyak baris baru di file yang saya kunjungi.
Ini sebuah contoh. Saya punya dua file 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
Ini adalah dua file JSON dengan konten yang sama. one_line.json
adalah 18MiB dari JSON tanpa baris baru. pretty_printed.json
memiliki baris baru dan spasi putih ditambahkan, menjadikannya 41MiB.
Namun, pemisahan file yang lebih besar pada banyak baris jauh lebih cepat untuk dibuka di Emacs, baik dalam mode Javascript dan mode Fundamental.
Mengapa Emacs memiliki kinerja yang buruk dengan garis yang panjang, karena itu sebenarnya lebih sedikit byte? Adakah yang bisa saya lakukan untuk meningkatkan kinerja tanpa memformat ulang data di luar Emacs?
line-break
performance
Wilfred Hughes
sumber
sumber
View Large Files
(vlf) adalah mode minor yang bertujuan untuk membantu mengedit file besar dengan memuatnya dalam batch . Disclaimer: Saya tidak pernah pakai itu dan saya tidak tahu apakah itu menangani antrean panjang di batch juga.$ tail -f /some/file | fold -s
di buffer shell. Jelas ini tidak baik untuk diedit, tetapi banyak membantu dalam membaca.Jawaban:
Penanganan garis panjang Emacs tidak dioptimalkan dengan baik. Untuk sejumlah operasi, Emacs harus memindai seluruh baris berulang kali. Misalnya, untuk menampilkan garis, Emacs harus mencari tahu ketinggian garis, yang mengharuskan pemindaian seluruh garis untuk menemukan mesin terbang tertinggi. Selain itu, pemindaian untuk tampilan dua arah memakan banyak waktu. Anda bisa mendapatkan beberapa informasi tambahan di, misalnya, dokumentasi dari
cache-long-line-scans
(berganti nama menjadicache-long-scans
24.4).Anda dapat mencoba dan melihat apakah pengaturan
bidi-paragraph-direction
untukleft-to-right
meningkatkan kecepatan untuk Anda [pengaturanbidi-display-reordering
untuknil
, tidak lebih atau kurang sama tetapi hanya dimaksudkan untuk tujuan / debugging internal yang]. Ini menghapus satu kontributor signifikan untuk pemindaian garis, tetapi sayangnya bukan satu-satunya.Opsi terbaik adalah menambahkan baris baru. Anda dapat mengirim file JSON melalui mis.
python -c 'import json, sys ; json.dump(json.load(sys.stdin), sys.stdout, indent=2)'
Untuk menambahkan baris baru dan meningkatkan keterbacaan secara umum.sumber
(setq-default bidi-display-reordering nil)
- beberapa pengguna mungkin tidak menyadari bahwa ini adalah variabel penyangga-lokal, yang mungkin memerlukan pengaturan default sejauh yang diinginkan pengguna sebagai global. Saya berharap saya akan menambahkan itu keinit.el
tahun - tahun yang lalu ... tapi setidaknya itu ada di sana sekarang. Terima kasih banyak!!!bidi-display-reordering
: "Satu komentar yang saya miliki adalah bahwa menonaktifkan bidi-display-reordering ... menempatkan mesin display dalam keadaan yang tidak diuji, dan dapat menyebabkan ketidakkonsistenan. dan bahkan bug (karena beberapa bagian dari kode ditulis dengan asumsi bahwa variabel ini tidak pernah nol). "Saya melakukan beberapa percobaan singkat dengan ini menggunakan salinan jquery yang diperkecil.
font-lock-mode
danflycheck-mode
keduanya berkontribusi terhadap kelambatan, seperti yang terjadijs2-mode
, danprettify-symbols-mode
.line-number-mode
dancolumn-number-mode
memiliki efek kecil. Pernah saya mematikan semua mode yang berbeda meskipun kinerjanya relatif tajam. Gunakan C-h mdan mulai nonaktifkan berbagai mode yang diaktifkan, atau coba alihkan sajafundamental-mode
.Menariknya menggunakan
hexl-mode
saya bisa terbang melalui file tanpa masalah, meskipun kolom jelas cukup pendek. Sayangnya semuanyavisual-line-mode
sangat melambat.Dugaan saya adalah bahwa tabel sintaks senang berhenti memproses di akhir baris, dan ketika itu semua pada satu baris itu harus mem-reparsing semuanya pada setiap pembaruan.
sumber
Saya telah mengunggah http://www.emacswiki.org/emacs/OverLongLineMode
Pustaka ini memungkinkan Anda untuk menetapkan ambang batas panjang garis sederhana di mana varian
fundamental-mode
akan digunakan untuk file alih-alih mode normal (hanya untuk mode pemrograman).Secara potensial sesuatu di sepanjang garis ini dapat ditambahkan ke Emacs secara default, tetapi ini bisa menjadi solusi sementara untuk masalah utama Emacs yang lambat hingga merangkak saat menemukan file seperti itu.
nb Ini merupakan peningkatan pada kode yang awalnya saya posting dalam jawaban ini, tetapi masih dalam proses. Pengujian sudah minimal. Komentar disambut.
Saran untuk mode utama lain (selain
css-mode
) yang diprog-mode
terima untuk mendukung secara default juga diterima.sumber
so-long.el
aktif membuka file dalam waktu kurang dari 2 detik. Sebenarnya mengedit file masih sangat bermasalah (misalnya mencoba pindah ke 'baris berikutnya' akan memakan waktu yang sangat lama), tetapi bagaimanapun ini mengembalikan kepercayaan saya pada kegunaan perpustakaan yang saya tulis, jadi saya harus melanjutkan rencana saya untuk tambahkan ke GNU ELPA ...so-long.el
(dengan berbagai peningkatan) dimasukkan dalam versi pengembangan Emacs 27 saat ini, dan akan tersedia (untuk versi Emacs sebelumnya) melalui GNU ELPA suatu saat dalam waktu dekat.Saya berharap Anda akan menemukan bahwa perbedaannya adalah karena
font-lock
. Ketika fontification akan dilakukan pada subset dari file yang terlihat di jendela, itu melanjutkan dengan terlebih dahulu memperluas wilayah fontification sehingga akan mencakup unit semantik penuh. Lihatfont-lock-extend-region-functions
kode untuk ini. Ini umum untuk ini termasuk memperluas wilayah untuk memasukkan garis penuh. Ketika garis sangat panjang, ini dapat menyebabkan fontifikasi dilakukan di banyak konten yang jauh lebih besar daripada yang sebenarnya terlihat.Selain itu, ketika baris baru sendiri memiliki informasi semantik, ketidakhadiran mereka kadang-kadang dapat berarti bahwa pola regexp untuk kunci font harus memindai lebih lanjut untuk menentukan apakah mereka cocok atau tidak.
sumber
Saya biasanya membuka gulungan antrean panjang dan lekukan oleh tag (seperti HTML, XML, JSON).
Untuk memungkinkan operasi seperti itu saya tambahkan:
Saya membagi line dengan regex, untuk XML itu:
C-M-% >< RET >NL< RET !
.Setelah Emacs memecah garis panjang - dimungkinkan untuk mengaktifkan banyak
*-modes
kode dan indentasi ulang.Sebagai catatan: Bagaimana mencegah perlambatan ketika proses yang lebih rendah menghasilkan garis panjang?
sumber
Saya membuat solusi sendiri untuk masalah ini di sini: https://github.com/rakete/too-long-lines-mode
Saya tidak puas dengan solusi phils yang mengganti buffer dengan garis yang sangat panjang ke mode-fundamental, saya menginginkan solusi yang memungkinkan saya menjaga penyorotan sintaks dan fitur mode utama lainnya. Jadi saya membuat mode minor yang menggunakan overlay untuk menyembunyikan sebagian besar karakter dari garis yang terlalu panjang.
Itu mengatasi masalah dan membuat emacs dapat digunakan bahkan dalam buffer dengan garis yang sangat panjang, tanpa harus kembali ke mode fundamental.
sumber
Dalam pengaturan Emacs saya, saya memiliki mode dengan fontifikasi khusus, yaitu tempat saya mengatur
font-lock-defaults
. Satu halaman ke bawah akan menggunakan 30 detik untuk menampilkan bagian dari 30000 baris karakter. Perlambatan ini diperbaiki dengan mengurangi backtracking regexp. Dari pada:melakukan hal ini
sumber
font-lock-defaults
atau pencocokan regexp.Dalam buffer mode shell saya (Mx shell), saya menemukan diri saya
sed -r 's/(.{2000}).*/\1/' -u
untuk menghindari garis panjang.sumber
Saya menggunakan fungsi berikut untuk membuka
dired-mode
file besar dengan garis panjang:sumber
Berikut ini solusinya, yang diambil dari emacs-devel :
sumber
longlines-mode
ditandai sebagai usang olehvisual-line-mode
.visual-line-mode
tidak membantu dengan masalah yang dipermasalahkan, sedangkan yanglonglines-mode
dilakukan. Untuk alasan ini, saya berharap bahwa longlines.el akan dikembalikan ke status yang tidak usang.