Ayrat
то мы уходим сюда | ValueSome _, ValueNone | ValueNone, ValueSome _ -> notFinished <- false
Ayrat
или сюда | ValueNone, ValueNone -> notFinished <- false
Nikolay
с чего бы, если хотя бы один кончается
isEqual <- false ставится только когда оба элемента есть
Ayrat
isEqual <- false ставится только когда оба элемента есть
ну так это и в оригинале так было бы
Ayrat
ты ж там комперил два саб сиквенса
Nikolay
ты ж там комперил два саб сиквенса
Если количество будет разниться, то они не будут равны
Nikolay
А в твоем случае будут
Nikolay
| ValueSome _, ValueNone | ValueNone, ValueSome _ -> isEqual <- false
Nikolay
Вот так должно быть, не?
Ayrat
ну короче, ты там сам прикинь
Ayrat
как тебе надо
Ayrat
доработай напильником
Ayrat
и дебагером
Nikolay
и дебагером
Поэтому я спросил про перф того варианта :D
Ayrat
Поэтому я спросил про перф того варианта :D
он так себе, прям отсюда вижу
Ayrat
но мне интересно было бы посмотреть на енумераторы против стейт машин
Nikolay
Я понял что лучше через билдер
Ayrat
тут можно на стейтмашинах
Ayrat
вот именно getNext
Nikolay
Nikolay
Так же?
Ayrat
ага
Ayrat
но нейминг у тебя хромает
Nikolay
Ayrat
ага
Vasily
Ну вот
Ayrat
но тут тоже енумератор
Nikolay
Ну давай перф померяем
Ayrat
ну да логично
Vasily
На билдерах вполне ок
Doge
Загоните вначале в SharpLab
Ayrat
да, сек билдеры топчик
Doge
Прям интересно, что в асме будет
Nikolay
Загоните вначале в SharpLab
https://sharplab.io/#v2:DYLgZgzgPgsAUAewA4FMB2ACAygTwgFxQFt5S5gV8MBLNYWlDCFARwwAprCiIQMBJAMIIiSAIYAnMQCMKAbQC6ASgwBeeBiasMAbw2aMYBBJrcamLsQgYAJgn0GMRMfgDGAC1PEMAdy7uHAygMEAB+cyoAWgA+DBxqFGAbLxI4R01ggH0MGI4lfQBfMgoqJAkUADc1DDlggEYQ2KERcSlZRigFeBKMVwBXCRNVGvrGgWFRSRkKDE7iygwhwPYsVgA6VxbJFAB1f0DNAHlUKXxjCA2t8oOOZjYyyvy09PY73oGJJRVhgAZ4IA
Ilya
изначально я ничего такого не видел
То есть код учитывает порядок в 2х массивах?
Ayrat
Ilya
нуууу... изначальный порядок
То есть 1 2 не равно 2 1?
Ayrat
ручками
Nikolay
Ayrat vs Builder Ayrat: 00:00:00.0100998 Builder: 00:00:00.0178267
Nikolay
Правда замерено стопвотчем в релизе
Doge
Ну вы чего
Nikolay
(знаю что хуйня, не воняйте)
Doge
Какой stopwatch
Ayrat
ох уж эти бенчмарки на стопвотче
Ilya
То есть 1 2 не равно 2 1?
Если так - можно было не приседать и просто вызвать structural equals на массивах
Nikolay
Хм, кот Айрата быстрее работает, чем стандартный equals массивов
Nikolay
Лан, надо бенчмаркдотнет сделать
Doge
и там надо просто модуль добавить
Это какой модуль нужен?
Ayrat
Это какой модуль нужен?
хм, чот никак завести не могу сам
Doge
хм, чот никак завести не могу сам
Мне просто интересно сравнить с наивным растовским вариантом, который, конечно вообще не идиоматичный, потому что в расте разные типы редко вместе мешают в одной коллекции прям подобным образом. Но он как-то так вышел, там куча мусора из-за того, как в расте представлены типы, которые можно даункастить: https://godbolt.org/z/5Eon1K
Nikolay
Nikolay
@omgszer
Nikolay
Ты всю память выжрал
Ayrat
интересно на чем
Ayrat
это ж 3 мегабайта аллокаций
Nikolay
Билдер кстати очень достойно
Ayrat
а что такое Equals?
Ayrat
и как ты там кастил
Ayrat
в инт
Nikolay
Там не кастил
Nikolay
Никак
Ayrat
ну тогда выкини
Nikolay
Это тупо для сравнения
Ayrat
тут основаная проблема это каст
Nikolay
тут основаная проблема это каст
Я у гетнекст случайно инлайн убрал
Nikolay
Вот мб насрало
Ayrat
ну возможно.
Ayrat
потому что там вопшны через хип могут пойти
Nikolay
module Comparer = let inline getNext<'b when 'b :> IComparable> (someEnum: IEnumerator<IComparable>): 'b voption = let mutable result = ValueNone let mutable notFound = true while notFound && someEnum.MoveNext() do match 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
Nikolay
Щас перезапустил