net的运行功效测试

昨天的稿子《用JScript.net写.net应用程序》一文写了今后,对于其运营成效难点有了一点疑心,所以需求开始展览以下测试,前人当然做过大多种测试,但是bigtall的测试方法有个别不一样。这里本人利用了斐波纳契的七个算法,二个是递归达成,多少个是迭代落到实处。采取斐波纳契的理由如下:

  1. 它是三个复杂度为O(2n)的算法,总结量丰富大
  2. 同样的计量,递归和迭代的第二差距是货仓的拍卖,大家也得以而且相比一下见仁见智语言在调用函数之间的效能差异。
  3. 代码简单,而且算法轻易通晓。区别测试代码之间的差别也小,不轻松起争议。

测试运维时候思量到如下的图景:

  1. 率先次系统装入是从磁盘装入,而后一回则是一向从磁盘缓存装入,所每一种测试一连运维玖次,第叁次时间不计入。
  2. wwwlehu6.vip乐虎官网,因为IO库完毕功能差异,所以算法代码中不存在别的IO调用,纯总结代码。

加入相比较的言语包涵c,c#,标准的javascript,JScript.net,后来感觉不舒服,把java陆也拉长了。加上bigtall本人写的3个划算时间的小程序和批处理,一共1二段代码,表示如下:

fibc.c fib2c.c

long Fib(long n)
{
    if (n <= 1) {
        return n;
    } else {
        return Fib(n – 1) + Fib(n – 2);
    }
}

void main()
{
    int i;
    for(i = 0; i < 10; i++)
        Fib(30);
}

