使用Lambda表示式編寫遞迴函式(效能測試)

2021-09-05 21:44:33 字數 2708 閱讀 6560

為了補充引用資料,現在對之前lambda表示式編寫遞迴函式進行一番效能測試。測試的物件為輾轉相除法求最大公約數,使用以下三種方式計算:

普通遞迴

使用fix

(self, t1 arg1, t2 arg2);

public static class

lambdarecursion

public static

func

self(

self)

}效能比較的工具還是codetimer,測試**如下:

class 

program

static void main(string args)

.foreach(n =>

);console.writeline("press enter to exit...");

console.readline();

}}

我們將三種方法各執行一萬,十萬,一百萬及一千萬遍,結果如下:

normal * 10000time elapsed:   1ms

cpu cycles: 3,348,351

gen 0: 0

gen 1: 0

gen 2: 0make * 10000time elapsed: 2ms

cpu cycles: 5,817,875

gen 0: 0

gen 1: 0

gen 2: 0fix * 10000time elapsed: 16ms

cpu cycles: 39,522,627

gen 0: 7

gen 1: 0

gen 2: 0normal * 100000time elapsed: 12ms

cpu cycles: 31,708,838

gen 0: 0

gen 1: 0

gen 2: 0make * 100000time elapsed: 17ms

cpu cycles: 43,155,337

gen 0: 0

gen 1: 0

gen 2: 0fix * 100000time elapsed: 116ms

cpu cycles: 294,786,352

gen 0: 72

gen 1: 0

gen 2: 0normal * 1000000time elapsed: 125ms

cpu cycles: 316,509,017

gen 0: 0

gen 1: 0

gen 2: 0make * 1000000time elapsed: 171ms

cpu cycles: 431,639,898

gen 0: 0

gen 1: 0

gen 2: 0fix * 1000000time elapsed: 1,161ms

cpu cycles: 2,931,048,868

gen 0: 727

gen 1: 0

gen 2: 0normal * 10000000time elapsed: 1,258ms

cpu cycles: 3,165,804,593

gen 0: 0

gen 1: 0

gen 2: 0make * 10000000time elapsed: 1,710ms

cpu cycles: 4,306,322,216

gen 0: 0

gen 1: 0

gen 2: 0fix * 10000000time elapsed: 11,057ms

cpu cycles: 27,856,077,942

gen 0: 7273

gen 1: 1

gen 2: 0

從執行時間上看,直接遞迴的效能最好,self次之,但相差不大(似乎與call vs. callvirt + 多傳乙個引數的差距差不多),但fix方式消耗的時間就為前兩者的7倍左右了。

從gc壓力上看,直接遞迴與sel對gc都沒有絲毫壓力(在遞迴過程中沒有建立任何物件),但fib由於構建了額外的委託物件,其壓力也相對較大,不過它們都是可以快速**的物件,因此一般也不會對程式效能造成什麼問題。

總體來說,測試結果和料想的結果比較一致。

lambda表示式 lambda表示式

1.概述 c 11 中的 lambda 表示式用於定義並建立匿名的函式物件,以簡化程式設計工作。lambda 的語法形式如下 函式物件引數 操作符過載函式引數 mutable 或 exception 宣告 返回值型別可以看到,lambda 主要分為五個部分 函式物件引數 操作符過載函式引數 muta...

Lambda表示式和Lambda表示式樹

原版來自 linq學習筆記之二 lambda表示式和lambda表示式樹 lambda 表示式 lambda expressions 是linq實現的另一特性。lambda表示式的作用就是使用使用函式式語法,將方法實現關聯到委託例項。在使用查詢表示式 query expressions 時,查詢表示...

Lambda表示式使用2

1.概述 本篇主要介紹lambda中常用的收集器,收集器的作用就是從資料流中生成需要的資料介面。最常用的就是collectors.tolist 只要將它傳遞給collect 函式,就能夠使用它了。在我們使用收集器的時候經常會用到 方法引用 這樣的簡寫語法 方法引用 classname methodn...