数学建模社区-数学中国
标题:
Forcal运行速度测试例子
[打印本页]
作者:
forcal
时间:
2010-9-27 19:28
标题:
Forcal运行速度测试例子
Forcal的运行效率与Lua相当,是目前最快的脚本之一,但Forcal的扩充性能更好。
0 J/ m* @2 l1 i
在大量函数调用时,Forcal更具速度优势。
, v! E0 x! Q* T7 ]( Z" ~
以下是Forcal的运行速度测试例子,大家可转换为其他脚本代码(例如matlab)比较一下。
! [" i6 _: ~; V! C, o! E* ]9 R
' s* H( o' V5 |. F- ]
例1:Fibonacci递归程序(n取40)
7 v. B4 A P- u7 h/ q7 N' g8 Y
SetRealStackMax(1000);
: ?% V3 H8 y9 _
F(n)= which{
# ~. T( x: j. g( U$ u% t4 B
n == 0,
; Z& q* E! {! S- |4 l7 D
return(0),
9 P( z* r5 l4 f" S
n == 1,
7 n1 a) g( ^3 ^6 r5 p
return(1),
0 R3 h7 Z) U' L/ J4 I, b$ Z: V
return [F(n - 1) + F(n - 2)]
$ q5 b! N' F" q9 l3 B/ \+ l- n& X
};
3 b' U, e* @! R+ U/ s, z; a+ @ g
main(:t,n)=
9 w8 H( J) N0 r) o/ {8 ?
{
+ a1 M/ h5 g9 p3 a- y
t=sys::clock(),
: v' z R5 l+ x" h' s) G
n=F(40),
5 {, B1 u6 W2 [# J4 s9 n6 `" i
t=sys::clock()-t,
% N; {1 a/ }4 n+ I* x% G
printff{"\r\nfibonacci={1,i}, fibonacci_Time={2,i}毫秒={3,i}秒\r\n",n,t,t/1000}
' c7 L% Y( S" {3 V# H
};
( P1 f* r6 v- H ?; m1 p9 I/ Y
复制代码
结果:
+ g2 h8 A4 ^7 _: _* Q
; j9 L' P6 x# }: y: R
fibonacci=102334155, fibonacci_Time=41859毫秒=41秒
. {7 J9 o. v6 ~4 R" \6 y
& N9 z5 e4 h9 L1 h% m1 z% W4 A
例2:八皇后问题
- x s4 d5 a% o5 W
// 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。
" v0 g/ O( C. |' a2 t
// Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。
0 u$ s7 @: X8 L0 ~" N" d) r
// Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。
' J0 h3 Z( D# u, ^
// 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。
9 c8 n6 t' v) }( `0 A# H2 A
// 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。
% l. y# |& Y' b) C4 b3 V+ D
// 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
; c- r5 _# R8 q A+ `9 t) a
// 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
- h" M" t- B; i4 w
// 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
1 r" X1 `5 i Y5 S
// 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。
& ?# T2 [- j/ }" j" z
//Forcal源程序
. |; z* M: y0 x: o+ o7 b
i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);
! R8 {( h x7 E/ K
i:test(row, ld, rd : pos,p : sum,upperlim)=
" J) I# H1 u, s" i
{
& u& J7 i. y4 C! B0 ?- H1 H
which
. A& P1 c2 P* @; D2 d
{ row != upperlim,
( A4 _' d5 s/ T& w6 j
{ pos = and{upperlim , not[row.or(ld).or(rd)]},
1 L) H6 {+ Q' c3 ?8 l2 T
while{ pos,
* \& s' C2 s9 X: F1 y, t
p = and(pos,-pos),
7 u2 x9 h, N7 x, S8 ?
pos = pos -p,
& T8 l; `' D8 H4 N
test(row+p, shl(ld+p,1), shr(rd+p,1))
* A7 B6 r" a/ ^; `
}
- _ W" T+ l: F$ @9 k* f6 |1 U a
},
! p" w! _" S' u& c
sum++
' g$ z0 i, F8 v3 R/ y4 K' z
}
1 Z: ]7 k5 T3 I3 { C/ y8 z
};
$ m7 X# g- n9 w/ W& Z
i:main(:tm,n:sum,upperlim)=
: a& s' `1 u t8 \( s0 ^7 J
{
/ S6 L' i1 Z' L/ i) ~7 f6 I; ~, N
n=15,
3 E9 } X# W: a( J
tm=sys::clock(),
7 ]; Y( X- F. A
printff("Queens:{1,i}, ",n),
+ A$ y7 O k- N: R
upperlim=shl(upperlim,n)-1,
, E: t* v" `6 S4 c
test(0,0,0),
7 S4 d) I- m6 R" g
printff("sum:{1,i}, {2,i}毫秒.\r\n",sum,sys::clock()-tm)
+ W6 I! d K% j2 H/ C& n0 w" v
};
; e( M2 ^* I- N' U* r. n2 z
复制代码
Forcal运行结果:
) i+ P6 ]! G+ k6 D
0 ?' b0 x- G, D$ p: k6 {' i; `, R0 P
Queens:15, sum:2279184, 59547毫秒.
* ]: P V/ V. h
& t ?. }: w C5 n3 z; m
例3:一段有趣的程序:此例Forcal速度约为C/C++的1/4左右
5 l6 X' v( o" V8 U5 H2 z
mandelbrot(x, y : cr,ci,zi,zr,i,temp,zr2,zi2) =
! ~$ C( c( ~+ o! p0 N- y3 c
{
, R) H* x- c2 t( \7 l+ |
cr = y - 0.5,
) U$ k! c# K3 ]* M) Z* D& }
ci = x,
& a2 f$ E; I1 E! S3 B. b8 |
zi = 0.0,
. Q+ s. Z2 [! ~% c! u+ t9 `" P |
zr = 0.0,
9 [: p( K4 _) y$ u- [! P
i = 0,
/ o% [+ G* ?3 q" O5 ~; w3 I
(1).while {
- D( N3 O# z8 b" J. O7 q1 G( G
i ++,
1 Z' z9 y; d0 f# f' @; T
temp = zr * zi,
: p- W+ i1 H9 B; Y* d
zr2 = zr * zr,
( }- i4 t# C( _2 T; c
zi2 = zi * zi,
% o9 p9 D! R; i- X; H: w/ U
zr = zr2 - zi2 + cr,
% {2 r8 V( Z* h! K) c* a
zi = temp + temp + ci,
' _8 Z, V# J/ M: d& g
if [zi2 + zr2 > 16, return (i)],
5 @1 }4 q7 H& ?
if [i > 1000, return (0)]
4 X6 n9 s- p& K D" `8 d0 Z( i; n% ^
}
0 ^- ]3 K" }$ v2 Y& W
) v" M+ p( U4 w4 s& Q
};
) q" R6 b4 m! t" @9 w
main (:i,x,y,old,now) = {
( L4 G3 i; c9 p
old=sys::clock(),
( p3 H _6 b( h/ Y
y = -39,
1 A0 g0 ]2 y- \8 C- a9 D7 a7 A- c
while{ y < 39,
; D( K/ A; v& t% Y5 W" {
printff("\r\n"),
* e0 M* g9 w8 V5 ^+ b. |4 s2 ^
x = -39,
x$ ~" u3 j' N$ n
while{ x < 39,
( v5 M+ R2 q& L$ O5 e# X
i = mandelbrot(x/40.0, y/40.0),
& O! M5 r5 U* T F; p( _4 P$ S
which{ i==0,
* j3 f% y0 ]% p0 F: F
printff("*"),
; p# A$ O9 U o* p( P
printff(" ")
+ O+ W6 N9 }) Z" f7 m
},
4 U6 j2 T: X1 g3 ?; ~9 B- P
x++
' N/ h% P# J( R' ^4 f) _
},
7 M0 Y( f1 `. s+ o
y++
. n8 y3 c% u7 l' U0 X
},
" |& g" V' n3 u& q0 h
now=sys::clock(),
% {" y; C0 V; z6 S
printff("\r\nForcal Elapsed {1,r}\r\n",(now-old)/1000)
& s4 h" u) l6 [
};
) T9 A$ c6 I7 ~
复制代码
! e. Y; P9 M$ Y$ x5 a1 K
运行结果:
3 C: n, _8 n; A
*
0 u3 P0 h$ t; ^% L
*
5 P `2 ]1 G N! T
*
. m) S5 C; X. j/ I' p
*
$ ~& B* \! H) |! U" c3 e
*
) U4 x, q6 ~# ^( u: l5 D
***
0 u( e4 I+ r' }+ @0 C8 F7 S, D
*****
( c! Z3 ?$ l3 N9 l
*****
; } K! T; m7 K1 p7 V" k Y
***
1 f9 ~) l# N0 d" Z* [' G
*
' a* G# J( g1 P; W& n' E
*********
$ ]. P6 U- P! R' r
*************
( }& _" S V' u
***************
$ z; I" M& `0 Z: }7 {$ i
*********************
/ U( E) a) `: t5 Y! t6 o
*********************
/ [" ^) v. Z5 c+ `) @
*******************
1 l0 h& R7 H/ l
*******************
. Y8 ~+ ?1 j5 D: x, m! {( ?, I8 H
*******************
) x4 z6 _: _, v1 p
*******************
' p9 R1 t( n" T% j7 S# u X5 w
***********************
9 Y9 J) j4 s4 }0 Z$ {7 h. B
*******************
1 P4 J# ~' c1 e1 {) \4 R/ T9 A3 ~. k
*******************
, \/ H4 ~5 E. ^$ h
*********************
9 Y% G$ H# j9 V6 z+ U" U: e
*******************
! v/ d# y. `9 L) r5 g0 v
*******************
& d7 b( @$ {" U: A- J+ ]1 { o
*****************
3 D, D3 V/ y# `3 C+ S, E
***************
8 k- {6 \2 q' n* f- M: y& |
*************
. }0 w1 D; i( L6 M
*********
( y7 ?& K! I0 C a1 T( \0 u( r
*
7 M5 A- y8 p0 O/ k
***************
4 B' c9 B) R2 w) l/ `
***********************
5 D1 d- E4 e) n8 p9 c
* ************************* *
0 s; N# Y- R$ C, `. m
*****************************
# k1 Z' ?; w0 P$ A' l; O @2 B
* ******************************* *
' d9 e( ?/ g- q B' I3 \ K
*********************************
, G# M* m, ]1 D) }* n. Z
***********************************
# h% o- W6 ~4 f
***************************************
1 b3 S9 a# h; y; p% x
*** ***************************************** ***
/ N' [" h' Q9 @ g
*************************************************
: E1 H6 |5 O0 \- ?, G/ k! u
***********************************************
$ m/ x; m0 C2 A6 N/ D; Q
*********************************************
b8 F* p) ?8 k( ^ u, r
*********************************************
3 H/ E7 q$ g7 F6 }9 k3 F
***********************************************
; O/ a' x& _% {- O( m; r- u
***********************************************
# {% x' @* P/ y' M5 \2 z2 a, Q
***************************************************
d. X1 H- Z1 [; f
*************************************************
0 r) U; {, R1 s% K! J, w$ ]
*************************************************
1 n( E# U4 t. R# z
***************************************************
* w# }$ T! x& G8 v1 W
***************************************************
, R/ ]; c7 A5 }+ j/ G" J
* *************************************************** *
) p$ ?# d+ V) J0 M; l1 M
***** *************************************************** *****
. H9 E$ |* T: u" X; w; O) I
****** *************************************************** ******
4 l3 w& r. I4 M$ E, a! g
******* *************************************************** *******
' b8 s, E# D+ U9 D# {& H' u
***********************************************************************
3 h! y# T! m* k3 K C
********* *************************************************** *********
- A" \5 O% H% C- E; N4 r
****** *************************************************** ******
- k- d. w& q* [2 L% ^% s
***** *************************************************** *****
3 f! e2 s7 s; `( Q9 h; ~! S% r
***************************************************
" ~( Y7 S) f6 O. N" e x) [/ v9 I
***************************************************
7 e6 f1 u; B1 O B3 p3 R( X. L$ `% V, U
***************************************************
0 p o5 `; j5 W4 A# o
***************************************************
6 P: B! V n6 Z
*************************************************
% ~! D! X: c* m
*************************************************
( [" z6 d$ i1 D* y2 M
***************************************************
! R9 Q {) d) O; L, H* T
***********************************************
9 U! }" R1 `: R+ j
***********************************************
& f3 D+ M6 ]# @' h7 f' d
*******************************************
: j9 N+ _2 d9 B; g* N: `" u
*****************************************
0 ^2 q4 p8 \/ u6 s
*********************************************
! f3 k7 A6 i9 t. W% i* i' A
**** ****************** ****************** ****
- v/ g( b& B5 O% z3 I4 N
*** **************** **************** ***
5 C$ T e3 V% L( N! r% k0 v* y3 q& h
* ************** ************** *
. K& Z: c9 q. }! e( j8 k. s
*********** ***********
9 R: E) T1 h' W0 z. R5 y
** ***** ***** **
7 W) ]: h* D2 Z. J) p- {4 y. w
* * * *
$ H: S) b3 m- r! w' V
复制代码
! G9 d$ Q/ p8 y( `
运行时间为:
) ?+ v, t7 r- ^6 l' ]6 {% k
' ?# [0 G, Q& l# V6 K% K
Forcal Elapsed 1.078
7 d0 {( ~* r! e, v! y$ T9 @0 w* |
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5