long Fib(long n)
{
    int i;
    long a = 0, b = 1, c=0;
    if (n <= 1) {
        return n;
    } else {
        for (i = 2; i <= n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
}

void main()
{
    int i;
    for(i = 0; i < 26925370; i++)
        Fib(30);
}

fibcs.cs fib2cs.cs

public class A
{
static long Fib(long n)
{
    if (n <= 1) {
        return n;
    } else {
        return Fib(n – 1) + Fib(n – 2);
    }
}

public static void Main()
{
    for(int i = 0; i < 10; i++)
        Fib(30);
}

}

public class A
{
static long Fib(long n)
{
    int i;
    long a = 0, b = 1, c=0;
    if (n <= 1) {
        return n;
    } else {
        for (i = 2; i <= n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
}

public static void Main()
{
    for(int i = 0; i < 26925370; i++)
        Fib(30);
}

}

fibjava.java fib2java.java

public class fibjava
{
static long Fib(long n)
{
    if (n <= 1) {
        return n;
    } else {
        return Fib(n – 1) + Fib(n – 2);
    }
}

public static void main(String[] args)
{
    for(int i = 0; i < 10; i++)
        Fib(30);
}

}

public class fib2java
{
static long Fib(long n)
{
    int i;
    long a = 0, b = 1, c=0;
    if (n <= 1) {
        return n;
    } else {
        for (i = 2; i <= n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
}

public static void main(String[] args)
{
    for(int i = 0; i < 26925370; i++)
        Fib(30);
}

}

fibjs1.js fib2js1.js

function Fib(n)
{
    if (n <= 1) {
        return n;
    } else {
        return Fib(n – 1) + Fib(n – 2);
    }
}

for(var i:int = 0; i < 10; i++)
    Fib(30);

function Fib(n)
{
    var i;
    var a = 0, b = 1, c=0;
    if (n <= 1) {
        return n;
    } else {
        for (i = 2; i <= n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
}

for(var i:int = 0; i < 26925370; i++)
    Fib(30);

fibjs2.js fib2js2.js

function Fib(n:int):int
{
    if (n <= 1) {
        return n;
    } else {
        return Fib(n – 1) + Fib(n – 2);
    }
}

for(var i:int = 0; i < 10; i++)
    Fib(30);

function Fib(n:int):int
{
    var i:int;
    var a:int = 0, b:int = 1, c:int=0;
    if (n <= 1) {
        return n;
    } else {
        for (i = 2; i <= n; i++) {
            c = a + b;
            a = b;
            b = c;
        }
        return c;
    }
}

for(var i:int = 0; i < 26925370; i++)
    Fib(30);

ptime.cs cp.bat

public class A
{
    public static void Main()
    {
        System.Console.Write(System.DateTime.Now.Ticks);
        System.Console.Write(‘,’);
    }

}

@echo off
cl /O2 fibc.c
cl /O2 fib2c.c

csc /o+ /debug- fibcs.cs
csc /o+ /debug- fib2cs.cs

jsc /fast- /debug- fibjs1.js
jsc /fast- /debug- fib2js1.js

jsc /fast+ /debug- fibjs2.js
jsc /fast+ /debug- fib2js2.js

"%JAVA_HOME%\bin\javac" -g:none fibjava.java
"%JAVA_HOME%\bin\javac" -g:none fib2java.java

echo 编译完成

call:run fibc
call:run fib2c
call:run fibcs
call:run fib2cs
call:run fibjs1
call:run fib2js1
call:run fibjs2
call:run fib2js2
call:run "%JAVA_HOME%\bin\java" fibjava
call:run "%JAVA_HOME%\bin\java" fib2java
echo finish!

goto end
:run
echo =================================
ptime & %1 %2 & ptime & echo %1 %2 1
ptime & %1 %2 & ptime & echo %1 %2 2
ptime & %1 %2 & ptime & echo %1 %2 3
ptime & %1 %2 & ptime & echo %1 %2 4

:end

运营测试的结果如下表格所示,表格内部黄铜色的4组数据分别为一,二,叁,四测试数据,蟹青数据为后叁组测试结果的平平均数量,紫铜色数据为相对C语言运维耗费时间的比重,最终1行血牙红纵比数字为同样语言【单次】递归和迭代算法的耗费时间比例。时间单位为百分之1秒:

 

C

C#

java

js

JScript.net

递归
(10次)

119
49
48
49

486
439
461
441

2258
520
467
464

75397
75327
76424
74228

1571
1501
1502
1499

48.67

447

483.67

75326.33

1500.67

1

9.18

9.94

1547.70

30.83

迭代
(26,925,370次)

120
49
47
46

5261
5041
5040
5039

7880
7769
7762
7766

125786
127117
127273
127541

9196
9101
9086
9121

47.33

5040

7765.67

127310.33

9102.67

1

106.48

164.06

2689.65

192.31

纵比

0.97

11.28

16.06

1.69

6.07

经过,大家见到,若是横向相比,以C语言运转速度为正式,递归运算的时候,C#和java的进程都慢了靠近10倍,JScript.net慢了靠近3一倍,js因为运用了运转时绑定,速度慢了1500倍之多;而只要化解了函数调用,使用纯总计代码的迭代算法的周转时刻上,各个语言相差更加大,而且鲜明C#代码比java快(这里未有思念基础类库装入的异样,因为M$对.net有预装入),最差的照样是javascript,然而看起来不带调用的末期绑定就像越来越快1些。可是令人欣喜的是JScript.net的编写翻译优化做的不易,速度算是非常的慢了。

纵向相比前边,大家供给对算法实行一下分析,通过轻便的代码,大家得知fib(30)的递归调用次数为26九二五三九遍,10次重复正是269253陆拾伍回。那几个正是递归和迭代算法的区分所在,可是我们把迭代的次数也设定为26925370,以裁撤函数调用的出入,杰出代码的线性运营差异。通过对代码的解析,大家得出代码特征的总计报表:

  递归 迭代
赋值语句 3 120
变量分配 2 4
函数调用 2 0
返回 2 2
条件判断 1 30
跳转 1 30
累计 11 186

迭代算法和递归算法相比较,显著代码量较大,其代码规模大概是递归的186/1壹=1陆.玖倍。但是运营时刻中除去java呈现出了那九二十分比之外,别的都比那几个比首要小。C语言甚至时间越来越短,若是不考虑测试绝对误差,唯壹合理的讲授应该是代码优化难题,因为编写翻译器和CPU都有优化代码的力量,可是鲜明无论是哪个种类优化,都爱莫能助越过函数调用实行优化;C#比java要快,是还是不是表达C#的优化器比java要好一些呢?不过JS代码的多个比例值有点让本人难住了,不过也毫不不可解释,因为js代码中间能够优化的地点莫过于是太多太多了。

结论:

  1. C作为一种老牌的中高端语言,优势没得说。
  2. 递归少用,尤其是JavaScript,连函数调用都尽量收缩一些。
  3. 正文的最要害指标,假若用JScript.net做1般应用程序,成效应该属于能够承受的限量,可是绝对不要实行数值总结。
  4. 之前看过哪些java只怕C#运作成效能够高达C语言的十二分7之类的作品,现在看来是有水分的,假使只是相比较编写翻译器的频率,笔者看反差依旧综上可得的。看来枪手文章依旧要小心啊!

其它给诸位看官提3个纤维请求,假如哪位对python,ruby,perl等耳熟能详的,用平等算法做贰个测试如何?

本文章算法参考了浅议Fibonacci(斐波纳契)数列求解

========================================

2006-1一-1六一七:30改造迭代部分的循环次数为26玖二伍叁陆十九回,重新校对相关测试的日子和局地结论。10分多谢装配脑袋的唤起。多谢!另外对从前给大家的误导表示歉意!

You can leave a response, or trackback from your own site.

Leave a Reply

网站地图xml地图