@Fsharp_chat

Страница 178 из 772
Evgeniy
30.05.2017
07:20:31
Я бы наклеил.

Летучая
30.05.2017
07:21:01
Вот сегодня пойду пробовать эти 4 штуки напечатать и нарезать х) По результатам отпишу.

Evgeniy
30.05.2017
07:21:08
И фото!

Смотрите, потихоньку документации на фичи F#4.1 пишут. https://docs.microsoft.com/en-us/dotnet/fsharp/language-reference/fixed

Google
Vasily
30.05.2017
07:21:55
Логотип красивый, готов проспонсировать некоторую партию в пару сотен штук

Летучая
30.05.2017
07:44:53
По идее любая профессиональная типографская мастерская, у которой есть плоттер, принтер и самоклейка. Правда с поштучной печатью там довольно туго, сегодня будем пробовать договориться

Friedrich
30.05.2017
08:38:54
По мотивам обсуждения <>null / isNull написал бенч: https://gist.github.com/ForNeVeR/492dad2bf2c0cda22e79422ab9c35c6a

Friedrich
30.05.2017
08:39:54
Результаты там же, по ссылке.

Pawel
30.05.2017
08:40:56
Nikolay
30.05.2017
08:41:17
Почему notNull такой слоу?

И что будет если сделать not (isNull o)? Или код одинаковый получится?

Friedrich
30.05.2017
08:42:10
https://sharplab.io/#v2:DYLgZgzgNAJiDUAfALgTwA4FMAEAhTAdgMYAWAtgIYBOA1gBQCU2AvALABQ2X2wmy2AexaCARgCtGHbtjKYyIzFWwB9ZQDoAlhAByAV2DBGLKdO5a9BwRxNdZ8xSvVEBZdNUxG2nU1yHNsBPrA1t62cgpKqmoEAsgWhkxePlx0MfwAPOnY5kFMAiHSdhGOarrELm5UHok2pkLpAHwBQUA===

Evgeniy
30.05.2017
08:44:25
@fvnever Результаты мне кажутся странными.

Почему uncompare быстрее compare? %)

Google
Evgeniy
30.05.2017
08:47:57
Ладно. Суть не в этом. :)

Anton
30.05.2017
08:48:01
О, а так ещё прикольней и контраст и белое есть вокруг

Friedrich
30.05.2017
08:48:27
Почему uncompare быстрее compare? %)
По коду глянь, там копирование в локальную переменную. Видимо, это решает.

Evgeniy
30.05.2017
08:48:43
@fvnever Я смотрю JIT ASM.

Friedrich
30.05.2017
08:49:09
О, даже так можно? %)

Почему uncompare быстрее compare? %)
Возможно, на моей машине JIT по-другому отработал.

Evgeniy
30.05.2017
08:53:14
Да, это возможно.

Friedrich
30.05.2017
09:01:03
Либо CPU здесь очень хитро угадал результаты после выполнения not

Видишь, compare напрямую возвращает результат какой-то функции, которая возвращает данные в eax. А uncompare к этому результату применяет not-преобразование (последние три инструкции перед return).

Nikolay
30.05.2017
09:02:40
А ты проверь. :)
notNull | 24.908 ns | 0.4687 ns | 0.4385 ns | notNull2 | 1.525 ns | 0.0662 ns | 0.0619 ns |

Второй это not (is Null o)

Evgeniy
30.05.2017
09:02:59
@Dolfik А первый?

Nikolay
30.05.2017
09:03:11
(not << isNull) o

Evgeniy
30.05.2017
09:03:59
@Dolfik Ты что-то делаешь не так.

Nikolay
30.05.2017
09:04:22
Что я не так делаю?)

Evgeniy
30.05.2017
09:04:51
@Dolfik Просто (not << isNull) o и not (is Null o) компилируются в один и тот же код.

Nikolay
30.05.2017
09:05:24
public bool notNull() { object obj = this.o; return obj == null ? 1 : 0 == 0; } public bool notNull2() { return this.o == null ? 1 : 0 == 0; }

Нахера, я не знаю)

Google
Evgeniy
30.05.2017
09:07:34
@Worldbeater Это C#.

Friedrich
30.05.2017
09:07:34
Это IL?
Это C# ~_~

Evgeniy
30.05.2017
09:07:43
@Dolfik https://sharplab.io/#v2:DYLgZgzgPg9gDgUwHYAIDKBPCAXBBbAWAChjgFsUkZsA5AV2GBRhQF5LqUAKASwnsbMAlKXIdaDYGmAwA7szbcqFADwqUfAcCHNioijABGAK0VIE8gPImEAY2xcRRMhQBOCCGepbmJ/SncIaTkvCUZg+SNjYiA==

Nikolay
30.05.2017
09:09:09
https://sharplab.io/#v2:DYLgZgzgNAJiDUAfALgTwA4FMAEAhTAdgMYAWAtgIYBOA1gBQCU2AvALABQ2X2wmy2AexaCARgCtGHbtjKYyIzFWwB9ZQDoAlhAByAV2DBGLKdO5a9BwRxNdZ8xSvVEBZdNUxG2nU1yHNsBPrA1t62cgpKqmoEAsgWhkxePlx0MfwAPOnY5kFMAjamBXYRjtGx8QBMngXSadh0OZYCDCHSxQ5RusQublQeiTXcQukAfAFBQA

Я так

Friedrich
30.05.2017
09:10:15
@Worldbeater, лол, ты верно подметил. Видимо, это артефакт декомпиляции. Такое в C# не компилируется.

