From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED!not-for-mail From: Eli Zaretskii Newsgroups: gmane.emacs.bugs Subject: bug#21028: Performance regression in revision af1a69f4d17a482c359d98c00ef86fac835b5fac (Apr 2014). Date: Wed, 15 Mar 2017 17:36:12 +0200 Message-ID: <831styblhv.fsf@gnu.org> References: <559F9FAF.8090708@live.com> <83oa095eaw.fsf@gnu.org> <83lgvd581m.fsf@gnu.org> <83a8br6hq0.fsf@gnu.org> <672a0c69-4352-735f-cba4-025e642626ea@gmail.com> <83vauf50wb.fsf@gnu.org> <7408d59c-92ba-b879-5ac1-3cd5eee9b4db@gmail.com> <83tw9z4zzp.fsf@gnu.org> <2cad0da9-c931-b547-07bb-efec2f2bcf1f@gmail.com> <83h95w0w3p.fsf@gnu.org> <27853273-e6d8-077e-b9e0-b2bec2fe1fae@gmail.com> <834m1v2630.fsf@gnu.org> <1c224dc1-bd71-a910-b7cf-00313e4aec40@live.com> <83efy2cx5n.fsf@gnu.org> <3c3e8384-3412-f5a5-3ab2-a7eb4e699f1c@live.com> <83d1dmcrnl.fsf@gnu.org> <39fe847e-ef8a-149f-4478-d02e7c794c9a@live.com> <837f3tch7y.fsf@gnu.org> <1e7bc066-3f29-3897-5039-de7233efc58a@live.com> <83y3w9ay6y.fsf@gnu.org> <16f9db27-dd0f-ddaf-2f34-45b9fd4e69c6@live.com> <83k27rc15x.fsf@gnu.org> <79f4e3ce-6284-8fc5-fd8f-9f0c9cebe873@live.com> Reply-To: Eli Zaretskii NNTP-Posting-Host: blaine.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Trace: blaine.gmane.org 1489592253 31988 195.159.176.226 (15 Mar 2017 15:37:33 GMT) X-Complaints-To: usenet@blaine.gmane.org NNTP-Posting-Date: Wed, 15 Mar 2017 15:37:33 +0000 (UTC) Cc: 21028@debbugs.gnu.org To: =?UTF-8?Q?Cl=C3=A9ment?= Pit--Claudel Original-X-From: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Wed Mar 15 16:37:26 2017 Return-path: Envelope-to: geb-bug-gnu-emacs@m.gmane.org Original-Received: from lists.gnu.org ([208.118.235.17]) by blaine.gmane.org with esmtp (Exim 4.84_2) (envelope-from ) id 1coAzA-0006Cc-VQ for geb-bug-gnu-emacs@m.gmane.org; Wed, 15 Mar 2017 16:37:13 +0100 Original-Received: from localhost ([::1]:38047 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1coAzD-0003TM-Vg for geb-bug-gnu-emacs@m.gmane.org; Wed, 15 Mar 2017 11:37:16 -0400 Original-Received: from eggs.gnu.org ([2001:4830:134:3::10]:34143) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1coAz3-0003Su-Vv for bug-gnu-emacs@gnu.org; Wed, 15 Mar 2017 11:37:07 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1coAz0-0001fL-0V for bug-gnu-emacs@gnu.org; Wed, 15 Mar 2017 11:37:06 -0400 Original-Received: from debbugs.gnu.org ([208.118.235.43]:59142) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1coAyz-0001fF-T9 for bug-gnu-emacs@gnu.org; Wed, 15 Mar 2017 11:37:01 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1coAyz-0006yR-NG for bug-gnu-emacs@gnu.org; Wed, 15 Mar 2017 11:37:01 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Eli Zaretskii Original-Sender: "Debbugs-submit" Resent-CC: bug-gnu-emacs@gnu.org Resent-Date: Wed, 15 Mar 2017 15:37:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: followup 21028 X-GNU-PR-Package: emacs X-GNU-PR-Keywords: Original-Received: via spool by 21028-submit@debbugs.gnu.org id=B21028.148959221226790 (code B ref 21028); Wed, 15 Mar 2017 15:37:01 +0000 Original-Received: (at 21028) by debbugs.gnu.org; 15 Mar 2017 15:36:52 +0000 Original-Received: from localhost ([127.0.0.1]:57341 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1coAyq-0006y2-Dv for submit@debbugs.gnu.org; Wed, 15 Mar 2017 11:36:52 -0400 Original-Received: from eggs.gnu.org ([208.118.235.92]:43072) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1coAyo-0006xo-Rg for 21028@debbugs.gnu.org; Wed, 15 Mar 2017 11:36:51 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1coAyf-0001a7-R3 for 21028@debbugs.gnu.org; Wed, 15 Mar 2017 11:36:45 -0400 Original-Received: from fencepost.gnu.org ([2001:4830:134:3::e]:57346) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1coAyf-0001a3-N6; Wed, 15 Mar 2017 11:36:41 -0400 Original-Received: from 84.94.185.246.cable.012.net.il ([84.94.185.246]:1237 helo=home-c4e4a596f7) by fencepost.gnu.org with esmtpsa (TLS1.2:RSA_AES_256_CBC_SHA1:256) (Exim 4.82) (envelope-from ) id 1coAye-00085l-US; Wed, 15 Mar 2017 11:36:41 -0400 In-reply-to: <79f4e3ce-6284-8fc5-fd8f-9f0c9cebe873@live.com> (message from =?UTF-8?Q?Cl=C3=A9ment?= Pit--Claudel on Tue, 14 Mar 2017 15:35:01 -0400) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 208.118.235.43 X-BeenThere: bug-gnu-emacs@gnu.org List-Id: "Bug reports for GNU Emacs, the Swiss army knife of text editors" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnu-emacs-bounces+geb-bug-gnu-emacs=m.gmane.org@gnu.org Original-Sender: "bug-gnu-emacs" Xref: news.gmane.org gmane.emacs.bugs:130613 Archived-At: > Cc: 21028@debbugs.gnu.org > From: Clément Pit--Claudel > Date: Tue, 14 Mar 2017 15:35:01 -0400 > > > I checked: all the fonts you use as the default -- Noto Sans, Fira > > Sans, Ubuntu Mono -- all of them basically support only Latin, > > Greek, and Cyrillic blocks, and very little else. By contrast, the > > above fontset specification claims that they support the entire > > Unicode range of characters, which causes Emacs waste cycles trying > > to use these fonts for display of characters they don't support. > > Is there a way to tell Emacs to use them for everything they support? The problem here is that opening a font and looking up a character is very expensive, certainly when there are hundreds of fonts installed. So Emacs filters the fonts according to the scripts they claim to support, and only opens those which appear to be valid candidates for the script of the character it needs to display. By using 'unicode as the script when you set up your fontset, you actually trip Emacs by telling it to try this font for every character it needs to display. You should instead specify the scripts which the fonts supports well. And for the default font (i.e. the font of the default face) I think you don't have to put it into the fontset at all, just specify it as the default font (via default-frame-alist, for example). > For example, Ubuntu Mono supports box-drawing characters (so I could > add that range), but it also supports U+2202 "partial diff", U+2206 > "Delta", U+2211 "summation", and U+222B "integral", and a few other > symbols (≠, ≤, …). That shouldn't be a problem in Emacs 25: it by default uses the default face's font for any punctuation and symbol characters for which the font has glyphs, even if the fontset specifies a different font for punctuation and symbol blocks. > > In addition, the font-spec doesn't specify the registry of the > > fonts, leaving that to the default, which IME is inadequate. So > > please try the following, and see if you get any significant > > speedup: > > I do :) See timings below: > > # With your patch > $ time master/src/emacs -Q --eval "(progn (set-fontset-font \"fontset-default\" > 'latin '(\"Noto Sans\" . \"iso10646-1\") nil) (set-fontset-font > \"fontset-default\" 'unicode '(\"Symbola\" . \"iso10646-1\") nil 'append) > (dotimes (_ 5000) (insert (make-string 20 8658) \"\n\")) (goto-char > (point-min)) (sit-for 0) (condition-case nil (while t (scroll-up) (sit-for 0)) > (error nil)) (run-with-idle-timer 0 nil #'kill-emacs))" > real 0m0.532s > user 0m0.404s > sys 0m0.024s > > # Without your patch > $ time 25.1/src/emacs -Q --eval "(progn (set-fontset-font \"fontset-default\" > 'latin '(\"Noto Sans\" . \"iso10646-1\") nil) (set-fontset-font > \"fontset-default\" 'unicode '(\"Symbola\" . \"iso10646-1\") nil 'append) > (dotimes (_ 5000) (insert (make-string 20 8658) \"\n\")) (goto-char > (point-min)) (sit-for 0) (condition-case nil (while t (scroll-up) (sit-for 0)) > (error nil)) (run-with-idle-timer 0 nil #'kill-emacs))" > real 0m0.577s > user 0m0.392s > sys 0m0.020s So using more accurate scripts gives a major improvement. Good. > For me specifying the registry doesn't seem to do anything That could sometimes be the case, but I have found that in some cases omitting the registry for characters beyond Latin-1 can be a major setback. So I recommend to always use it. > The following uses *Ubuntu Mono* (?!) and XITS Math, and is very slow I'm guessing that Ubuntu Mono is your system's default font which Emacs picks up. The fontset-default specifies fallbacks, it doesn't affect the default font. I'm not sure what exactly do you want to happen, because I don't understand why you need 2 monospaced fonts in your setup. So I cannot yet suggest how to set your fonts for them to do what you want. But see below for some proposals. > The following uses Noto Sans and XITS Math, and is very fast: > $ time 25.1/src/emacs -Q --eval "(progn (set-fontset-font \"fontset-startup\" > 'latin \"Noto Sans\" nil) (set-fontset-font \"fontset-startup\" 'unicode \"XITS > Math\" nil 'append) (dotimes (_ 5000) (insert (make-string 20 8658) \"\n\")) > (goto-char (point-min)) (sit-for 0) (condition-case nil (while t (scroll-up) > (sit-for 0)) (error nil)) (run-with-idle-timer 0 nil #'kill-emacs))" > I'm a bit confused, though: the restriction to latin still allows Emacs to use > Noto Sans for characters like "⅔", "≠", and "√"? See above: that's a feature of Emacs 25 -- it by default uses the default face's font for punctuation and symbol characters. You can use use-default-font-for-symbols, new in Emacs 25.2, to disable this feature and go by the fontsets instead, but I believe the default produces better results in most cases. > > (set-fontset-font fontset 'unicode base-spec nil) > > > > This should only specify 'latin, 'greek, and 'cyrillic (one such > > line for each of them), as 'unicode is a blatant lie. > > But I want more than 'latin, 'greek, and 'cyrillic: I want "any character that > this font supports". Given that symbols and punctuation characters already use that font, why do you need more than that, and in what Unicode blocks? You can use a font utility, such as Fontforge, to see which blocks the font supports, and how many characters from each block it can display. My conclusion from looking at Ubuntu Mono is that the above 3 scripts are the only ones it supports well; the rest are not covered well at all. You can, of course, add more scripts if you need them, but the downside will be that some of those scripts will be displayed by a mix of more than one font, which I think will make the display ugly. Moreover, Emacs cannot compose glyphs that come from different fonts, so you will sometimes see decomposed display if you request a font for scripts where its support is incomplete. I think this is an important factor for users of prettify-symbols-mode in particular. > > (set-fontset-font fontset 'unicode emoji-spec nil 'append) > > > > It is better o have a definitive list of codepoint ranges here, > > since again 'unicode is not what you want. Once you have the ranges, > > you can use 'prepend, which will speed up things a bit more, because > > Emacs won't need to go through all the fonts you don't want to see. > > Possibly — but this will break next time the font is updated with more Emoji, > right? Not necessarily: you could specify the full range of codepoints from the Emoji block, even if some of them are not yet available. > > (set-fontset-font fontset 'unicode fallback-spec nil 'append) > > > > This you shouldn't need doing, as Symbola is already in the default > > fontset, and set up according to the characters where it shines. > > I used a variant of Symbola, not Symbola itself. Then set it up by copying the default setup from fontset.el, as that setup is based on a lot of thought and careful testing on several systems. > > One more comment: any reasons why you set this up for all the > > fontsets, not just for fontset-default? AFAIU, doing these changes > > in all of the fonts might slow down things even more, for no good > > reason, because fontset-default is the fallback for all the other > > fontsets anyway, so anything you set up in it will be in effect for > > any other fontset. > > I'm not sure I understand. Are you saying that e.g. running the following > should show display a *scratch* buffer in Noto Sans? > > $ 25.1/src/emacs -Q --eval "(set-fontset-font \"fontset-default\" 'latin \"Noto > Sans\" nil)" No, I'm saying that you have no reason to repeat the fallback fonts in any fontset but fontset-default. The default font should be customized differently, not through fontsets. > It doesn't for me. I need to set fontset-startup instead. That's again because you use fontsets for the default face's font. You should instead use default-frame-alist for that, and leave fontsets only for when a character might be unavailable in the default font. > > Can you ask some of those people to show their fontset setup? I'd > > like to know how different they are from your setup. > > They essentially use this: > (dolist (ft (fontset-list)) > (set-fontset-font ft 'unicode (font-spec :name "YOUR-USUAL-FONT")) > (set-fontset-font ft 'unicode (font-spec :name "Symbola") nil 'append)) Well, maybe with the new insights you have now, you can recommend them better setups which don't use 'unicode'.