2016-08-01 3 views
2

я следующая функция в моей (пошаговой) код игры, в котором перечислены все законные шаги для игрока в игре:Список постижение против 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

Вместо того, чтобы спрашивать, почему бы не измерить каждый для себя? Вы можете использовать '# time' в F # Interactive для выполнения базового времени. – 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 немного лучше, но как и все вещи производительности, вы должны измерить, чтобы увидеть, если выигрыш в производительности на самом деле имеет значение для вашего прецедента.

Смежные вопросы