Apakah ada kerugian untuk mengatur `gc-cons-threshold` sangat tinggi dan mengumpulkan sampah saat idle?


17

Saya menambahkan dua baris berikut ke atas init.el:

(setq gc-cons-threshold (eval-when-compile (* 1024 1024 1024)))
(run-with-idle-timer 2 t (lambda () (garbage-collect)))

Itu berarti bahwa alih-alih mengumpulkan sampah setiap 800kb memori yang dialokasikan, Emacs melakukannya saat idle, yaitu ketika jeda tidak mengganggu saya. (Ini juga mengumpulkan setelah mengalokasikan 1GB memori, tapi saya tidak berpikir itu akan terjadi).

Ini meningkatkan waktu startup saya sekitar dua pertiga. Secara teori, itu juga harus meningkatkan kinerja secara umum. Apakah ada kelemahan dari pendekatan ini?


1
Pada prinsipnya Anda tidak boleh menetapkan gc-cons-thresholdlebih tinggi dari yang Anda inginkan untuk memukul pada waktu tertentu, karena Anda harus mengasumsikan bahwa Anda benar-benar akan mencapai nilai itu dari waktu ke waktu (setelah semua, siapa yang tahu berapa banyak sampah yang mungkin timbul oleh beberapa tugas non-idle yang tidak terduga - antusias). Saya tidak melihat masalah tertentu dengan memicu gc dengan timer idle, tapi saya pikir menetapkan ambang batas untuk gc non-idle setinggi ini tampaknya OTT, dan kesan saya adalah bahwa nilai itu mungkin dipilih sebagai "lebih tinggi daripada saya akan membutuhkan "daripada" yang tertinggi yang bersedia saya gunakan ".
phils

5
Menurut posting oleh Stefan Monnier : "Lebih baik tidak menyentuhnya. Dalam Emacs-22 kami memperkenalkan gc-cons-persentase yang memberikan manfaat yang sama dengan meningkatkan ambang gc-cons tetapi tanpa kekurangan. Dan tanpa harus bermain-main dengannya. Yaitu saya akan merekomendasikan pengguna untuk menghapus pengaturan gc-cons-threshold dari .emacs mereka. "
izkon

1
@izkon, kecuali bahwa pos yang Anda tautkan ke tanggal kembali ke 2007, sementara misalnya posting ini , di mana seseorang benar-benar telah bereksperimen - dan mengubah ambang batas membuat perbedaan - tanggal kembali ke 2016. Jadi apakah mengalami kemunduran, atau solusinya tidak pernah bekerja dengan baik.
Hi-Angel

1
@ Erik, saya pikir Anda bisa mengganti (eval-when-compile (* 1024 1024 1024))dengan most-positive-fixnum (tolong lakukan, saya cukup yakin semua orang yang menemukan pertanyaan Anda menyalin kode Anda ke konfigurasi mereka) .
Hi-Angel

2
@ Hai-Malaikat Saya tidak berpikir itu ide yang bagus. Jika Emacs benar-benar mengalokasikan sejumlah besar memori tanpa menjadi menganggur, itu harus gc bukannya terus mengalokasikan sampai sistem harus bertukar atau bahkan kehabisan memori seluruhnya. Jika ada, 1GB sudah terlalu tinggi.
Erik

Jawaban:


4

Sejauh yang saya tahu, jika Anda memiliki RAM, tidak apa-apa, tetapi jika Emacs pernah mencapai penggunaan yang sangat tinggi sebelum GC'ing, mungkin butuh waktu lama. Saya tidak yakin persis apa yang dimaksud Eli; ISTM bahwa jika Anda memiliki memori yang cukup, itu akan baik-baik saja, tetapi dia ahli di sini.

Karena itu, saya telah menggunakan baris ini di file init saya untuk sementara waktu sekarang, dan ini membantu mengurangi waktu startup tanpa membuat perubahan permanen:

;;;;; Startup optimizations

;;;;;; Set garbage collection threshold

;; From https://www.reddit.com/r/emacs/comments/3kqt6e/2_easy_little_known_steps_to_speed_up_emacs_start/

(setq gc-cons-threshold-original gc-cons-threshold)
(setq gc-cons-threshold (* 1024 1024 100))

;;;;;; Set file-name-handler-alist

;; Also from https://www.reddit.com/r/emacs/comments/3kqt6e/2_easy_little_known_steps_to_speed_up_emacs_start/

(setq file-name-handler-alist-original file-name-handler-alist)
(setq file-name-handler-alist nil)

;;;;;; Set deferred timer to reset them

(run-with-idle-timer
 5 nil
 (lambda ()
   (setq gc-cons-threshold gc-cons-threshold-original)
   (setq file-name-handler-alist file-name-handler-alist-original)
   (makunbound 'gc-cons-threshold-original)
   (makunbound 'file-name-handler-alist-original)
   (message "gc-cons-threshold and file-name-handler-alist restored")))

Kenapa tidak kamu gunakan after-init-hook?
Erik

3
Karena itu akan berjalan segera setelah inisialisasi, yang mungkin membuat pengguna menunggu GC. Dengan menggunakan timer idle, ini dapat berjalan ketika pengguna tidak menggunakan Emacs.
blujay
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.