Ayrat
понял тебя сейчас
Ayrat
да, понятно почему я раньше такого не видел. я не пиховал мутабельные биндинги в матч с туплем
Ayrat
достаточно узкий кейс
Ayrat
и внезапные аллокаци
gsomix
Одно плохо, что мы это во флудилке обсуждаем. :)
Ayrat
Nikolay
Кстати, в Fabulous’e это оптимизировано таким образом, и там скорее всего писал Сайм, значит он в курсе 🤔
gsomix
Vlæd
Igor
Nikolay
@omgszer seq builder vs seq.filter
Ayrat
а вот это удивительно
Nikolay
let compareFilter (a: IComparable seq) (b: IComparable seq) =
let inline seq (items: IComparable seq): IComparable seq =
Seq.filter (fun x ->
match x with
| :? int -> true
| _ -> false) items
(Seq.compareWith
Operators.compare
(seq a)
(seq b)) = 0
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
Ayrat
хотя. там один вызов, все равно один раз енумератор вызывается
Nikolay
gsomix
@Dolfik @omgszer Нигде не ошибся?
let compare (a: IComparable seq) (b: IComparable seq): bool =
use aEnum = a.GetEnumerator()
use bEnum = b.GetEnumerator()
let rec go() =
let aOpt = getNext<int> aEnum
let bOpt = getNext<int> bEnum
match aOpt, bOpt with
| ValueNone, _ | _, ValueNone -> false
| ValueSome ai, ValueSome bi ->
let res = Operators.compare ai bi
if res <> 0 then false else go()
go()
Ayrat
последний иф вроде можно заменить на
res = 0 && go()
Vasily
Ну вот да
Ayrat
и он по идее должен остаться хвостовым вызовом
Ayrat
но да, нормас и даже без мутабл
gsomix
Nikolay
Vladimir
А че не Seq.compareWith ?
gsomix
gsomix
вчитавшись в код я понял что ты чекаешь равенство интовых подпоследовательностей в двух последовательностях
Vasily
Я так понимаю, Коля оптимизирует фабулосовский цикл диффа
Vladimir
Nikolay
Вот кстати айрат 2 это без анбоксинга, просто всегда возвращается элемент
Nikolay
А массивы сравниваются около 2мс
Ilya
у вас тут всё под контролем? а то сравнение 2 енумераблов требует станцевать гопака :)
Nikolay
Возможно там проход с двух сторон 🤔
gsomix
Vasily
Ilya
Nikolay
Nikolay
Nikolay
gsomix
Nikolay
Пора уже за три года
Nikolay
Nikolay
@gsomix поздравляю
Mikhαil
Nikolay
Если что, у гсомикса с анбоксингом
Mikhαil
Паспорт на руках
Mikhαil
Наручники тоже
Mikhαil
Vasily
Но самый быстрый почему-то ArrayEquals
Nikolay
Кажись с анбоксингом где-то накосячил, почему-то памяти больше
Ayrat
Ayrat
там кастов нет
Vasily
А, ну без кастов пизда рулю
Ayrat
Nikolay
пащиму
AyatNoUnboxing это без кастов
Vasily
Тогда вариант гсомикса самый быстрый, да
Nikolay
Nikolay
А arrayequals просто:
for i in 0 .. (array.Length / 2) - 1 do
и погнали
Ayrat
Ayrat
O_O
Nikolay
Ayrat
но это просто выбор первого
Nikolay
Да
Ayrat
это Seq.tryHead
Nikolay
Так как в бенчах все равно объекты одного типа
Nikolay
Поэтому условие всегда истино
Nikolay
И я немножко упростил компилятору
Ayrat
ну там гетерогенный массив с интами вперемешку
Ayrat
Nikolay
Ayrat
если надо мерять реальный кейс
Igor
какие-то странные результаты
Igor