Nikolay
У тебя было match box
Ayrat
У тебя было match box
это оптимайзится
Ayrat
а ты все равно бокс добавил потому что это явный интерфейс
Ayrat
охуенный ты оптимизатор
Nikolay
Ну щас сравним
Ayrat
я только знаю что match box generic with | :? valueType as v ->
Ayrat
оптимайзится
Ayrat
жидом, а не компилятором
Ayrat
тайная магия
Nikolay
Ayrat
чот хуита какая-то
Nikolay
инлайн не помог
Nikolay
Щас сравню с боксом
gsomix
Код бенчмарков бы еще.
Nikolay
``` // Learn more about F# at http://fsharp.org open System open System.Collections.Generic open BenchmarkDotNet.Attributes open BenchmarkDotNet.Running module Comparer = let inline getNext<'b> (someEnum: IEnumerator<IComparable>): 'b voption = let mutable result = ValueNone let mutable notFound = true while notFound && someEnum.MoveNext() do match box someEnum.Current with | :? 'b as x -> notFound <- false result <- ValueSome x | _ -> () result let compare (a: IComparable seq) (b: IComparable seq): bool = use aEnum = a.GetEnumerator() use bEnum = b.GetEnumerator() let mutable aNext = ValueNone let mutable bNext = ValueNone let mutable isEqual = true let mutable notFinished = true while isEqual && notFinished do aNext <- getNext<int> aEnum bNext <- getNext<int> bEnum match aNext, bNext with | ValueSome _, ValueNone | ValueNone, ValueSome _ -> isEqual <- false | ValueSome ai, ValueSome bi when ai <> bi -> isEqual <- false | ValueNone, ValueNone -> notFinished <- false | ValueSome _, ValueSome _ -> () isEqual let compareBuilder (a: IComparable seq) (b: IComparable seq) = let inline seq (items: IComparable seq) = seq { for item in items do match item with | :? int -> yield item | _ -> () } (Seq.compareWith Operators.compare (seq a) (seq b)) = 0 [<MemoryDiagnoser>] type Bench() = let a = [| for i in 0 .. 100_000 do yield i :> IComparable |] let b = [| for i in 0 .. 100_000 do yield i :> IComparable |] [<Benchmark>] member x.Ayrat() = Comparer.compare a b [<Benchmark>] member x.Builder() = Comparer.compareBuilder a b // [<Benchmark>] // member x.Equals() = a = b [<EntryPoint>] let main argv = let summary = BenchmarkRunner.Run<Bench>() 0 // return an integer exit code```
Ayrat
вот да, я б погонял профайлером.
Nikolay
Мб секбилдер как-то массивы оптимизирует, хз
Nikolay
Хотя с памятью вообще дичь какая-то
Nikolay
А, я знаю что срёт
Nikolay
match aNext, bNext with
Nikolay
Это ж в туплю сворачивается?
Nikolay
match struct(aNext, bNext) with
Nikolay
чот хуита какая-то
С боксом медленнее, кстати
Nikolay
Ayrat
да тут как бы надо понять откуда 3мб
Nikolay
Щас матчстракт попробую
gsomix
@Dolfik Правильно данные для тестов готовишь?
gsomix
В какой момент создаются массивы?
Ayrat
ок, это туплы
Nikolay
Они для всех бэнчей одинаково
Ayrat
ебаный матч на туплях
Ayrat
ЩА ОПТИМИЗНЕМ
Nikolay
ЩА ОПТИМИЗНЕМ
Ща померяем на стракт туплях
Ayrat
Ayrat
несложно было узнать
Nikolay
:D
Nikolay
А Я ГОВОРИЛ!
Ayrat
ну я честно говоря думал что компилятор умнее
Ayrat
потому что тут тупль создается и деструктится ТУТ ЖЕ
Nikolay
Ayrat
не вижу ни одной причины почему эта хуита должна через хип ходить
Nikolay
потому что тут тупль создается и деструктится ТУТ ЖЕ
Да самое забавное, что он в таких кейсах сам типы умеет выводить
Ayrat
Да самое забавное, что он в таких кейсах сам типы умеет выводить
причем это должно быть прозрачно для тебя, в коде ты пишешь обычный тупль match a, b, c with | x, y, z -> это не должно ходить через хип
Hog
БАЙДИЗАЙН
Nikolay
Настроечку бы компилятору
Nikolay
Чтобы такое оптимизил
Ayrat
Так же как и let a, b = if a.Length > b.Length then a, b else b, a
ну короче тут можно через структ тупли, можно ручными ифами
Nikolay
Настроечку бы компилятору
Мб попробовать толкнуть?
Ayrat
Мб попробовать толкнуть?
@gsomix он точно знает, толкал ли кто-то такое
Nikolay
@vl_za это можно починить?
Ну вряд-ли конечно будут breaking changes делать, но вот хотя бы настройку
Ayrat
Ну вряд-ли конечно будут breaking changes делать, но вот хотя бы настройку
не, это локальная оптимизация для структов которые анонимно создаются и тут же деструктятся
Ayrat
то есть они даже не биндятся никуда
Vlæd
@vl_za это можно починить?
Ща, найду откуда начинать читать
Nikolay
Не возвращаются же
Ayrat
Ща, найду откуда начинать читать
тупли в матче ходят через хип match a, b, c with | x, y, z -> хотя тут тупль создается и деструктится по месту
Ayrat
он никуда не утекает
Ayrat
компилятор знает что он никуда не утекает?
Ayrat
если знает, пусть эмитит валуетуполь
gsomix
компилятор знает что он никуда не утекает?
Нужно минимальный пример составить.
Ayrat
на ровном месте 3мб аллокаций!!1 @vl_za
Nikolay
Вот, а вы говорили хуйней занимаюсь!
Vlæd
gsomix
Нужно минимальный пример составить.
Потому что обычно компилятор убирает все кортежи из результирующего кода.
Nikolay
Чтобы не расслаблялись
Чтобы в ченжлоге писать: memory usage optimizations
Vlæd
на ровном месте 3мб аллокаций!!1 @vl_za
На завтра напоминалку поставил, гляну, ща уже не за ноутом
gsomix
Нужно минимальный пример составить.
Кортеж остается в присутствии mutable.
gsomix
поясни
https://sharplab.io/#v2:EYLgxg9gTgpgtADwGwBYA0AbEAzAzgHwxgBcACbCCYAQylIAoBKUgXgFgAoU70osgWwCuxasCKlqrUgDVqGQTADKEfjFIoATJx68SpISLFrgU2fJgA5CADsY2nv2rEwACwlpSJgO4BLYi/tufBk5BWVVUgB9DzMFK1tSOAA+BkZA0mDIxJSmIA==
gsomix
Если убрать mutable, то компилятор сможет оптимизировать match.