2016-08-01 15 views
2

Ich habe folgende Funktion in meinem (turn-based) Spiel-Code, der alle rechtlichen Schritte für einen Spieler in einem Spiel auflistet:Liste Verständnis 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) ] 

Jetzt frage ich mich, was wäre, wenn die Differenz verwenden I Liste Verständnis und yield! zu tun folgenden:

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 ] 

ich könnte diese Funktion viele Male in einigen Fällen verwenden, so dass ich ein wenig besorgt über die Leistung.

+1

Sie sollten Sequenzen anstelle von Listen verwenden. –

+3

Anstatt zu fragen, warum nicht jeder für sich selbst messen? Sie können '# time' in F # Interactive verwenden, um das grundlegende Timing durchzuführen. – kvb

+4

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

Antwort

2

Hier ist ein einfaches Testskript der Zeitdifferenz zwischen den beiden Implementierungen Messung:

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 

Es scheint List.concat ist ein bisschen besser, aber wie alle Leistungs Dinge, sollten Sie eigentlich, wenn die Leistung Nutzen messen, um zu sehen Angelegenheiten zu Ihrem Anwendungsfall.