LINUX.ORG.RU

История изменений

Исправление monk, (текущая версия) :

На моём компьютере (Racket 6.11, Python 3.5.1+) твои примеры:

$ time racket mand.rkt 10000000 1

real    0m6,321s
user    0m6,108s
sys     0m0,224s

$ time python3 mand.py 10000000 1

real    0m4,887s
user    0m4,820s
sys     0m0,020s

Если проставить типы для Racket (иначе он комплексную арифметику делает в предположении, что там могут быть числа произвольной точности), тогда

$ time racket mand2.rkt 10000000 1

real    0m1,733s
user    0m1,636s
sys     0m0,100s
$ cat mand2.rkt
#lang racket/base
(require racket/unsafe/ops)

(struct complex (r i))

(define c (complex 0.04 0.01))

(define (complex+ a b)
  (complex (unsafe-fl+ (complex-r a) (complex-r b))
           (unsafe-fl+ (complex-i a) (complex-i b))))

(define (complex* a b)
  (complex (unsafe-fl- (unsafe-fl* (complex-r a) (complex-r b))
                       (unsafe-fl* (complex-i a) (complex-i a)))
           (unsafe-fl+ (unsafe-fl* (complex-r a) (complex-i b))
                       (unsafe-fl* (complex-i a) (complex-r b)))))

(define (mandelbrot n z)
  (if (unsafe-fx= n 0) z
      (mandelbrot (unsafe-fx- n 1) (complex+ (complex* z z) c))))

(let*
    ((n (string->number (vector-ref (current-command-line-arguments) 0)))
     (debug (string=? "debug" (vector-ref (current-command-line-arguments) 1)))
     (z0 (complex 0.0 0.0))
     (z (mandelbrot n z0)))
  (when debug (printf (number->string (unsafe-make-flrectangular (complex-r z) (complex-i z))))))

До sbcl, конечно, далеко, но хотя бы быстрее питона.

Исходная версия monk, :

На моём компьютере (Racket 6.11, Python 3.5.1+) твои примеры:

$ time racket mand.rkt 10000000 1

real    0m6,321s
user    0m6,108s
sys     0m0,224s

$ time python3 mand.py 10000000 1

real    0m4,887s
user    0m4,820s
sys     0m0,020s


Если проставить типы для Racket (иначе он комплексную арифметику делает в предположении, что там могут быть числа произвольной точности), тогда
$ time racket mand2.rkt 10000000 1

real    0m1,733s
user    0m1,636s
sys     0m0,100s

$ cat mand2.rkt #lang racket/base (require racket/unsafe/ops)

(struct complex (r i))

(define c (complex 0.04 0.01))

(define (complex+ a b) (complex (unsafe-fl+ (complex-r a) (complex-r b)) (unsafe-fl+ (complex-i a) (complex-i b))))

(define (complex* a b) (complex (unsafe-fl- (unsafe-fl* (complex-r a) (complex-r b)) (unsafe-fl* (complex-i a) (complex-i a))) (unsafe-fl+ (unsafe-fl* (complex-r a) (complex-i b)) (unsafe-fl* (complex-i a) (complex-r b)))))

(define (mandelbrot n z) (if (unsafe-fx= n 0) z (mandelbrot (unsafe-fx- n 1) (complex+ (complex* z z) c))))

(let* ((n (string->number (vector-ref (current-command-line-arguments) 0))) (debug (string=? «debug» (vector-ref (current-command-line-arguments) 1))) (z0 (complex 0.0 0.0)) (z (mandelbrot n z0))) (when debug (printf (number->string (unsafe-make-flrectangular (complex-r z) (complex-i z))))))



До sbcl, конечно, далеко, но хотя бы быстрее питона.