all messages for Emacs-related lists mirrored at yhetil.org
 help / color / mirror / code / Atom feed
* bug#69480: Emacs Lisp needs, for its great 'native-compile', 'declare' and 'the' for fixnums and arrays.
@ 2024-02-29 19:40 Robert Boyer
  2024-02-29 20:10 ` Eli Zaretskii
  0 siblings, 1 reply; 21+ messages in thread
From: Robert Boyer @ 2024-02-29 19:40 UTC (permalink / raw)
  To: 69480


[-- Attachment #1.1: Type: text/plain, Size: 6063 bytes --]

I show beyond all doubt how much Emacs Lisp needs, for its great
'native-compile',
'declare' and 'the' for fixnums and arrays.

Why? 8X!

If every time you aref a vector or increment a fixnum you have to check
things, you are going to waste a lot of cpu time. A programmer NEEDS to be
able to TELL the system things that should not be checked constantly.
Imagine
how slow one would be if he/she had to check that he/she was alive every
heart beat.

I have attached two files, eratosthenese.el and eratosthenese.lisp, the
first coded in Emacs Lisp and the second in Common Lisp.

In all that follows, I am running on a $100 Lenovo Chromebook.

The Sieve of Eratosthenese is the second oldest algorithm I am aware of, the
oldest being gcd.

Consider this form:

(progn (emacs-lisp-native-compile-and-load) (benchmark (build-sieve (expt
10 8)) 1))

First of all, 'benchmark' has an obvious bug because it reports a time of
.000005 seconds.

So I used the timer on my trusty $130 moto g pure phone.

After finding the file eratosthenese.el, the evaluation of the form above
takes 69 seconds in Emacs.

After entering SBCL and loading eratosthenese.lisp, (build-sieve (expt 10
8))
takes 8 seconds.

Q.E.D.

Bob

I attach stuff that I do not understand but that you may like.

From: bob <bob@penguin>
To: bug-gnu-emacs@gnu.org
Subject: 28.2; Why Emacs Lisp needs declare and the for fixnums and arrays.
--text follows this line--




In GNU Emacs 28.2 (build 1, x86_64-pc-linux-gnu, GTK+ Version 3.24.37,
cairo version 1.16.0)
 of 2023-05-13, modified by Debian built on x86-ubc-01
Windowing system distributor 'The X.Org Foundation', version 11.0.12014000
System Description: Debian GNU/Linux 12 (bookworm)

Configured using:
 'configure --build x86_64-linux-gnu --prefix=/usr
 --sharedstatedir=/var/lib --libexecdir=/usr/libexec
 --localstatedir=/var/lib --infodir=/usr/share/info
 --mandir=/usr/share/man --with-libsystemd --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/28.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/28.2/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils
 --with-native-compilation --build x86_64-linux-gnu --prefix=/usr
 --sharedstatedir=/var/lib --libexecdir=/usr/libexec
 --localstatedir=/var/lib --infodir=/usr/share/info
 --mandir=/usr/share/man --with-libsystemd --with-pop=yes
 --enable-locallisppath=/etc/emacs:/usr/local/share/emacs/28.2/site-lisp:/usr/local/share/emacs/site-lisp:/usr/share/emacs/28.2/site-lisp:/usr/share/emacs/site-lisp
 --with-sound=alsa --without-gconf --with-mailutils
 --with-native-compilation --with-cairo --with-x=yes
 --with-x-toolkit=gtk3 --with-toolkit-scroll-bars 'CFLAGS=-g -O2
 -ffile-prefix-map=/build/emacs-mPr7Vr/emacs-28.2+1=.
 -fstack-protector-strong -Wformat -Werror=format-security -Wall'
 'CPPFLAGS=-Wdate-time -D_FORTIFY_SOURCE=2' LDFLAGS=-Wl,-z,relro'

Configured features:
ACL CAIRO DBUS FREETYPE GIF GLIB GMP GNUTLS GPM GSETTINGS HARFBUZZ JPEG
JSON LCMS2 LIBOTF LIBSELINUX LIBSYSTEMD LIBXML2 M17N_FLT MODULES
NATIVE_COMP NOTIFY INOTIFY PDUMPER PNG RSVG SECCOMP SOUND THREADS TIFF
TOOLKIT_SCROLL_BARS X11 XDBE XIM XPM GTK3 ZLIB

Important settings:
  value of $LANG: en_US.UTF-8
  locale-coding-system: utf-8-unix

Major mode: Text

Minor modes in effect:
  shell-dirtrack-mode: t
  display-time-mode: t
  tooltip-mode: t
  global-eldoc-mode: t
  show-paren-mode: t
  electric-indent-mode: t
  mouse-wheel-mode: t
  file-name-shadow-mode: t
  global-font-lock-mode: t
  font-lock-mode: t
  blink-cursor-mode: t
  auto-composition-mode: t
  auto-encryption-mode: t
  auto-compression-mode: t
  line-number-mode: t
  transient-mark-mode: t

Load-path shadows:
None found.

Features:
(shadow sort mail-extr emacsbug message rmc puny rfc822 mml mml-sec epa
derived epg rfc6068 epg-config gnus-util mm-decode mm-bodies mm-encode
mail-parse rfc2231 mailabbrev gmm-utils mailheader sendmail thingatpt
dabbrev misearch multi-isearch help-fns radix-tree cl-print debug
backtrace find-func time-date compile text-property-search comp
comp-cstr warnings rx cl-extra help-mode cus-start etags fileloop
generator xref project dired-aux cus-edit pp cus-load wid-edit trace
sh-script smie executable dired dired-loaddefs cal-menu calendar
cal-loaddefs ange-ftp shell pcomplete comint ansi-color ring benchmark
time rmail rmail-loaddefs rfc2047 rfc2045 ietf-drums mm-util mail-prsvr
mail-utils face-remap finder-inf package browse-url url url-proxy
url-privacy url-expand url-methods url-history url-cookie url-domsuf
url-util mailcap url-handlers url-parse auth-source cl-seq eieio
eieio-core cl-macs eieio-loaddefs password-cache json subr-x map
url-vars seq byte-opt gv bytecomp byte-compile cconv cl-loaddefs cl-lib
iso-transl tooltip eldoc paren electric uniquify ediff-hook vc-hooks
lisp-float-type elisp-mode mwheel term/x-win x-win term/common-win x-dnd
tool-bar dnd fontset image regexp-opt fringe tabulated-list replace
newcomment text-mode lisp-mode prog-mode register page tab-bar menu-bar
rfn-eshadow isearch easymenu timer select scroll-bar mouse jit-lock
font-lock syntax font-core term/tty-colors frame minibuffer cl-generic
cham georgian utf-8-lang misc-lang vietnamese tibetan thai tai-viet lao
korean japanese eucjp-ms cp51932 hebrew greek romanian slovak czech
european ethiopic indian cyrillic chinese composite emoji-zwj charscript
charprop case-table epa-hook jka-cmpr-hook help simple abbrev obarray
cl-preloaded nadvice button loaddefs faces cus-face macroexp files
window text-properties overlay sha1 md5 base64 format env code-pages
mule custom widget hashtable-print-readable backquote threads dbusbind
inotify lcms2 dynamic-setting system-font-setting font-render-setting
cairo move-toolbar gtk x-toolkit x multi-tty make-network-process
native-compile emacs)

Memory information:
((conses 16 178787 77633)
 (symbols 48 13676 66)
 (strings 32 42888 8138)
 (string-bytes 1 1386823)
 (vectors 16 26477)
 (vector-slots 8 100493063 154471)
 (floats 8 62 377)
 (intervals 56 2423 424)
 (buffers 992 31))

[-- Attachment #1.2: Type: text/html, Size: 6864 bytes --]

[-- Attachment #2: eratosthenes.el --]
[-- Type: application/octet-stream, Size: 2373 bytes --]

;;; This file eratosthenese.el was coded by Robert Boyer,
;;; roberstephenboyer@gmail.com, in 2024, and is public domain.

;;;                           A Sieve of Eratosthenese

;;; Born c. 276 B. C. in Libya, Eratosthenese calculated the radius of the Earth
;;; and was the librarian of Alexandria.

;;; The build a sieve of Eratosthenese of length n, call (build-sieve n),
;;; after which i is prime if and only if (is-a-prime i).

;;; (build-sieve (expt 10 8)) takes 1600 seconds to execute.

(defvar test-form '(progn (emacs-lisp-native-compile-and-load) (benchmark (build-sieve (expt 10 8)) 1)))

(cl-declaim (optimize (safety 0) (speed 3) (debug 0) (space 0)))

(defvar *sieve-length* 0)

(setq *sieve-length* 0)

(defvar *sieve* (make-vector 1 0))

(setq *sieve* (make-vector 1 0))

(cl-defun build-sieve (n)
  "After executing (build-sieve n), if j is a nonnegative integer less than
   *sieve-length*, then j is prime <-> (is-a-prime j)."
  (setq *sieve* (make-vector n 0))
  (setq *sieve-length* n)
  ;; Neither 0 nor 1 is prime.
  (setf (aref *sieve* 0) 1)
  (setf (aref *sieve* 1) 1)
  ;; Loop through a from 0 below l. If you encounter a 0 at file position
  ;; i, then '1 out' all the subsequent multiples of i.
  (cl-loop for i from 2 below *sieve-length* do
           (cond ((eql 0 (aref *sieve* i))
                  (cl-loop for j from (ash i 1) below *sieve-length* by i
                           do (setf (aref *sieve* j) 1))))))

(cl-defun test-sieve (n)
  (cond ((not (< n *sieve-length*)) (error "n is too big.")))
  (cl-loop for i from 2 to n do
           (let ((number-of-divisors (cl-loop for j from 2 to i when (eql 0 (% i j)) count 1)))
             (cond ((eql (aref *sieve* i) 1)
                    (cond ((not (< 1 number-of-divisors))
                           (error "bad at %s." i))))
                   ((eql (aref *sieve* i) 0)
                    (cond ((not (eql 1 number-of-divisors))
                           (error "bad at %s." i))))
                   (t (error "ridiculous")))))
  'ok)

(defun is-a-prime (n)
  (cond ((eql 0 (aref *sieve* 0))
         (error "It looks like (build-sieve) has not been run.")))
  (cond ((< n *sieve-length*)
         (eql 0 (aref *sieve* n)))
        (t (error "need a bigger sieve"))))

\f
;;; Local Variables: ;;;
;;; mode: Emacs-Lisp ;;;
;;; coding: utf-8    ;;;
;;; End:             ;;;

[-- Attachment #3: eratosthenes.lisp --]
[-- Type: application/x-lisp, Size: 2857 bytes --]

^ permalink raw reply	[flat|nested] 21+ messages in thread

end of thread, other threads:[~2024-03-01 19:36 UTC | newest]

Thread overview: 21+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-02-29 19:40 bug#69480: Emacs Lisp needs, for its great 'native-compile', 'declare' and 'the' for fixnums and arrays Robert Boyer
2024-02-29 20:10 ` Eli Zaretskii
2024-02-29 20:54   ` Robert Boyer
2024-02-29 22:10     ` Michael Heerdegen via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-01  6:45     ` Eli Zaretskii
2024-02-29 21:04   ` Robert Boyer
2024-03-01 11:28   ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-01 12:18     ` Andrea Corallo
2024-03-01 12:33       ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-01 12:45         ` Eli Zaretskii
2024-03-01 13:07           ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-01 13:41             ` Eli Zaretskii
2024-03-01 13:53               ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-01 14:07                 ` Andrea Corallo
2024-03-01 14:35                   ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-01 16:10                     ` Andrea Corallo
2024-03-01 19:36                       ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-01 16:34                 ` Eli Zaretskii
2024-03-01 19:36                   ` Stephen Berman via Bug reports for GNU Emacs, the Swiss army knife of text editors
2024-03-01 12:40       ` Eli Zaretskii
2024-03-01 12:34     ` Eli Zaretskii

Code repositories for project(s) associated with this external index

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

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.