
Ayrat
07.08.2018
18:49:22
https://msdn.microsoft.com/ru-ru/library/dd386941(v=vs.110).aspx
Вот правильный тупль

Pavel
07.08.2018
18:56:15
если я понял сие описание верно, то код выше в жаве не соптимизируется. тупл приходит в метод извне, а новый создается и уходит наружу. т.е. нет выделения памяти только для внутренего использования функцией. нет NoEscape объектов здесь

Google

TEH3OP
07.08.2018
19:57:01

Ayrat
07.08.2018
19:57:25
нет, это такой код генерит декомпилятор из IL в C#
:D
но в целом оно

TEH3OP
07.08.2018
19:58:14

Ayrat
07.08.2018
19:58:33
переключи справа на IL, вот тогда будет то что выдаёт компилятор F#

TEH3OP
07.08.2018
20:00:06

Ayrat
07.08.2018
20:00:59
просто в силу того что C# более императивный и чо уж там низкоуровневый язык, на нём смотреть скомпиленное на F# проще чем в IL пялить
в IL там тоже две аллокации на одном пути и одна на другом. кошмар, по-моему

TEH3OP
07.08.2018
20:02:00

Ayrat
07.08.2018
20:02:48
на самом деле это примерно никак не сказывается на скорости кода

TEH3OP
07.08.2018
20:02:57

Google

Ayrat
07.08.2018
20:03:02
продуктовый код на 99% состоит из IO
и 1% задач на числодробилки, для которых можно и постараться.

TEH3OP
07.08.2018
20:03:53

Ayrat
07.08.2018
20:04:05
ага
тут же явная аллокация тупля на куче. А то и двух. Ужас, думаю я. А потом думаю - пофигу, у меня все задачи - это ожидание даталейка

Vlad
07.08.2018
20:06:06

Ayrat
07.08.2018
20:06:52
там и в il тупля
но ссылка была на C# код) я просто побуквоедил в том, что FSC генерит не C#, а IL

TEH3OP
07.08.2018
20:07:03
Ой давным давно была статья про вред параноидальной оптимизации. Просто шикарная. Я из-за неё почти бросил c++

Ayrat
07.08.2018
20:08:17

TEH3OP
07.08.2018
20:09:35

Igor
07.08.2018
20:22:36

Klei
07.08.2018
20:31:38

Roman
07.08.2018
21:14:07
Бывают ситуации когда тапл на куче очень даже сказывается на производительности. Из за этого не везде фшарп можно пользовать.
К сожалению

Vlad
07.08.2018
21:18:17

Roman
07.08.2018
21:22:17
Ого. Больше года уже как. А мапа на tryFind умеет такую возвращать?

Friedrich
08.08.2018
02:52:31

Roman
08.08.2018
02:54:35
Профайлер показывает создание кучи таплов в хипе.

Google

Roman
08.08.2018
02:55:26
Время жизни короткое, но сборщик мусора пашет

Friedrich
08.08.2018
02:57:10
Ну, там я сам себе создавал мемори трафик, своими объектами.

Roman
08.08.2018
02:59:55
Я в итоге переписал на цшарпе с дикшинари. На 7 цшарпе out var поэтому смирился

Friedrich
08.08.2018
03:13:23
Ну окей, out var нету, но наш мап, по крайней мере, реализует тот же шарповый интерфейс, так что можно лаконично сделать как надо.

Vlad
08.08.2018
05:07:44
оптимизация как понятие отсуствует
https://sharplab.io/#v2:DYLgZgzgPg9gDgUwHYAIDKBPCAXBBbAWAChjgFsUAPFAChwCcBXAYwpoEMAaAIwEoV2EFNn4BeYikkoAlmAEoAfCm7CAFsmEoEwCAhQMWbLgAZeEqaXIo87aahpiU5yXHp3sYVACIApAEEvFAAeKCpaA1YaAEZOACZeXiA==
Забавно
Тут есть

