2016-08-01 34 views
2

我已經按照我的(回合制)遊戲代碼,其中列出了一個遊戲玩家所有的法律動作功能:列表理解VS List.concat

let moves game = 
    let movesType1 game = ... //returns Move list 
    let movesType2 game = ... //returns Move list 
    let movesType3 game = ... //returns Move list 

    List.concat [ (movesType1 game); (movesType2 game); (movesType3 game) ] 

現在,我不知道會是什麼如果我使用列表中理解和yield!做以下區別:

let moves game = 
    let movesType1 game = ... //returns Move list 
    let movesType2 game = ... //returns Move list 
    let movesType3 game = ... //returns Move list 

    [ yield! movesType1 game 
     yield! movesType2 game 
     yield! movesType3 game ] 

我可能會使用這個功能很多次在某些情況下,所以我有點擔心的表現。

+1

您應該使用序列而不是列表。 –

+3

而不是問,爲什麼不爲自己衡量每一個?您可以在F#Interactive中使用'#time'來執行基本計時。 – kvb

+4

https://ericlippert.com/2012/12/17/performance-rant –

回答

2

下面是一個簡單的測試腳本,測量你的兩個實現之間的時間差:

let test1() = List.concat [ [1..10000]; [1..10000]; [1..10000] ] 

let test2() = [ yield! [1..10000] 
       yield! [1..10000] 
       yield! [1..10000] ] 

let runTest testImplementation = 
    for i in 1..1000 do 
     testImplementation() |> ignore 
#time 
runTest test1 //Real: 00:00:02.353, CPU: 00:00:02.371, GC gen0: 143, gen1: 96, gen2: 1 
#time 
System.GC.WaitForFullGCComplete() |> ignore 
#time 
runTest test2 //Real: 00:00:03.739, CPU: 00:00:03.712, GC gen0: 185, gen1: 185, gen2: 0 
#time 

看來List.concat好一點,但像所有性能的事情,你應該測量,看是否真正的性能優勢對你的用例很重要。