@Fsharp_chat

Страница 660 из 772
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
В жаве фиксит, у нас тоже обещали escape analysis сделать
в жаве это так? https://dzone.com/articles/escape-analysis

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

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

:D

но в целом оно

TEH3OP
07.08.2018
19:58:14
нет, это такой код генерит декомпилятор из IL в C#
Т.к. вопрос глупый, уточню. Это не сарказм?

Ayrat
07.08.2018
19:58:33
Т.к. вопрос глупый, уточню. Это не сарказм?
вообще не сарказм. Ты ж не думал что компилятор F# выдаёт C# код?

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

TEH3OP
07.08.2018
20:00:06
вообще не сарказм. Ты ж не думал что компилятор F# выдаёт C# код?
После вынужденного насильственного изучения typescript , я уже ко всему готов.

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

в IL там тоже две аллокации на одном пути и одна на другом. кошмар, по-моему

TEH3OP
07.08.2018
20:02:00
переключи справа на IL, вот тогда будет то что выдаёт компилятор F#
Классно, все равно, ибо был как раз вопрос, а что фрешето генерит на выходе, с учётом всех фич что там есть.

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

Google
Ayrat
07.08.2018
20:03:02
продуктовый код на 99% состоит из IO

и 1% задач на числодробилки, для которых можно и постараться.

TEH3OP
07.08.2018
20:03:53
продуктовый код на 99% состоит из IO
Всмысле из выделений памяти под переменные?

Ayrat
07.08.2018
20:04:05
ага

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

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
Ой давным давно была статья про вред параноидальной оптимизации. Просто шикарная. Я из-за неё почти бросил c++
Я намного продуктивнее на F#. REPL ускоряет разработку раза в 2. А то что там тупли на куче... Ну да. Пойду поем.

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

К сожалению

Roman
07.08.2018
21:22:17
Но есть же struct tuple если надо
их уже завезли? Я похоже отстал от жизни.

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

Friedrich
08.08.2018
02:52:31
Ого. Больше года уже как. А мапа на tryFind умеет такую возвращать?
Хороший вопрос, надо бы посмотреть FSharp.Core, а то и написать пропозал.

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

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

Friedrich
08.08.2018
02:57:10
Профайлер показывает создание кучи таплов в хипе.
Я у себя успешно это затыкал структурными туплями и структурными юнионами, потребление памяти падало процентов на 80 (на специфичном ворклоаде).

Ну, там я сам себе создавал мемори трафик, своими объектами.

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#-компилятор будет оптимизировать этот кейс и передавать туплю как есть, то вызываемая функция сможет увидеть мутированные структуры из родительской тупли. При обычном вызове с передачей страктов по значению они копируются и вызванный код не сможет увидеть их мутации.

Кажется, оптимизация невалидна!

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.

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
А раньше так не работало? Структуры же можно так создавать, в отличие от классов. А вот возвращать хз
Это работает только если ты руками инициализировал все поля в структуре. Для случая компиляции в .NET Standard в структуре не было объявленных полей, т.е. они все считались инициализированными

В нормальном кейсе это не сработает, потребуется инициализация полей.

Т.е. сам интент валидный, но именно вот этот сниппет работать не должен.

Pavel
08.08.2018
07:43:18
продуктовый код на 99% состоит из IO
представь что ты ежедневно пользуешься софтом у которого 99% это не IO. и он нехило так тормозит изза вот этого всего кошмара

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
не угадал. это сам F# компилятор
Окей, хороший пример.

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

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

Vlad
08.08.2018
09:33:29
что именно сделать то?
все option сделать структурами

Pavel
08.08.2018
10:28:59
все option сделать структурами
ну это другой случай

хотя конечно загадочно

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

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

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

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