编程语言EF速度测试(3):fannkuch
这是一个专门的编程语言/编译器速度测试/对比网站(http://shootout.alioth.debian.org/)给出的题目,
以下是EF源代码:
//fannkuch public final class 启动类 <作者 = "liigo"> { public static main() { int n = 11; int time = 运行环境.取启动时间(); 控制台.输出("Pfannkuchen(", n, ") = ", fannkuch(n), "\n"); 控制台.输出行("time(ms): ", 运行环境.取启动时间() - time); 控制台.输入文本(); } static int fannkuch(int n) { int[] perm = new int[n]; int[] perm1 = new int[n]; int[] count = new int[n]; int flips; int flipsMax; int r; int i; int k; int didpr; int n1 = n - 1; if( n < 1 ) return 0; for(i=0; i<n; i++) perm1[i] = i; /* initial (trivial) permu */ r = n; didpr = 0; flipsMax = 0; for(;;) { if( didpr < 30 ) { for( i=0;i<n;i++ ) 控制台.输出(1+perm1[i]); 控制台.输出行(""); didpr++; } for(;r!=1;r--) { count[r-1] = r; } if(!(perm1[0]==0 || perm1[n1]==n1) ) { flips = 0; for( i=1;i<n;i++ ) { perm[i] = perm1[i]; } k = perm1[0]; /* cache perm[0] in k */ do { /* k!=0 ==> k>0 */ int j; for( {i=1; j=k-1;}; i<j; {i++; j--;} ) { int t_mp = perm[i]; perm[i] = perm[j]; perm[j] = t_mp; } flips++; /* * Now exchange k (caching perm[0]) and perm[k] */ j=perm[k]; perm[k]=k; k=j; } while(k != 0); if( flipsMax < flips ) { flipsMax = flips; } } for(;;) { if( r == n ) { return flipsMax; } /* rotate down perm[0..r] by one */ int perm0 = perm1[0]; i = 0; while( i < r ) { k = i+1; perm1[i] = perm1[k]; i = k; } perm1[r] = perm0; count[r] -= 1; if( count[r] > 0 ) { break; } r++; } } } }
这个EF程序,在我的机器上,运行耗时约 37 秒。相应的VC6最佳优化后运行耗时约 5.8 秒。
其它编程语言/编译器的表现,请看这里:http://shootout.alioth.debian.org/gp4/benchmark.php?test=fannkuch&lang=all
总的来说,EF表现不坏。比不少编程语言(如C++, JAVA, C#, D, Fortran, Pascal)慢很多,又比另外不少编程语言(如Erlang, Python, Ruby, Perl, PHP, Lua, Groovy, SmallTalk, JavaScript)快很多。
进一步分析的话:EF作为编译型语言,通常比其它编译型语言都慢(毕竟EF编译器尚未优化),最多慢7倍;EF通常比解释型语言都要快,往往快数倍、数十倍,以至上百倍。
还有很多测试题目,有时间再继续。想了解EF语言,请到EF官方博客:http://blog.csdn.net/efdev/