unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: Stefan Monnier <monnier@iro.umontreal.ca>
To: sbaugh@catern.com
Cc: emacs-devel@gnu.org
Subject: Re: Eager garbage collection
Date: Mon, 16 Nov 2020 10:07:58 -0500	[thread overview]
Message-ID: <jwv5z65l5q8.fsf-monnier+emacs@gnu.org> (raw)
In-Reply-To: <87ft5akkjv.fsf@catern.com> (sbaugh@catern.com's message of "Sun,  15 Nov 2020 23:11:32 -0500")

> Does this kind of change seem plausible?

I'd be happy to include something like this yes.  Some comments below:

> +/* Like maybe_garbage_collect, but with the GC threshold halved as a
> +   way to GC eagerly.  The GC threshold will be reset on our next call
> +   to maybe_garbage_collect. */

I think the second sentence deserves to be expanded a bit, explaining
why it's OK not to restore the original values (why they'll be reset by
the next call to maybe_garbage_collect and why nothing bad will happen
until then).  Alternatively, we could also just explicitly call
`bump_consing_until_gc` in the else branch and skip the whole discussion.

> +void
> +maybe_garbage_collect_eagerly (void)
> +{
> +  if (bump_consing_until_gc (gc_cons_threshold/2, Vgc_cons_percentage) < 0)
> +    garbage_collect ();
> +}

If your Emacs session is moderately large, `gc_cons_threshold` will be
irrelevant and it'll be Vgc_cons_percentage which will determine the
gc_threshold.

How 'bout we replace

    if (bump_consing_until_gc (gc_cons_threshold/2, Vgc_cons_percentage) < 0)

with

    EMACS_INT since_gc = gc_threshold - consing_until_gc;
    if (since_gc > gc_threshold / N)

where N could be 2 like you had (tho I could see argument for making it
larger, e.g. some people may want to bump the normal threshold by say
5 and then use 10 here, so as to strongly bias Emacs to only ever run
the GC while idle).

>        /* If there is still no input available, ask for GC.  */
>        if (!detect_input_pending_run_timers (0))
> -	maybe_gc ();
> +	maybe_garbage_collect_eagerly ();
>      }

This will cause an eager GC right after Emacs goes idle, which can
happen while the user is actively typing.  I think it would be
preferable to run this from an idle timer to make sure that we run
during an actual pause of incoming events.  Your code effectively uses
an idle-time of 0, and I'm not sure what idle-time we should
use instead.

Admittedly, using an idle time of 0 means we start the GC right at the
beginning of the (potentially short) pause, which also makes it more
likely that we'll have finished GC before the next event comes in.


        Stefan




  reply	other threads:[~2020-11-16 15:07 UTC|newest]

Thread overview: 44+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2020-11-16  4:11 Eager garbage collection sbaugh
2020-11-16 15:07 ` Stefan Monnier [this message]
2020-11-16 16:34   ` Eli Zaretskii
2020-11-16 18:37     ` Stefan Monnier
2020-11-18 18:00     ` yyoncho
2020-11-18 18:16       ` Eli Zaretskii
2020-11-18 21:37         ` Stefan Monnier
2020-11-18 21:59           ` Stefan Monnier
     [not found] <Message-ID: <jwv1rgtjhhy.fsf-monnier+emacs@gnu.org>
2020-11-18  0:20 ` Spencer Baugh
2020-11-18  0:20   ` [PATCH 1/3] Add gc-estimated-time variable Spencer Baugh
2020-11-18 17:45     ` Eli Zaretskii
2020-11-18  0:20   ` [PATCH 2/3] Add garbage-collect-maybe function Spencer Baugh
2020-11-18 17:49     ` Eli Zaretskii
2020-11-18  0:20   ` [PATCH 3/3] Start opportunistic GC timer at startup Spencer Baugh
2020-11-18 17:54     ` Eli Zaretskii
2020-11-18  3:45   ` Eager garbage collection Stefan Monnier
2020-11-18  4:05     ` Spencer Baugh
2020-11-18  4:48       ` Stefan Monnier
2020-11-18  8:02   ` Andrea Corallo via Emacs development discussions.
2020-11-18 15:06     ` Eli Zaretskii
2020-11-18 15:30       ` Andrea Corallo via Emacs development discussions.
2020-11-18 17:19         ` Eli Zaretskii
2020-11-18 17:26           ` Andrea Corallo via Emacs development discussions.
2020-11-18 18:07             ` Eli Zaretskii
2020-11-18 18:19               ` Andrea Corallo via Emacs development discussions.
2020-11-18 15:19     ` Spencer Baugh
2020-11-18 15:47       ` Andrea Corallo via Emacs development discussions.
2020-11-18 16:52         ` Stefan Monnier
2020-11-18 17:12           ` Andrea Corallo via Emacs development discussions.
2020-11-18 17:34           ` Eli Zaretskii
2020-11-18 18:00   ` Eli Zaretskii
2020-11-22  5:07     ` Spencer Baugh
2020-11-22  5:08       ` [PATCH v2 1/3] Add gc-estimated-time variable Spencer Baugh
2020-11-22 18:10         ` Eli Zaretskii
2020-11-22 19:48           ` Stefan Monnier
2020-11-22  5:08       ` [PATCH v2 2/3] Add garbage-collect-maybe function Spencer Baugh
2020-11-22 18:14         ` Eli Zaretskii
2020-11-22  5:08       ` [PATCH v2 3/3] Start opportunistic GC timer at startup Spencer Baugh
2020-12-04 23:19         ` Stefan Monnier
2020-12-05  7:52           ` Eli Zaretskii
2020-12-05 13:55             ` Stefan Monnier
2020-12-05 14:24               ` Eli Zaretskii
2020-12-05 14:41                 ` Stefan Monnier
2020-11-22 15:13       ` Eager garbage collection Eli Zaretskii

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=jwv5z65l5q8.fsf-monnier+emacs@gnu.org \
    --to=monnier@iro.umontreal.ca \
    --cc=emacs-devel@gnu.org \
    --cc=sbaugh@catern.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).