| |||
|
|
О пресловутой "эффективности" С++: import Complex norm2 (x :+ y) = x*x+y*y iters2 max_iter xc yc = let c = xc :+ yc in let aux count z = if count >= max_iter then max_iter else if norm2 z >= 4.0 then count else aux (count+1) (z * z + c) in aux 0 c resolution = 5000 max_val = resolution / 2 min_val = - max_val mul = 2 / max_val main = print (sum [iters2 100 (i * mul) (j * mul) | i <- [min_val..max_val], j <- [min_val..max_val]]) Upd: И еще вариант на O'Caml с максимальным полиморфизмом, но без ОО-жопы - в ML-style - с параметризоваными модулями - работает 17 секунд: module type COMPL = sig type t type elem val to_float: elem -> float val of_float: float -> elem val make : re:elem -> im:elem -> t val add : t -> t -> t val mul : t -> t -> t val norm2 : t -> elem end module Mand (COMPL: COMPL) = struct let iters max_iter xc yc = let c = COMPL.make xc yc in let rec aux count z = if count >= max_iter then max_iter else begin if COMPL.norm2 z >= COMPL.of_float 4.0 then count else begin aux (count+1) (COMPL.add (COMPL.mul z z) c) end end in aux 0 c end module MandC = Mand (struct type elem = float type t = {re: elem; im:elem} let to_float x = x let of_float x = x let make ~re ~im = {re=re; im=im} let add a b = {re=a.re +. b.re; im=a.im +. b.im} let mul a b = {re=a.re *. b.re -. a.im *. b.im; im=a.re *. b.im +. a.im *. b.re} let norm2 z = z.re *. z.re +. z.im *. z.im end) Upd2: Справедливости ради, если сделать совсем кастомный аллокатор для класса, цифирь начинает выглядеть так: Time=2.2 Time=4.08 Time=49.42 Time=60.18 Но shared_ptr'ы все равно остаются ужасом и моральным террором. void * operator new (size_t size) { if (free_list != NULL) { void * res = free_list; free_list = *(void **)free_list; return res; } return ::operator new (size); } void operator delete (void * addr) { if (addr == NULL) return; *(void **)addr = free_list; free_list = addr; } |
||||||||||||||||