
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
Логотип красивый, готов проспонсировать некоторую партию в пару сотен штук

Nikolay
30.05.2017
07:42:00

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

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

Pawel
30.05.2017
08:39:41

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)? Или код одинаковый получится?

Evgeniy
30.05.2017
08:42:05

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

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

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

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;
}
Нахера, я не знаю)

Летучая
30.05.2017
09:07:24

Google

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

Friedrich
30.05.2017
09:07:34

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# не компилируется.

Летучая
30.05.2017
09:10:42

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

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

Friedrich
30.05.2017
09:14:52

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

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

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
Я тут занят немного, и забыл в релиз переключить ?
Как всегда, овердохрена работы, и нужно всё срочно сделать

Летучая
30.05.2017
09:19:45

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

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 угу