数学建模社区-数学中国
标题:
Forcal运行速度测试例子
[打印本页]
作者:
forcal
时间:
2010-9-27 19:28
标题:
Forcal运行速度测试例子
Forcal的运行效率与Lua相当,是目前最快的脚本之一,但Forcal的扩充性能更好。
* Y. g* H# v( a) O
在大量函数调用时,Forcal更具速度优势。
7 N: ~" j5 c8 @! A) N2 G
以下是Forcal的运行速度测试例子,大家可转换为其他脚本代码(例如matlab)比较一下。
/ p* R6 G7 H- P9 r( l& B% R
9 k j' j5 O& D; o! O& d' F
例1:Fibonacci递归程序(n取40)
7 O* d& X& f6 N5 K: X$ A8 M) q
SetRealStackMax(1000);
. q4 D. y x5 e$ N" o9 V! }5 N% O
F(n)= which{
& u" P/ s) d3 k+ Z- Q
n == 0,
; d, g$ A t: y& l9 K0 \4 @' {
return(0),
% f9 e- b# O* }9 h
n == 1,
: a6 \' ?7 D' q3 n
return(1),
1 T5 z% Z5 M, N7 R( F" W! L
return [F(n - 1) + F(n - 2)]
( |4 D# X0 m% j. ]4 v: q5 H
};
& R8 q" P4 A( ?7 h' R4 v, B
main(:t,n)=
p; h- w4 [6 s6 F9 v: Y0 J
{
6 q) a" |: r' O0 V$ F# F
t=sys::clock(),
9 A6 m6 ~% C" B' _
n=F(40),
+ Y1 g. f0 c% P, w- R
t=sys::clock()-t,
0 N3 G( q8 `2 y A
printff{"\r\nfibonacci={1,i}, fibonacci_Time={2,i}毫秒={3,i}秒\r\n",n,t,t/1000}
9 d0 D( G1 g& g, L$ ?+ V# D
};
* I5 X6 G, \5 [
复制代码
结果:
) k; I" \' A! d0 G# [2 P7 p5 p: o
# ?. h6 s. K' }# V/ U
fibonacci=102334155, fibonacci_Time=41859毫秒=41秒
' d$ K0 m, \ {# j# w' ]( L
3 Y; n" Y! f: O# y1 t# W1 D0 P/ h
例2:八皇后问题
0 n- w- ?. d, ]+ d9 D7 T! V! g
// 在运行不同的程序时,Forcal的速度,从接近C++到只有C++速度的几十分之一。
# }* A9 `/ @, z& E
// Forcal的建议是:对运行时间较长的程序,如确有必要,设计成二级函数由Forcal调用,从而获得接近C++速度的性能。
0 }9 \8 p8 R! U8 h% s
// Forcal与C++是无缝链接的。故C++能实现的功能,借助二级函数,Forcal完全可以实现。
s) h( l1 B* H
// 但没有Forcal支持的C++程序,将无法获得高效率地实时编译计算字符串表达式的功能。
2 D2 }/ ?" z5 W' [9 K/ [2 J, t
// 据测定,以下八皇后问题,Forcal的运行速度约为C++的1/10。
4 H. ]0 S/ ^8 I* B' W r3 H7 {
// 八皇后问题是一个古老而著名的问题,是回溯算法的典型例题。
5 j7 b" s; U, @4 e8 E
// 该问题是19世纪著名的数学家高斯1850年提出:在8×8格的国际象棋盘上摆放8个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
* Z( X& ]9 o+ z
// 高斯认为有76种方案。1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
( M g4 W- g5 ^3 t7 U
// 以下算法是从网上搜来的,该算法没有最终给出排列组合,仅仅给出有多少种组合,但是算法确实十分奥妙。
9 y8 ~% W9 j: p( n
//Forcal源程序
' E. M- \2 G& n0 W1 i2 A
i:(::sum,upperlim)= sum=0,upperlim=1,SetIntStackMax(1000);
' K1 b4 ` f' M$ K) ?
i:test(row, ld, rd : pos,p : sum,upperlim)=
) V; }. T9 J9 A
{
$ }" Z H, `) W
which
) N5 q. Y2 \7 r: I( @! b
{ row != upperlim,
: i6 B% R; A& K3 _0 ]# h9 z
{ pos = and{upperlim , not[row.or(ld).or(rd)]},
2 Q9 O: u7 d) X# z1 X* t
while{ pos,
+ n1 `1 I0 H; e. i- _. y# a% ^, U
p = and(pos,-pos),
( n. x% M/ R$ _, @+ x
pos = pos -p,
9 g! J1 R; [2 D7 T8 E. D1 q3 K
test(row+p, shl(ld+p,1), shr(rd+p,1))
5 j" l+ p! j! @3 w2 {% h/ I
}
# |' W: r/ w+ O* k) s( t
},
* W. ?/ x8 k* }: i$ q
sum++
% t$ C7 i/ H# R, [
}
" H$ R* z) F& Z; C1 x( h0 M
};
. D: R; ~/ D" `# K! B& c
i:main(:tm,n:sum,upperlim)=
- r; t b% W8 y+ f8 j
{
, v, p6 K$ \# O$ G6 ]: {! N1 q. h
n=15,
( E# {8 o0 c/ t; C; w, M
tm=sys::clock(),
. H$ ?& j; u+ u! j5 K
printff("Queens:{1,i}, ",n),
' W; v) P8 `! Q5 K% U* I! _
upperlim=shl(upperlim,n)-1,
- @: q6 G5 f9 C; P- j; f+ ]
test(0,0,0),
* B/ I: H* J- I9 J* \* W, g9 u
printff("sum:{1,i}, {2,i}毫秒.\r\n",sum,sys::clock()-tm)
, n* @# l+ q" a/ a3 h7 q
};
" X& d- J& U" v% X; U+ Y% i/ |
复制代码
Forcal运行结果:
4 m3 |- f2 G' p/ {7 C1 F
* w3 g8 U& d3 _% K8 X- s+ W$ S
Queens:15, sum:2279184, 59547毫秒.
9 _5 R+ \2 K7 |5 u4 n5 f) z1 R
2 d) @( c: u: J
例3:一段有趣的程序:此例Forcal速度约为C/C++的1/4左右
- U# W5 p$ h: k; Y: m3 q( i* J
mandelbrot(x, y : cr,ci,zi,zr,i,temp,zr2,zi2) =
* e9 A0 ]* @. u) u
{
* R7 e% X; W& H: t! }$ V
cr = y - 0.5,
) c, J6 {: Y( _3 |# l7 l3 Y9 _
ci = x,
6 u+ n. f$ Q8 R9 K2 t+ Q+ @
zi = 0.0,
; t6 y: c/ h# N" M
zr = 0.0,
/ C5 J! J9 c- r& m& e/ }
i = 0,
; J2 x* J% r8 k; t6 C
(1).while {
+ Y' n9 b% R# }3 j: T8 n
i ++,
, o T3 ~' t4 h( K% t
temp = zr * zi,
% c( I5 e* R) c6 s m0 c
zr2 = zr * zr,
& |; ^- t/ q8 b% j9 l# m: s
zi2 = zi * zi,
6 K: P, ~; K0 b6 {* z( {
zr = zr2 - zi2 + cr,
- @" q* c5 g+ `4 W; G
zi = temp + temp + ci,
) L1 _4 l6 T$ N% I* W9 p
if [zi2 + zr2 > 16, return (i)],
7 K( {! \5 P8 |) j1 R: J0 o
if [i > 1000, return (0)]
* R! a: t$ A1 F; T. y, h" w
}
, M9 T; q% V. F% \) s
. P3 S C: d, P; s* r3 p
};
: y( {4 X5 L/ D
main (:i,x,y,old,now) = {
- u: b% q, k5 O4 M F
old=sys::clock(),
9 g; @9 g/ @2 f6 d( X' E# N
y = -39,
9 L' [6 T N5 c" }+ `
while{ y < 39,
, c* d; j. |0 ?7 w1 t
printff("\r\n"),
% j: K2 X' D; h7 T [1 {! V) Z
x = -39,
! U/ G: w$ n4 W8 n
while{ x < 39,
/ ^9 j: \1 x" \: E* \
i = mandelbrot(x/40.0, y/40.0),
/ `' f4 ^# ~# @6 b2 y
which{ i==0,
% Y& u; Z( N- n! x# M, _' A
printff("*"),
" H- U+ l3 Z- y/ L
printff(" ")
6 A0 |( \$ z& @" M! M0 L
},
6 ?3 e$ P) d. C4 Z! ~+ F) G
x++
. q7 C9 s$ K6 u* V) ?
},
. J7 g# h7 ], q; q- Z1 v( B$ N4 n
y++
, j" |, v6 W' ?5 G3 }5 Q" B& ]3 H/ k
},
" X% u$ a c3 G& W/ K2 W* L( k
now=sys::clock(),
6 `* v8 E2 F9 A2 U& j, _
printff("\r\nForcal Elapsed {1,r}\r\n",(now-old)/1000)
- h N8 c% H/ n' ^# ^* u
};
1 w4 E, q/ I5 Z
复制代码
: i8 A3 D- s" K8 t. d# {: Y4 Z
运行结果:
4 m1 r* F5 `9 b+ d1 q
*
% P ~) ?( l! K1 k; H# Z
*
- _! i) N5 _. v$ \+ ]
*
( C: H( u; O$ V
*
0 d! D2 [) w( u q, u4 R3 {6 ], e
*
2 q- r/ q- r3 E+ @" j
***
. `: t: v9 s& D- w6 u4 x7 G8 ^
*****
) A( N$ Y) g+ q" y# X6 A
*****
% ^! G8 h; X* U9 Y5 Q
***
: k) B( [8 i+ h, N" p: a
*
3 E- Z! T7 }! _% v% q' ?
*********
0 x$ w/ n; H9 Y) i) h
*************
! N8 I2 w3 R8 V% y* Q
***************
9 V1 C7 k; B( ~1 h
*********************
* p! k& H% t3 X! O
*********************
& L! z$ k" O; t9 l) `
*******************
: X: ?+ J* g9 ]3 J# {
*******************
+ U( g' s/ d2 ]
*******************
7 c7 h0 G2 A! I5 ?! ?
*******************
( o5 W: L1 Q7 O1 J
***********************
2 F a$ m" d4 d) }$ N0 |. R
*******************
2 p i* E0 g! c7 p) ^# b0 W
*******************
9 g' a: F, j# P7 e
*********************
9 X* f3 u `$ r1 g Q) p0 u w
*******************
! v) T( |- d1 L1 _' E# a
*******************
8 b5 Y5 n3 v; {) n0 W
*****************
- a6 ?& p- S2 K+ ?
***************
; r- v# `) H% d: @+ f3 G& L7 M
*************
3 {2 ]8 Y2 K3 f: d
*********
1 W7 ?4 |; \) v, h
*
6 p/ J$ G) R6 N! q$ f/ d% E
***************
; P. B: q: q5 G
***********************
- e( G1 X9 T$ w
* ************************* *
' D/ M, ?7 _( R5 Y7 G% L$ c: d. ~
*****************************
) N1 x& a& d* n' Y
* ******************************* *
( {: N* s/ [6 v% p6 ^
*********************************
! s% T2 p0 V9 i% Z$ E+ p
***********************************
' }% w( Q6 I) f+ w) u% v
***************************************
' U* ?: @; p4 K1 I
*** ***************************************** ***
8 j1 t. |6 {" ~* g, M
*************************************************
( y3 r) |- N J& D
***********************************************
- M( ]( V0 [7 L6 \
*********************************************
/ c+ L0 F; d6 V2 P% ?5 p' z; W
*********************************************
9 y2 u0 H+ n9 d. A) |: K
***********************************************
4 |; f& U6 B) ^+ Q2 k
***********************************************
% a/ z# G! [& n; q2 M
***************************************************
9 W+ l6 i5 l& T% @
*************************************************
3 V$ B& x) t& U/ L% n
*************************************************
, E6 g, C& O% k1 ^6 ^, q2 C
***************************************************
5 V; h! N' q5 t' i( z& F* m& p
***************************************************
" y2 k. \8 k0 H+ g* M2 w/ e
* *************************************************** *
2 K# T8 H2 V% g7 _. H! Z- [! i
***** *************************************************** *****
1 o% a2 w4 T# Z" N
****** *************************************************** ******
9 t/ y8 s4 {! c
******* *************************************************** *******
& {6 V9 J1 c- \ D) h, k
***********************************************************************
* C* E: J* d6 g3 T8 N @4 m/ v: A |3 o
********* *************************************************** *********
/ Q, W6 R* |1 A+ d- j/ U
****** *************************************************** ******
7 O( @$ s1 D* ?
***** *************************************************** *****
. I* r7 A1 Y( u$ Y* }3 i Z9 `
***************************************************
4 y+ E# \! z/ h; U' f
***************************************************
) @: M2 d. t; b. r
***************************************************
8 q8 `+ _9 o" N2 G0 f$ x; Z, i6 P
***************************************************
/ A3 Z' E$ G% v2 X0 H
*************************************************
+ n4 C; I0 `- a& \0 I) i
*************************************************
2 _ a- [5 V: b
***************************************************
- U* ?0 b+ P1 ?
***********************************************
3 H$ ~- D0 z, Z" F v5 n4 y
***********************************************
) k; \3 g# A& K1 Q! T( b
*******************************************
; o$ [& r+ F/ |* h: O
*****************************************
$ D5 k1 R- }, t; Z+ o G& n9 I5 w
*********************************************
! w+ g4 N& {5 F8 V
**** ****************** ****************** ****
9 Q0 `/ [7 Z) B w, g I
*** **************** **************** ***
8 I7 b; I5 |$ i, y
* ************** ************** *
) V( M' V( N5 H* C4 q+ x
*********** ***********
- t: _7 g- l3 g1 u! {
** ***** ***** **
2 ~+ U/ D8 P& F+ G. F( u
* * * *
+ u0 l6 w6 ^& I2 N
复制代码
4 X1 }1 q8 s; c% ?
运行时间为:
( _. r) V& P) w
) H/ ? J' h) G# q' E0 q3 W$ S
Forcal Elapsed 1.078
r3 l0 O% q0 x; F, U
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5