;;; -*- lexical-binding: t -*- ;; ;; ----------------------------------------------------------------------------- ;; this file: ;; https://dataswamp.org/~incal/peval/peval.el ;; ----------------------------------------------------------------------------- (load "peval") (declare-function peval nil) ;; ----------------------------------------------------------------------------- (require 'benchmark) (require 'calc-comb) (require 'cl-lib) ;; ----------------------------------------------------------------------------- (defun peval--eform (&rest form) (format "%s" (eval (car form)))) ;; (peval--eform (+ 1 3 3 7)) ; "14" ;; ----------------------------------------------------------------------------- (defun peval--primes-num (beg end &optional vrb) (cl-loop for i from beg to end count (= 1 (calcFunc-prime i)) into res if vrb finally do (message "%d" res) finally return res)) ;; (peval--primes-num 1 99 t) ;; ----------------------------------------------------------------------------- (defun peval-test () (let* ((beg 1) (end (expt 2 22)) (crs 8) (prts `(,beg ,@(butlast (cdr (mapcar #'floor (number-sequence beg end (/ (- end beg 0.0) crs))))) ,end)) (i 0) (del (make-string 37 ?\-)) (peval-res 0) (peval-time (benchmark-elapse (mapc (lambda (s) (if (numberp s) (cl-incf peval-res s) (when-let* ((_ (stringp s)) (num (string-to-number s))) (cl-incf peval-res num)))) (peval `(peval--primes-num ,(nth i prts) ,(nth (cl-incf i) prts)) ; 1 `(peval--primes-num ,(1+ (nth i prts)) ,(nth (cl-incf i) prts)) ; 2 `(peval--primes-num ,(1+ (nth i prts)) ,(nth (cl-incf i) prts)) `(peval--primes-num ,(1+ (nth i prts)) ,(nth (cl-incf i) prts)) ; 4 `(peval--primes-num ,(1+ (nth i prts)) ,(nth (cl-incf i) prts)) `(peval--primes-num ,(1+ (nth i prts)) ,(nth (cl-incf i) prts)) `(peval--primes-num ,(1+ (nth i prts)) ,(nth (cl-incf i) prts)) `(peval--primes-num ,(1+ (nth i prts)) ,(nth (cl-incf i) prts)) ; 8 )))) (elisp-res) (elisp-time (benchmark-elapse (setf elisp-res (peval--primes-num beg end)))) (optimal-time (/ elisp-time (* 1.0 num))) (optimal-perc (* 100 (/ optimal-time (* 1.0 peval-time))))) (cl-flet ((report (fun) (funcall fun (format "%s" del)) (funcall fun (format "[problem size] 2**22 = %d" end)) (funcall fun (format "[Emacs runnig] 1 + %d forked = %d" num (1+ num))) (funcall fun (format "%s" del)) (funcall fun (format "[* plain done] %d %.4f s" elisp-res elisp-time)) (funcall fun (format "[* peval done] %d %.4f s" peval-res peval-time)) (funcall fun (format "[optimal deg.] %.1f percent" optimal-perc)))) (if noninteractive (report #'message) (when-let* ((buf (get-buffer-create "*peval*")) (_ (bufferp buf))) (with-current-buffer buf (erase-buffer) (report (lambda (s) (insert (format "%s\n" s)))) (goto-char (point-min))) (pop-to-buffer buf)))))) ;; (peval-test) ;; ----------------------------------------------------------------------------- (provide 'peval) ;; -----------------------------------------------------------------------------