From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Michael Heerdegen via "Emacs development discussions." Newsgroups: gmane.emacs.devel Subject: Re: master 4b79c80c999 1/2: New function 'sort-on' Date: Tue, 05 Mar 2024 11:21:50 +0100 Message-ID: <87frx5q8qp.fsf@web.de> References: <170688047526.14693.2994051491358257471@vcs2.savannah.gnu.org> <20240202132756.4272CC0EFE7@vcs2.savannah.gnu.org> <87cytej4hy.fsf@daniel-mendler.de> <86zfwi52m1.fsf@gnu.org> <87plxe28as.fsf@web.de> <86wmrm50i5.fsf@gnu.org> <3ff9d4cf-7b4f-4924-8663-3f43625760bf@gutov.dev> <87zfvldokn.fsf@web.de> <8b31204f-4e8c-4c56-bbc7-73c9bfabb651@gutov.dev> <87edcq8pgm.fsf@web.de> <6df7bc2e-4fc4-4ed8-8dfe-9b3b74c6ae8a@gutov.dev> <8734t5hzl2.fsf@web.de> Reply-To: Michael Heerdegen Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="30297"; mail-complaints-to="usenet@ciao.gmane.io" User-Agent: Gnus/5.13 (Gnus v5.13) To: emacs-devel@gnu.org Cancel-Lock: sha1:DHdW8wgCV1x0jYMzFkkBwLF6r9c= Original-X-From: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Tue Mar 05 11:22:12 2024 Return-path: Envelope-to: ged-emacs-devel@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1rhRw4-0007gm-D0 for ged-emacs-devel@m.gmane-mx.org; Tue, 05 Mar 2024 11:22:12 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1rhRvT-0006uq-61; Tue, 05 Mar 2024 05:21:35 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rhRvQ-0006uf-MJ for emacs-devel@gnu.org; Tue, 05 Mar 2024 05:21:32 -0500 Original-Received: from ciao.gmane.io ([116.202.254.214]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1rhRvL-0001d5-Nh for emacs-devel@gnu.org; Tue, 05 Mar 2024 05:21:32 -0500 Original-Received: from list by ciao.gmane.io with local (Exim 4.92) (envelope-from ) id 1rhRvI-0006c0-9R for emacs-devel@gnu.org; Tue, 05 Mar 2024 11:21:24 +0100 X-Injected-Via-Gmane: http://gmane.org/ Received-SPF: pass client-ip=116.202.254.214; envelope-from=ged-emacs-devel@m.gmane-mx.org; helo=ciao.gmane.io X-Spam_score_int: -16 X-Spam_score: -1.7 X-Spam_bar: - X-Spam_report: (-1.7 / 5.0 requ) BAYES_00=-1.9, FREEMAIL_FORGED_FROMDOMAIN=0.001, FREEMAIL_FROM=0.001, HEADER_FROM_DIFFERENT_DOMAINS=0.249, SPF_HELO_NONE=0.001, SPF_PASS=-0.001, T_SCC_BODY_TEXT_LINE=-0.01 autolearn=no autolearn_force=no X-Spam_action: no action X-BeenThere: emacs-devel@gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: "Emacs development discussions." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Original-Sender: emacs-devel-bounces+ged-emacs-devel=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.emacs.devel:316821 Archived-At: --=-=-= Content-Type: text/plain Michael Heerdegen writes: > I gave it a try. The paragraph in the manual describing `on-sort' > internals would have to be updated in addition. Version with one thinko less: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Optimize-sort-on.patch >From cf41d9abacc6d918cf45ded985fb3dcebd8cc5af Mon Sep 17 00:00:00 2001 From: Michael Heerdegen Date: Tue, 5 Mar 2024 08:03:26 +0100 Subject: [PATCH] Optimize sort-on * lisp/sort.el (sort-on): Manipulate the argument list instead of creating new lists with `mapcar'. --- lisp/sort.el | 19 +++++++++++++++---- 1 file changed, 15 insertions(+), 4 deletions(-) diff --git a/lisp/sort.el b/lisp/sort.el index 1e82a097047..5054d98913d 100644 --- a/lisp/sort.el +++ b/lisp/sort.el @@ -30,6 +30,7 @@ ;;; Code: (eval-when-compile (require 'subr-x)) +(eval-when-compile (require 'cl-lib)) (defgroup sort nil "Commands to sort text in an Emacs buffer." @@ -497,15 +498,25 @@ sort-on PREDICATE is the function for comparing keys; it is called with two arguments, the keys to compare, and should return non-nil if the first key should sort before the second key. -The return value is always a new list. +SEQUENCE is modified by side effects. This function has the performance advantage of evaluating ACCESSOR only once for each element in the input SEQUENCE, and is therefore appropriate when computing the key by ACCESSOR is an expensive operation. This is known as the \"decorate-sort-undecorate\" paradigm, or the Schwartzian transform." - (mapcar #'car - (sort (mapcar #'(lambda (x) (cons x (funcall accessor x))) sequence) - #'(lambda (x y) (funcall predicate (cdr x) (cdr y)))))) + (cl-macrolet ((transform (list transformer) + (macroexp-let2 macroexp-copyable-p l list + (macroexp-let2 nil ret l + `(progn + (while ,l + (setcar ,l ,(macroexp-let2 nil elt `(car ,l) + (funcall transformer elt))) + (setq ,l (cdr ,l))) + ,ret))))) + (transform + (sort (transform sequence (lambda (x) `(cons ,x (funcall accessor ,x)))) + #'(lambda (x y) (funcall predicate (cdr x) (cdr y)))) + (lambda (x) `(car ,x))))) (defvar sort-columns-subprocess t) -- 2.39.2 --=-=-= Content-Type: text/plain Michael. --=-=-=--