数学建模社区-数学中国
标题:
Forcal运行速度测试例子
[打印本页]
作者:
forcal
时间:
2010-9-27 19:28
标题:
Forcal运行速度测试例子
Forcal的运行效率与Lua相当,是目前最快的脚本之一,但Forcal的扩充性能更好。
$ @! `/ V* H$ O7 O6 F) A* V1 R8 e
在大量函数调用时,Forcal更具速度优势。
2 ?2 _; c0 b2 p2 ~2 Y9 D
以下是Forcal的运行速度测试例子,大家可转换为其他脚本代码(例如matlab)比较一下。
* i6 M% {# T, L1 Z7 Y- w$ q
5 R1 k5 }5 u! `6 l4 R9 T! Y0 K
例1:Fibonacci递归程序(n取40)
( ?) I$ \, J, M0 T# t: n
SetRealStackMax(1000);
3 |0 V# \, X( f7 |' F. `
F(n)= which{
p# r. S7 D9 d# U
n == 0,
% q B2 j' K7 f& k! _. X) p) t
return(0),
+ U6 o R$ \7 }
n == 1,
! h+ _8 C2 @0 F( J( D5 s
return(1),
: ~# q `6 [. k. {! n/ D X
return [F(n - 1) + F(n - 2)]
s" ]% B5 [: D {
};
& ~' K8 ^/ Y5 Y. _* ]8 x
main(:t,n)=
: ]) l! l( D$ l
{
( e2 |& l$ i! z8 d! _+ M
t=sys::clock(),
* s2 d# D1 N, R% ^! a. {: w
n=F(40),
) C" a( Z2 M8 M( r+ _
t=sys::clock()-t,
* \! S* b5 t0 X
printff{"\r\nfibonacci={1,i}, fibonacci_Time={2,i}毫秒={3,i}秒\r\n",n,t,t/1000}
: g' S" I0 q) ~* i( L9 z& h
};
$ ]6 t7 ], W; U5 o9 Q) F c8 W! D: H
复制代码
结果:
. D8 G3 B# w- c( R, i' L
7 J0 B* K; w% O# h
fibonacci=102334155, fibonacci_Time=41859毫秒=41秒
. Z- T4 ?+ \9 t" y k7 j+ @6 x
8 \2 R: z6 s$ P+ Y
例2:八皇后问题
$ f+ |$ U5 h4 h }) ^5 T
// 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。
. J/ R+ R* S' ]
// Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。
3 I$ i# U$ B! Q7 A. P. T" b
// Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。
- E2 ^- H) y2 Y
// 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。
5 i. V/ f+ F0 I; y
// 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。
# n- v. z" _# z. G) s
// 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
, q( K3 V w& u6 r4 P
// 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
; u- T- ~5 r5 `
// 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
3 j/ ~( u4 G) P9 }
// 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。
: c' O% _" s, T) W
//Forcal源程序
( m; W+ N( R# d$ w+ p7 n* k; A9 {
i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);
* A& U) K$ {* \% z/ _7 ^: n/ ]
i:test(row, ld, rd : pos,p : sum,upperlim)=
5 w `5 {; h" ^% b) S8 M) F! R
{
( c X2 F0 W5 X
which
. k- T0 P: g& z9 f3 U4 y8 }' K( u
{ row != upperlim,
4 ?9 {; l- C1 `5 X T( H9 a
{ pos = and{upperlim , not[row.or(ld).or(rd)]},
- J! S0 Z& B4 x
while{ pos,
9 J& c: I8 K+ h" O& H, U, @$ Q* Q
p = and(pos,-pos),
# y, L. N8 A$ {! i
pos = pos -p,
" p1 I& C+ t/ w0 |3 J+ f+ e: ?
test(row+p, shl(ld+p,1), shr(rd+p,1))
$ J. h9 o# l# X* @ O
}
1 R- g( G3 s+ K Q1 g1 C8 m6 V
},
- L% I8 ^0 y( h
sum++
% u' q7 K p8 G# ]4 L7 q }
}
# h/ g2 l E" n. [/ J! W- P
};
9 a8 P0 r W) m. E' J2 C
i:main(:tm,n:sum,upperlim)=
. j* Q/ \0 g4 l- T" }
{
- c1 V! |, w: g0 i, R
n=15,
Z, b3 n2 o7 @; @- b
tm=sys::clock(),
( s2 n9 n9 f9 e8 i/ g" h5 n" t
printff("Queens:{1,i}, ",n),
$ S' Q/ {& E/ X+ H
upperlim=shl(upperlim,n)-1,
4 q3 M3 x" P& k/ [
test(0,0,0),
, F2 s$ U$ u! r. Y, [
printff("sum:{1,i}, {2,i}毫秒.\r\n",sum,sys::clock()-tm)
# \/ |0 J" p8 O) o) r
};
& n8 s, `0 w2 a9 [- C e' }0 ]
复制代码
Forcal运行结果:
) ^1 i, v3 _3 H' Y+ C' W
2 ]- g% i. U& b3 z/ R/ Z
Queens:15, sum:2279184, 59547毫秒.
+ n# c' D" H, g- J v
' d$ e% q' c* J8 s; o* ]
例3:一段有趣的程序:此例Forcal速度约为C/C++的1/4左右
: ]- Q. U9 [3 S) q! q
mandelbrot(x, y : cr,ci,zi,zr,i,temp,zr2,zi2) =
" ?, r: k7 H, K6 @ a
{
9 M, j8 {6 n9 ?6 B# ~- k$ W
cr = y - 0.5,
5 C' b9 G _8 V' R+ H7 x
ci = x,
9 |7 l# _: p, G1 h `( }
zi = 0.0,
5 q0 s3 M \& p; l" m2 c
zr = 0.0,
; U- e% K) |; _) S
i = 0,
% a* D( f1 ?0 A% P) b) s3 ~
(1).while {
: I! o2 l4 C. D' r7 B; {
i ++,
. g2 L* `+ j' t: o2 B
temp = zr * zi,
`8 {' `2 [' V; E" |! H* I
zr2 = zr * zr,
/ L3 Y' U9 W7 U8 p" N) I
zi2 = zi * zi,
5 K0 ]2 B1 x# i. ]
zr = zr2 - zi2 + cr,
( x% \4 Y: I; _3 H4 J. _$ c5 c
zi = temp + temp + ci,
& M6 O9 [/ H4 _" r1 W. a* l
if [zi2 + zr2 > 16, return (i)],
* x- d# d# C7 f) }
if [i > 1000, return (0)]
, }% E0 a( f" x. N( y
}
2 X7 i2 d5 O' I
+ X; y4 X D5 x# l
};
+ A. h- I: D4 Y; F! D$ v5 R- v
main (:i,x,y,old,now) = {
; r- w7 b* q4 M3 @/ F3 U) r
old=sys::clock(),
5 S" @- [1 G; `. J9 v0 ~
y = -39,
+ W u' M( g$ A7 z* X; O/ ^
while{ y < 39,
+ S' D/ `" b( V4 S; n6 @: U
printff("\r\n"),
, _. ^: _0 P4 V2 i1 @
x = -39,
$ v& w, g6 V# m3 Z
while{ x < 39,
% H! p8 W/ X" Q- o. P
i = mandelbrot(x/40.0, y/40.0),
1 |1 X8 N% L2 X9 K' O
which{ i==0,
R% [+ R# j$ n! J! [9 C7 e+ Y3 N
printff("*"),
" K" a7 X" J+ D& U2 G( {9 p _
printff(" ")
3 W9 x2 [9 R& C+ ?
},
$ v' M1 c0 O7 E6 ]
x++
1 y7 {% J c" z+ X$ c
},
" I& e# ?" b1 u
y++
2 e0 a6 x9 M* G6 i( b0 o
},
$ c4 ~" G; L* j
now=sys::clock(),
3 X' ]( W2 Z- {+ J
printff("\r\nForcal Elapsed {1,r}\r\n",(now-old)/1000)
% u* h# J! n5 B1 m
};
% P& S% a6 A/ {. Z* u2 }( j
复制代码
7 [) }( j8 `6 A
运行结果:
' i4 l, x ?5 r# _8 B+ k! b
*
- i9 e3 H% X0 P+ C( Z
*
5 y& u6 ^- a" ^9 T( N! w) M
*
3 o" _3 E# T; a6 D
*
* f- d2 X1 H8 o7 ?# q7 J
*
' G, p7 l; H: M+ m0 Z+ d
***
' @' V! B! I" }! i
*****
6 ^; `; \: k! g* g9 O+ F
*****
% S4 h/ J+ P8 ` T; P/ |& E
***
; N: D% ?" C% ~7 R5 X- Q- ?
*
3 n( r0 ]/ Y0 O6 H/ F1 O
*********
# D& O- o+ {3 \% S' _" F+ ^
*************
: u6 d9 v" M( r* ]7 y7 V$ n4 s
***************
8 R- I# a" `9 L* r
*********************
' a$ V: v1 R; H! i/ M' c
*********************
( p9 B7 T" ~3 B
*******************
5 k4 _# K( e9 F; Z
*******************
( i) Q! v Q' L4 X; ~
*******************
8 }5 s$ D# ?1 M+ z# v; q, u
*******************
9 [+ e* [( M4 `* T. j [
***********************
. h: p" j' w$ e
*******************
# d+ f" u' [" y# @4 ^3 ^: r; a
*******************
( e Y( I. c! G& o8 y
*********************
" N: {! r5 Q7 |7 I' e: o' B0 o9 t
*******************
8 @( R# T2 V* e4 s) ]
*******************
* l1 t+ _4 A0 g9 g3 y
*****************
6 T: i2 i2 y V0 K& j
***************
- ?3 _% k4 F7 ?7 _( e7 N
*************
! P: {+ @5 B1 J7 _: o {- p
*********
" ?0 ^6 S$ e: h3 o
*
& ^) V% {$ x: U+ _
***************
1 f5 D) _! {3 ?( O0 U) K
***********************
- T/ S/ y" g/ @- Y: v
* ************************* *
0 O, x0 e! O0 P9 }# h: s& p
*****************************
* t8 _) v- H* c# d
* ******************************* *
1 T H( W' ]: b! ~
*********************************
1 K, E8 Y# }- G* P9 D+ J/ c6 m
***********************************
8 G6 W+ I9 s! t1 ~
***************************************
. I+ N, x( K$ C
*** ***************************************** ***
* `6 x, Z2 x( Y" T
*************************************************
1 Z. Z9 _. }& `$ D6 O9 J: x
***********************************************
. ]" c" ~- ?% j. F& A
*********************************************
* t, a; |6 o; {5 [$ {4 |
*********************************************
2 ~: F% j! R+ |5 \
***********************************************
@7 U, m: q# @
***********************************************
: J3 d6 v) U: r% p1 Z8 f; Y
***************************************************
9 b) ~) P! s, t2 S: Z1 J2 D
*************************************************
" @# J! h3 q' s! `* i, J
*************************************************
% S1 L% ~) P; ~- s2 _$ k- W& O6 m R
***************************************************
8 z% q6 P5 b* C
***************************************************
; ]. ?7 t) `2 W X' G# e
* *************************************************** *
t' b. l" s4 c- d; k. a: o5 Y \
***** *************************************************** *****
0 Z* c& K# a; ?. d5 D, i3 G
****** *************************************************** ******
# R. O8 `7 X. \; ^7 t( b- x! ^
******* *************************************************** *******
2 J* N$ I- ?/ R3 \) B7 y* T
***********************************************************************
% a: j3 e4 z7 t6 F3 _" {9 C6 j
********* *************************************************** *********
W" Y; |3 N: k
****** *************************************************** ******
! c: Y) D; B* e! ?4 i+ |. I, ?
***** *************************************************** *****
; L q7 r" U7 [/ T. @, y" F
***************************************************
# m$ `; G- g2 j# P
***************************************************
2 R! A6 A, q1 H: |
***************************************************
a4 V- \) b! A
***************************************************
4 k0 g# D+ m- M4 n
*************************************************
5 z$ D3 s( U" g+ L! V) _
*************************************************
5 J6 K" _7 `2 m, `9 ]$ k
***************************************************
$ o4 x1 |. U1 B7 A- p
***********************************************
1 f% s( W% _/ A
***********************************************
. T% X/ l# \ Y$ p. B
*******************************************
; V9 A3 l9 p) t% h
*****************************************
/ M, }4 Q4 ~/ m- t7 s$ U# ~
*********************************************
* r/ P" j/ |2 M
**** ****************** ****************** ****
$ S, s$ _) F- t, g3 s
*** **************** **************** ***
+ |- ]9 n; J r6 I) w. E" _9 w9 O) q
* ************** ************** *
8 }. |: r! U) | w. s6 G
*********** ***********
! v! d9 d6 ]* k3 Z# ]& y4 R
** ***** ***** **
& L* X" c6 `6 O1 E
* * * *
6 C' e( v3 `, G9 E
复制代码
+ q) g0 B! z: w8 `. q: Y" g$ a
运行时间为:
" @3 n* Q& B7 j1 H8 E" x
7 z) w% Q) X: o- t: \
Forcal Elapsed 1.078
+ C" a+ o: E9 H- `" G/ R2 n
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5