From mboxrd@z Thu Jan 1 00:00:00 1970 From: Jack Henahan Subject: Re: [PATCH] `org-clock--oldest-date` performance Date: Sat, 20 Jan 2018 16:06:29 -0500 Message-ID: References: <87po64ok7n.fsf@nicolasgoaziou.fr> <87y3ksmm0m.fsf@nicolasgoaziou.fr> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Return-path: Received: from eggs.gnu.org ([2001:4830:134:3::10]:48555) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ed0LV-0005mS-U8 for emacs-orgmode@gnu.org; Sat, 20 Jan 2018 16:06:39 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ed0LS-0005rg-O3 for emacs-orgmode@gnu.org; Sat, 20 Jan 2018 16:06:37 -0500 Received: from ms11p00im-qufv17110101.me.com ([17.58.37.18]:35260) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ed0LS-0005rE-Fp for emacs-orgmode@gnu.org; Sat, 20 Jan 2018 16:06:34 -0500 Received: from process-dkim-sign-daemon.ms11p00im-qufv17110101.me.com by ms11p00im-qufv17110101.me.com (Oracle Communications Messaging Server 8.0.1.2.20170607 64bit (built Jun 7 2017)) id <0P2V00L00FD82400@ms11p00im-qufv17110101.me.com> for emacs-orgmode@gnu.org; Sat, 20 Jan 2018 21:06:33 +0000 (GMT) Received: from icloud.com ([127.0.0.1]) by ms11p00im-qufv17110101.me.com (Oracle Communications Messaging Server 8.0.1.2.20170607 64bit (built Jun 7 2017)) with ESMTPSA id <0P2V0055EHAT4J10@ms11p00im-qufv17110101.me.com> for emacs-orgmode@gnu.org; Sat, 20 Jan 2018 21:06:33 +0000 (GMT) In-reply-to: List-Id: "General discussions about Org-mode." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: emacs-orgmode-bounces+geo-emacs-orgmode=m.gmane.org@gnu.org Sender: "Emacs-orgmode" To: emacs-orgmode@gnu.org --=-=-= Content-Type: text/plain I've sent off for the FSF form so I can get that process started, and I've amended my patch according to the guidelines (attached). Jack Henahan writes: > I tested that `org-clock-display` and the clocktable work as expected > when `org-clock-display-default-range` is set to `untilnow`. > `org-clock-sum-custom` also appears to function as intended. If I'm > reading things correctly, the `untilnow` case is the only one that ought > to be affected, since it's the only one that used > `org-clock--oldest-date`. The behavior of `org-clock-special-range` > ought to be unchanged in all cases except where this symbol is > explicitly used, or the start time is nil for some other reason. > > Functionally, this means that today `org-clock-special-range` produces a > range from the current time until the current time if `start` ends up > nil for whatever reason, but with this patch it will instead produce a > range from the year -50000 until now. The -50000 hack is entirely for > the benefit of `format-time-string`, since otherwise it just gives the > current time if its second argument is nil. > >> Jack Henahan writes: >> >>> Apologies again, didn't update the commit hash properly. I swear this is >>> the last one. :| >> >> Thank you. However, I'm surprised that `org-clock-special-range' callers >> handle a nil start date. Have you tested it? >> >> If that's true, we don't need the -50000 hack at all. Returning an empty >> string might be enough. --=-=-= Content-Type: text/x-patch Content-Disposition: attachment; filename=0001-org-clock.el-Improve-untilnow-range-behavior-and-per.patch >From a4add4ef44c4f445b4c029a0f0a7ef6f3d5d606b Mon Sep 17 00:00:00 2001 From: Jack Henahan Date: Sat, 20 Jan 2018 12:07:11 -0500 Subject: [PATCH] org-clock.el: Improve `untilnow' range behavior and performance * org-clock.el: (org-clock-special-range): Set `untilnow' to use the year -50000, rather than the earliest representable date. (org-clock--oldest-date): Remove. The `untilnow' range relied on the constant `org-clock--oldest-date` to find the earliest representable date, which caused delays when loading `org-clock' on systems where `most-negative-fixnum' is large. This change removes that constant in favor of a simpler hack to produce a range between the current time and before the dawn of human civilization. If this breaks your workflow, please report to the Time Police. --- lisp/org-clock.el | 42 +++++++----------------------------------- 1 file changed, 7 insertions(+), 35 deletions(-) diff --git a/lisp/org-clock.el b/lisp/org-clock.el index 496c4310a..519b1563b 100644 --- a/lisp/org-clock.el +++ b/lisp/org-clock.el @@ -468,38 +468,6 @@ to add an effort property.") (defvar org-clock-stored-resume-clock nil "Clock to resume, saved by `org-clock-load'") -(defconst org-clock--oldest-date - (let* ((dichotomy - (lambda (min max pred) - (if (funcall pred min) min - (cl-incf min) - (while (> (- max min) 1) - (let ((mean (+ (ash min -1) (ash max -1) (logand min max 1)))) - (if (funcall pred mean) (setq max mean) (setq min mean))))) - max)) - (high - (funcall dichotomy - most-negative-fixnum - 0 - (lambda (m) - ;; libc in macOS 10.6 hangs when decoding times - ;; around year -2**31. Limit `high' not to go - ;; any earlier than that. - (unless (and (eq system-type 'darwin) - (string-match-p - "10\\.6\\.[[:digit:]]" - (shell-command-to-string - "sw_vers -productVersion")) - (<= m -1034058203135)) - (ignore-errors (decode-time (list m 0))))))) - (low - (funcall dichotomy - most-negative-fixnum - 0 - (lambda (m) (ignore-errors (decode-time (list high m))))))) - (list high low)) - "Internal time for oldest date representable on the system.") - ;;; The clock for measuring work time. (defvar org-mode-line-string "") @@ -2260,7 +2228,7 @@ have priority." ;; Format start and end times according to AS-STRINGS. (let* ((start (pcase key (`interactive (org-read-date nil t nil "Range start? ")) - (`untilnow org-clock--oldest-date) + (`untilnow nil) (_ (encode-time 0 m h d month y)))) (end (pcase key (`interactive (org-read-date nil t nil "Range end? ")) @@ -2283,8 +2251,12 @@ have priority." (`interactive "(Range interactively set)") (`untilnow "now")))) (if (not as-strings) (list start end text) - (let ((f (cdr org-time-stamp-formats))) - (list (format-time-string f start) + (let ((f (cdr org-time-stamp-formats)) + (safe-start + (if (not start) + (encode-time 0 0 0 0 0 -50000) + start))) + (list (format-time-string f safe-start) (format-time-string f end) text)))))) -- 2.15.1 --=-=-=--