Friedrich
30.05.2017
09:10:47
Не компилируется!

Летучая
30.05.2017
09:10:47
Там порядок действий другой

Evgeniy
30.05.2017
09:10:57
@Dolfik @fvnever И JIT разный. .__.

Что за ерунда в этих методах творится?

Летучая
30.05.2017
09:11:09
Слева булево значение получается.

Так что 1 это инт.

Friedrich
30.05.2017
09:11:26
Что за ерунда в этих методах творится?
Чего с чем ты сравниваешь?

Так что 1 это инт.
Да нет же, я проверил — не компилируется такое. Ты сразу всё правильно сказал.

Evgeniy
30.05.2017
09:11:46
(not « isNull) o и not (is Null o)

@Dolfik Какие-то странности и оптимизации в методах.

Friedrich
30.05.2017
09:13:58
(not « isNull) o и not (is Null o)
Почему один из них "slow"? Одинаково должны работать

Evgeniy
30.05.2017
09:14:17
@fvnever Посмотри выше, пожалуйста. Там @Dolfik какой-то бенчмарк запилил странный.

Friedrich
30.05.2017
09:14:18
Google
Nikolay
30.05.2017
09:14:36
type Benchmark() = let o = obj() [<Benchmark>] member __.isNull() = isNull o [<Benchmark>] member __.compare() = o = null [<Benchmark>] member __.notNull() = (not << isNull) o [<Benchmark>] member __.notNull2() = not (isNull o) [<Benchmark>] member __.uncompare() = o <> null

Friedrich
30.05.2017
09:14:42
Я уже встречал такие эффекты, и у меня есть для них правдоподобное объяснение, но я хочу видеть весь кот

Летучая
30.05.2017
09:14:48
Да нет же, я проверил — не компилируется такое. Ты сразу всё правильно сказал.
Если поставить скобки в нужном месте, то норм будет. Мб в этой штуке порядок действий иной

Nikolay
30.05.2017
09:14:59
Нет :)

Friedrich
30.05.2017
09:15:16
Никогда не запускай бенчмарки в дебаге, это бессмысленно. BDN даже ругается на такое :)

Если поставить скобки в нужном месте, то норм будет. Мб в этой штуке порядок действий иной
Нет, никак не будет. В C# числовые литералы не кастуются неявно к bool. Этот код такой странный потому, что декомпилятор не ожидал такое увидеть вообще.

Ну то это точно ошибка декомпилятора.

Я пойду репортить.

Nikolay
30.05.2017
09:17:48
Method | Mean | Error | StdDev | --------- |----------:|----------:|----------:| notNull | 0.6647 ns | 0.0419 ns | 0.0411 ns | notNull2 | 0.6138 ns | 0.0454 ns | 0.0425 ns |

Evgeniy
30.05.2017
09:18:18
Ура!

Nikolay
30.05.2017
09:19:01
Я тут занят немного, и забыл в релиз переключить ?

Как всегда, овердохрена работы, и нужно всё срочно сделать

Friedrich
30.05.2017
09:19:55
Летучая
30.05.2017
09:19:56
вполне ж

ну да

Friedrich
30.05.2017
09:20:09
Декомпилятор генерирует невалидный код, это баг.

Летучая
30.05.2017
09:20:12
+

Friedrich
30.05.2017
09:20:48
Зарепортил: https://github.com/ashmind/SharpLab/issues/119

Google
Friedrich
30.05.2017
09:23:22
Моя гипотеза такова: декомпилятор, само собой, затачивался на декомпиляцию C# или VB.NET-кода, и может быть настроен именно на такие паттерны, которые используются компиляторами этих языков. Например, C# использует CIL-инструкцию cgt.un для сравнения с null, а F# использует (более логичный, на мой взгляд) ceq.

Декомпилятор его не понимает и думает, что мы пытаемся вернуть число.

Evgeniy
30.05.2017
09:24:19
@fvnever А там разве не ilspy внутре?

Friedrich
30.05.2017
09:24:38
Летучая
30.05.2017
09:24:40
Низкоуровневые чудеса.

Friedrich
30.05.2017
09:25:01
@fvnever А там разве не ilspy внутре?
Думаешь, придётся репортить в ilspy и чинить там? :)

Evgeniy
30.05.2017
09:25:16
Как знать.

Friedrich
30.05.2017
09:26:02
https://github.com/ashmind/SharpLab/tree/master/source/%23libraries > ICSharpCode.Decompiler.dll Вроде да, это ilspy.

Evgeniy
30.05.2017
09:37:42
Кстати, господа.

Наc уже 150. \o/

Anton
30.05.2017
12:41:15
Выпьем же! =)

Most
30.05.2017
12:42:25
оффтопом: Никто завтра на devops митап не идет случайно на целый день?

мск

Летучая
30.05.2017
12:55:36
Выпьем же! =)
Соберемся только

Anton
30.05.2017
12:55:57
Есть кто с Минска ещё ? =)

Friedrich
30.05.2017
12:56:56
Как знать.
Ага, автор просил перепостить в ILSpy: https://github.com/icsharpcode/ILSpy/issues/811

Pavel
30.05.2017
12:57:44
Есть кто с Минска ещё ? =)
Хочешь организовать встречу?

Roman
30.05.2017
13:21:12
@VagifAbilov вы использовали akkling?

Anton
30.05.2017
13:39:12
Pavel угу

Страница 178 из 772