Кажется, что построение цитат с использованием синтаксиса <@ @>
ужасно неэффективно. Например, создание списка целых чисел
let q1 = List.foldBack (fun n acc -> <@ n :: %acc @>) [1..100000] <@ [] @>
Real: 00:00:05.714, CPU: 00:00:05.937, GC gen0: 234, gen1: 47, gen2: 1
Мало того, что приведенный выше код работает очень медленно, но и производительность памяти также низкая
Напротив, следующее быстрее, но все еще плохо с точки зрения памяти
let q2 =
let (NewUnionCase (cons, [_;NewUnionCase (nil, [])])) = <@ [1] @>
List.foldBack (fun n acc -> Expr.NewUnionCase(cons, [ <@ n @>; acc])) [1..100000] (Expr.NewUnionCase(nil, []))
Real: 00:00:02.352, CPU: 00:00:02.343, GC gen0: 296, gen1: 10, gen2: 0
Наконец, использование простого старого Expr
значительно лучше (хотя и не так быстро, как я ожидал)
let q3 =
let (NewUnionCase (cons, [_;NewUnionCase (nil, [])])) = <@ [1] @>
List.foldBack (fun n acc -> Expr.NewUnionCase(cons, [ Expr.Value(n, typeof<int>); acc])) [1..100000] (Expr.NewUnionCase(nil, []))
Real: 00:00:00.370, CPU: 00:00:00.375, GC gen0: 8, gen1: 3, gen2: 0