Friedrich
08.08.2018
05:31:39
Хотя тут надо всё-таки подумать, как оно себя будет вести с мутабельными структурами, например. Семантика поменяется.
Смотри, если у меня мутабельные структы лежат в тупле, то родитель их может изменить.
Если F#-компилятор будет оптимизировать этот кейс и передавать туплю как есть, то вызываемая функция сможет увидеть мутированные структуры из родительской тупли.
При обычном вызове с передачей страктов по значению они копируются и вызванный код не сможет увидеть их мутации.
Кажется, оптимизация невалидна!

Ayrat
08.08.2018
06:05:54

Friedrich
08.08.2018
06:06:30
Есть довольно много способов помутировать структуру так, что наша оптимизация сломается (рефлекшеном тем же).

Ayrat
08.08.2018
06:07:38
На такое закладываться нельзя
Тут автор сам, умышленно, себе в ногу стреляет

Friedrich
08.08.2018
06:08:03
А то будут траблы а-ля «в C# у меня вызов работает, а F#-компилятор всё испортил».

Google

Friedrich
08.08.2018
06:09:09
Рефлекшен — это совершенно стандартный platform facility с известным поведением, и использует его очень много кто (всякие сериалайзоры и пр.). Нельзя на него просто положить болт.
Плюс, я не уверен, что это простая задача для нашего компиля — понять, какая структура является публично мутабельной, а какая нет.
Особенно учитывая особенности компиляции под .NET Standard.

Ayrat
08.08.2018
06:10:27

Friedrich
08.08.2018
06:10:29
(там же настоящих тел у структур нету, только затычки какие-то)

Ayrat
08.08.2018
06:10:36
Аааа
Это да. Каждый сам ваяет как видит

Friedrich
08.08.2018
06:10:56
Егор ещё жаловался, что у него внезапно начал компилироваться какой-то совершенно дурной код типа Guid x; return x;

Ayrat
08.08.2018
06:12:13
А раньше так не работало? Структуры же можно так создавать, в отличие от классов. А вот возвращать хз

Friedrich
08.08.2018
06:12:19
Интересно, кстати, а F# умеет работать с недоинициализированными структурами? Можно ли в нём воспроизвести тот же трюк?

Ayrat
08.08.2018
06:12:48
Ну будет нулевой гуид)

Friedrich
08.08.2018
06:12:57
В нормальном кейсе это не сработает, потребуется инициализация полей.
Т.е. сам интент валидный, но именно вот этот сниппет работать не должен.

Pavel
08.08.2018
07:43:18

Ayrat
08.08.2018
07:43:50

Pavel
08.08.2018
07:44:07
не угадал. это сам F# компилятор

Ayrat
08.08.2018
07:44:12
чиорт
а ты прав

アレクセイ
08.08.2018
08:37:54
где можно посмотреть толковую имплементацию Heap's algorithm на F#?

Google

Friedrich
08.08.2018
08:38:20

Roman
08.08.2018
09:24:02
https://twitter.com/safe_stack/status/1026877175474122753?s=19

Vlad
08.08.2018
09:29:08
в компиляторе

Pavel
08.08.2018
09:32:57

Vlad
08.08.2018
09:33:29

Pavel
08.08.2018
10:28:59
хотя конечно загадочно

Anna
08.08.2018
11:08:55
@fvnever @neftedollar ^

Friedrich
08.08.2018
11:09:12
?

Most
08.08.2018
21:00:38
Привет, мы тут в ozonru теперь стали проводить митапы в мск-сити, если кто-то хочет просветить про f#, будем очень рады видеть и слышать :) например Ayrat или @neftedollar

Roman
08.08.2018
21:01:56

Nux
08.08.2018
21:02:54
А когда митап то?

Most
08.08.2018
21:03:35
А когда митап то?
Да нет конкретного митапа, если бы набралось пару докладов, можно устроить