数学建模社区-数学中国
标题:
Forcal运行速度测试例子
[打印本页]
作者:
forcal
时间:
2010-9-27 19:28
标题:
Forcal运行速度测试例子
Forcal的运行效率与Lua相当,是目前最快的脚本之一,但Forcal的扩充性能更好。
" D6 g3 y. h8 w
在大量函数调用时,Forcal更具速度优势。
3 |/ q3 J1 x/ E0 A
以下是Forcal的运行速度测试例子,大家可转换为其他脚本代码(例如matlab)比较一下。
/ J% G: C3 U1 U( B: Z' r% v
" z6 ]; F9 u- Y7 M& l) }
例1:Fibonacci递归程序(n取40)
& T. ~. p# G2 R
SetRealStackMax(1000);
! Z0 l6 Z7 ], @7 h) } ?# A8 G
F(n)= which{
% o: h) [; Q( [/ M
n == 0,
7 r' L9 n! v- E, C( O
return(0),
" A8 @# \- I% e% P
n == 1,
5 ?6 s6 v6 B- R1 C
return(1),
* P* O( A! o2 f, U
return [F(n - 1) + F(n - 2)]
. a# w0 ?8 L+ ^; W1 V6 {
};
' ]0 r/ M6 `" Y7 _$ N2 o; x& M+ k
main(:t,n)=
$ K$ O1 I* h! N" e2 u O4 X1 P
{
# _# V3 o1 X- e
t=sys::clock(),
' n$ S$ W/ D9 |+ j. f! ]1 G: ~" v
n=F(40),
( J P% h- p. t% H( X
t=sys::clock()-t,
b0 U8 q( {! q! {( M* |6 Q" K4 O
printff{"\r\nfibonacci={1,i}, fibonacci_Time={2,i}毫秒={3,i}秒\r\n",n,t,t/1000}
8 q* X' Y: c* C8 }5 [( }
};
A1 H0 R2 i; C- ` g+ R4 D# O8 V
复制代码
结果:
) v# ^! R6 E0 j2 N9 l2 L
9 ^+ G2 N/ g$ y
fibonacci=102334155, fibonacci_Time=41859毫秒=41秒
+ A# V+ z. s* x/ X% b
' Z& q4 v, f! _) `+ W8 s
例2:八皇后问题
) b' B+ b# I# v+ e1 m" a' s
// 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。
! V1 n* U% x: W7 H) I0 V
// Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。
) C3 g$ T$ V0 H, c; I
// Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。
- D: o3 V% I6 S0 g( X: m$ |
// 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。
6 R. O h$ _/ P0 G2 Z- u; }
// 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。
O% A8 J+ D5 O: w: x3 c: ?
// 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
0 h( ?5 D6 F. ^+ D4 }- O1 t9 F1 f
// 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
( J: }% k3 G5 R0 K9 \0 G4 B
// 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
7 u9 k& x# c; I) d/ z
// 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。
1 I a+ n. V, Y: D8 [
//Forcal源程序
& s. Q: E* {7 v# l
i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);
0 x+ o) j2 ~& Y4 y6 ^9 W9 ]0 t3 k
i:test(row, ld, rd : pos,p : sum,upperlim)=
$ O7 O/ U3 f1 G- g5 P0 B5 x% R
{
8 Z; T- b8 o; b/ c! H
which
0 ~2 ]& @, O8 E2 }
{ row != upperlim,
2 g1 n& p+ {3 g. ~* A) Z
{ pos = and{upperlim , not[row.or(ld).or(rd)]},
+ l5 l9 W6 A0 A1 o2 ^) P
while{ pos,
6 K( Z1 l* H$ C" h( |8 u2 C
p = and(pos,-pos),
6 I" H( i& i3 }- r l
pos = pos -p,
0 Z8 Q' @ @+ g0 E- b
test(row+p, shl(ld+p,1), shr(rd+p,1))
! d! X1 q5 W1 W8 k' G6 c
}
: r) O" ~5 g0 E9 ]5 q0 T, u% z: b
},
- z2 I3 ], O% v
sum++
1 Y; A3 c* z' d \1 v
}
0 [* M4 q+ v; w( Q% O
};
( Q) u% | F5 o! I
i:main(:tm,n:sum,upperlim)=
7 T) P3 D; n2 j c
{
: c2 G/ {5 b. h, a$ G
n=15,
! v1 j* G( A# }9 K" O$ W
tm=sys::clock(),
/ s8 v$ c0 h Z4 u. t; N- F4 E
printff("Queens:{1,i}, ",n),
# e" [# ~" f4 B; ~
upperlim=shl(upperlim,n)-1,
" i8 K* e4 u: J
test(0,0,0),
! ~! F: @# F' K8 I5 b
printff("sum:{1,i}, {2,i}毫秒.\r\n",sum,sys::clock()-tm)
$ e b4 O3 Y* p' p
};
# G- Y9 `: M/ `
复制代码
Forcal运行结果:
. a2 x( _' g. y* E' v
: l5 ~6 C* L9 M) T& @4 H8 a
Queens:15, sum:2279184, 59547毫秒.
4 M& R( Q0 P# ~/ Q- a
4 m! E$ @* H7 y7 o: m; E$ W4 r0 z
例3:一段有趣的程序:此例Forcal速度约为C/C++的1/4左右
- e' e! F0 o! j2 N* M
mandelbrot(x, y : cr,ci,zi,zr,i,temp,zr2,zi2) =
2 Y+ ?+ Z3 k9 J; a( q/ P. t
{
Q$ c7 G+ n( C$ [
cr = y - 0.5,
, N5 J& I4 j0 R- r2 [
ci = x,
0 s8 H# A4 h4 }5 k, Q# N; e1 d( o6 m
zi = 0.0,
; f3 T' O9 Q3 b V, J9 s
zr = 0.0,
0 h4 \, @* q/ m/ N$ d
i = 0,
9 O/ k- b2 C0 V: @3 ~
(1).while {
' m( ]7 i/ J& S {$ A
i ++,
. H3 w% g- o/ ]( w- I, J
temp = zr * zi,
( i# M" f( r' m+ |! j5 w( \
zr2 = zr * zr,
# }/ i( R! V, m4 M* f6 C# L4 @* [
zi2 = zi * zi,
0 P' p# T0 r) {0 |
zr = zr2 - zi2 + cr,
. A8 Y4 s+ p& b l1 a6 s
zi = temp + temp + ci,
4 j) r' I" L4 @! M
if [zi2 + zr2 > 16, return (i)],
' I+ J' g. ]: z
if [i > 1000, return (0)]
3 g' e$ E9 w4 \
}
; U2 A& d7 n7 X' Z4 K
$ D+ r3 F X% _. K. T3 o
};
7 X, }' V: b. Y0 p
main (:i,x,y,old,now) = {
1 Z- S7 R8 N; D: ]0 D6 `! N
old=sys::clock(),
! O- a* ^+ P% h9 E! E. n8 N/ U
y = -39,
0 F; S# Z1 F' z* U8 k4 \. L
while{ y < 39,
& p* s$ V. E0 l+ N8 e) B, o+ U0 @" [# I
printff("\r\n"),
" N* A" ?7 o& D& ~* q
x = -39,
3 U# ]5 M* N! b. x
while{ x < 39,
7 b7 B0 t- e1 L: B9 t4 \
i = mandelbrot(x/40.0, y/40.0),
+ b! c* ^; Z( z- @4 v7 v J6 I
which{ i==0,
0 K4 ~: X$ `3 n
printff("*"),
; s/ \! S& g/ k9 D9 _
printff(" ")
+ ]8 L F% r; T3 z5 ~
},
( O* U; N; ~9 _( ?& Q
x++
* x" R' W6 q4 P
},
% _# f2 _/ M8 V
y++
* y; |8 j4 `5 J* E/ |- A3 P
},
6 E! F3 H2 A6 N
now=sys::clock(),
) W8 Y/ ?7 c8 |; m! c8 v2 U
printff("\r\nForcal Elapsed {1,r}\r\n",(now-old)/1000)
- K! c9 H) x, `# y! V
};
6 o/ A, G1 |; @0 ?4 x+ C9 R$ N
复制代码
- X1 N' y8 J2 ? W3 T9 z
运行结果:
; W" C# S, C8 s8 U, A$ [
*
+ P; f% r: n: o2 M
*
" S$ ?; C% m; ~$ @2 W Z( Q8 Z
*
. ^- U) m. o4 c% J7 w
*
@' E, B. s" n8 V2 \ S
*
" g6 ?: k r5 x* x- a( I
***
4 T7 t8 K, j+ c7 v6 Y; K
*****
/ H: P8 k) L% Q7 |3 @- Z# M9 N. n w
*****
! n# _8 J/ `$ F8 k
***
! b) [- [) ~* c X; B; G$ N9 H
*
4 S7 h6 f1 a/ `% H. W
*********
# q" \8 m7 Z O- d: X, w6 e6 J$ s
*************
v& r# E& K2 u# D( t
***************
3 D6 `) K. d, a9 J4 {1 ?6 v
*********************
4 K R: q& I6 }. x, k0 k
*********************
" Q3 i: Y) p" t/ M" ]; r7 j0 ?
*******************
/ B7 h9 {4 |/ m# y5 Q) U( F2 w
*******************
2 Y+ x% P1 ]$ p2 t- z
*******************
z: V! V2 U1 N' g. R
*******************
1 H' m0 w& l) V8 }( f
***********************
+ f! [# z" w- ?. ^3 p) u" C
*******************
* a! j3 \3 L3 i. Y, k5 R8 g; o
*******************
9 w+ x$ R7 d8 S; u
*********************
0 F4 p7 U0 }/ K
*******************
. f2 I! |) T. ]9 ^6 |' C
*******************
0 V/ L" [5 \7 c( S2 }
*****************
& B6 b' o( W; V1 D) z* p4 _
***************
3 C- I+ A9 q& W6 h# q! J
*************
* }4 _$ I; X+ Z0 A# E( O
*********
{6 ?4 ]* M9 e( ^. y- R7 X; T
*
2 S4 B0 F% ?* F: h5 c/ [
***************
" M g% Z( j# ~3 ?, a' R
***********************
# i8 H! ?* u8 a7 ~3 [3 {0 E
* ************************* *
) f! Y/ s! o+ d" z g& Z
*****************************
. g, c. U3 q. t X, J7 N
* ******************************* *
# }# X3 F5 c1 k5 U$ ~# B% T
*********************************
7 {& L, _; H, |9 o5 Z* x- @& i
***********************************
3 F3 w" W' ~' C& l: y Q$ m: f4 p
***************************************
V. v4 D% @( W. W! x; z9 I, l
*** ***************************************** ***
8 }" j! z3 x& d3 Y: `; f
*************************************************
. Q" P- Y& t3 |, D7 ]/ |9 b# I
***********************************************
& F$ R$ j4 G1 m* `- M
*********************************************
/ D2 ?6 ^" D, n# g n, u
*********************************************
# y5 x* F- T3 j+ ]5 R9 t, {
***********************************************
3 M4 |6 p7 A% t6 I) ^5 ~
***********************************************
1 Z1 j; q8 P2 h+ h( n# J o
***************************************************
3 u* y) Q" L2 f% Y+ T/ f) J
*************************************************
) f' b9 o2 b& r8 a
*************************************************
! z4 ?' ^; `. d8 i2 e+ t
***************************************************
8 p" y' t7 i3 e; W
***************************************************
- g) E' I% I2 u$ r2 q5 d) C- i9 b
* *************************************************** *
* I; a2 t0 y7 Q/ k) `
***** *************************************************** *****
- W- [+ E( ^5 C( T8 J1 v
****** *************************************************** ******
0 t" h; W( {) h# r' i
******* *************************************************** *******
2 i3 f) f0 e6 k6 `/ D$ B
***********************************************************************
7 v4 H# e4 R `: t3 Y0 @+ o, u0 J
********* *************************************************** *********
7 o1 Z& L' K$ ~% \1 m3 c& z
****** *************************************************** ******
2 \. a& `# z0 s0 [
***** *************************************************** *****
# U! n! f C9 i: v
***************************************************
( |% Z9 I+ R1 B
***************************************************
) S) D; m1 ^- p% q
***************************************************
. T& l% q! R! ~9 G% B0 m
***************************************************
' M; b% v5 Q! R: z% ^: T" n
*************************************************
! @, A8 V0 B7 `% r) C2 n' ]
*************************************************
9 s0 ^! X; L8 R5 G6 N0 y
***************************************************
, H6 B+ y' a. o
***********************************************
/ r I( T3 y. K) `
***********************************************
/ Z# z5 F8 ?5 m: Y+ @" O6 m
*******************************************
& d$ Y# d' |: B4 z5 C$ n' }
*****************************************
6 S5 B5 |* b1 S3 N
*********************************************
6 O" ] ?$ c. C! r i# F/ N: |! Z
**** ****************** ****************** ****
# X8 F2 `; o' d7 A) j
*** **************** **************** ***
9 Q6 M+ ]; c$ V; M/ Z8 [
* ************** ************** *
0 v# n/ j; }3 J- W" a
*********** ***********
/ ?3 a7 g1 A, f* D
** ***** ***** **
2 i$ ?. k4 q4 ^+ P' f! y
* * * *
1 y+ `' E5 y' i0 n! D4 _6 L
复制代码
( C' }2 h: F8 ~. I6 ^. a
运行时间为:
! w; ?; K3 S9 N' m0 @0 n* u
2 i" m6 w4 O# w8 R
Forcal Elapsed 1.078
% t5 F8 C# z. ?& V2 l
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5