|
| |||
|
|
О пресловутой "эффективности" С++:
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;
}
|
||||||||||||||||