@Fsharp_chat

Страница 269 из 772
Igor
16.08.2017
20:25:10
тогда обломись или пиши дурацкие констрэйнты
Я про эти констрейнты, синтаксис не помню

Vasily
16.08.2017
20:26:06
Т.е. по факту отдаешь статику

Vladimir
16.08.2017
20:28:42
Контент это же и будет json, который я сохраню, а как я весь запрос с хедерами одной строкой отдам? Надо тогда свой middleware писать в обход giraffe получается?

Evgeniy
16.08.2017
20:32:46
Я про эти констрейнты, синтаксис не помню
Потому что он ужасный. type Foobar() = member this.Hello s = printfn "Hello %s" s let inline hello (a: ^T) s = (^T : (member Hello : string -> unit) a, s) let baz = Foobar() hello baz "World"

Google
Evgeniy
16.08.2017
20:35:15
Потому что он ужасный. type Foobar() = member this.Hello s = printfn "Hello %s" s let inline hello (a: ^T) s = (^T : (member Hello : string -> unit) a, s) let baz = Foobar() hello baz "World"
Наше спасение в RFC. https://github.com/fsharp/fslang-design/blob/master/RFCs/FS-1024-simplify-call-syntax-for-statically-resolved-member-constraints.md

Igor
16.08.2017
20:35:17
Народ поясните, это можно это в F# написать что бы НЕ ставить явно тип a? let test a = a.helloworld()
Да наверное как-то так let inline test (a: ^T) = (^T : (member helloworld : unit -> 'R) a)

Evgeniy
16.08.2017
20:35:35
Да наверное как-то так let inline test (a: ^T) = (^T : (member helloworld : unit -> 'R) a)
Плохо, что F# не умеет сам выводить такие штуки.

Roman
16.08.2017
20:35:39
Летучая
16.08.2017
20:39:06
Можно прям в тип принимаемой переменной констрейнт загнать (есть мнение, что так читаемее)

Igor
16.08.2017
20:40:10
VSCode кстати обновился и Ionide (может и netstandard 2.0 пофиксили, но врядли)

Evgeniy
16.08.2017
21:16:50
Логи на telegrammy почему-то уже давно не обновляются.

Vladimir
16.08.2017
22:07:30
Добавил отдачу предсериализованных запросов, теперь доживаем до 1500 RPS =) Но это все еще 35% фейлов

Vasily
17.08.2017
05:42:14
Надо дальше смотреть

Vladimir
17.08.2017
05:50:49
Могу только сказать что сериализация не сильно мешала, вот сравнение http://clip2net.com/s/3N049BG http://clip2net.com/s/3N04bsA

т.е. разница между отдачей чистых строк и поиск с подсчетом среднего и сериализацией разнятся на 30-50% всего

Google
Vladimir
17.08.2017
05:51:48
А тут надо раз в 5 производительность улучшать)

пока самый очевидный вариант это отказываться от словарей и базу загружать

ну еще может как-то можно kestrel потюнить, но пока не знаю как)

Aleksander
17.08.2017
05:58:42
а почему сперва не запустить локально и запрофайлить?

Vladimir
17.08.2017
06:02:16
а почему сперва не запустить локально и запрофайлить?
а как .net core запрофайлить? я таким не занимался никогда, буду рад советам) правда плюс надо будет написать клиента который будет запросы делать

Ну всё равно неплохо, сделай так 5 раз, и будет хорошо)
ну это максимум из того что можно сделать уже) поиск в словаре строки по айдишке и отдача этой строки

ну разве что еще ConcurrentDictionary на Dictionary заменить, ну собственно и на этом все будет)

Aleksander
17.08.2017
06:07:06
а как .net core запрофайлить? я таким не занимался никогда, буду рад советам) правда плюс надо будет написать клиента который будет запросы делать
для нагрузки (клиент, который запросы делает) - можно написать, а можно взять JMeter (правда придется совсем немного времени уделить его изучению)

Vladimir
17.08.2017
06:07:35
ну или массив сделать и по индексу брать, как Василий предлагал. Там миллион записей по 100байт, получится 100мб, должно выдержать

Aleksander
17.08.2017
06:08:10
по поводу того как профайлить - можно начать прямо из студии

Vladimir
17.08.2017
06:08:35
студия пока не поддерживает .net core c фшарпом)

Aleksander
17.08.2017
06:08:50
судя по min response time 400ms, там что-то очень нетак:)

Vladimir
17.08.2017
06:09:16
это микросекунды

Evgeniy
17.08.2017
06:09:28
а как сам профайлинг делать?
Как минимум бенчмарки локальные написать.

Aleksander
17.08.2017
06:09:46
ms = миллисекунды, нет?

микросекунд у тебя не будет)

Vladimir
17.08.2017
06:10:13
не, тогда бы все было совсем плохо

там такие цифры появляются потом 1641247037 ms

Google
Vladimir
17.08.2017
06:11:16
это в сумме, а один ответ 45080695ms

Aleksander
17.08.2017
06:12:32
ну, я не знаю, я человек простой. если написано s - я понимаю как секунда. если ms - миллисекунда.

Vladimir
17.08.2017
06:13:17
Как минимум бенчмарки локальные написать.
ну как я говорил, мой код на сложных методах это сейчас в 1.5 раза оверхед поверх взятия строки из словаря по айдишке и выдачи в ответ

на самом деле даже еще меньше

Aleksander
17.08.2017
06:13:59
и я бы скорее поверил что все плохо, чем то что ты с юзер-спейс вебсервера в докере на какой-то виртуалке отдаешь ответ за <1 ms

Vladimir
17.08.2017
06:15:10
не, спрашивали уже в чате соревнования, это микросекунды)

нету сети просто

запросы с этой же машины идут

все сходится, бот скажем делает 1к запросов в секунду в одном потоке, это значит что он ожидает 1мс на каждый ответ максимум

мне посути надо дожить до 2к в секунду

это значит что все запросы должны быть в среднем меньше 500мкс

Aleksander
17.08.2017
06:20:59
а, ну если без сети - то возможно)

https://github.com/aspnet/IISIntegration/issues/220 - вот тут у людей похожие цифры, на windows правда, и, кстати RPS ~ 10k

Vladimir
17.08.2017
06:26:28
ну мне от этого бенчмарка не легче)

там создают сначала 1 поток, а если не успевает отвечать скажем до 500мкс на запрос, то врубают 400 потоков

а не 10 как в примере)

и сразу же после этого переключения все загибается

Aleksander
17.08.2017
06:29:26
а они выдают статистику по времени для неправильных ответов?

Vladimir
17.08.2017
06:30:18
нет, только косвенно можно посмотреть по общему графику времени ответов на запрос

Aleksander
17.08.2017
06:30:53
просто если закинуть туда "голый" kestrel без логики вообще, и посмотреть как он будет жить

Google
Vladimir
17.08.2017
06:32:18
голый смысла думаю нет, он сможет до 500мкс всегда отвечать

и 400 потоков они не врубят

Aleksander
17.08.2017
06:32:40
поставь задержку)

Vladimir
17.08.2017
06:34:26
можно)

но главная ж идея посмотреть что в реальных задачах можно получить по RPS

Aleksander
17.08.2017
06:37:22
ну ты же, насколько я понял, решаешь сейчас - вкладывать ли время в тюнинг кестрела, или в работу над логикой.. так ты сможешь понять конкретно, в чем беда

если кестрел будет работать за 100мкс без задержки, а с задержкой держаться против 400 потоков - тогда ставим галочку и идем пилить логику) если нет - то и логикой смысла не будет заниматься

Vladimir
17.08.2017
06:39:36
да, согласен) сейчас хочу еще с массивами попробовать вместо словарей, потом голый кестрел проверю

Aleksander
17.08.2017
06:39:38
причем там же еще прослойка в виде giraffe, тоже может влиять)

так что можно 3 случая: чисто кестрел, кестрел + жираф, и полное приложение

Vladimir
17.08.2017
06:40:31
2 запуска в день только можно)

Vasily
17.08.2017
06:40:42
Надо еще внимательно на валидацию смотреть

Кинь ссылку на актуальный репозиторий

Vladimir
17.08.2017
06:41:53
сча. Валидация сейчас эксепшны кидает если параметры гет-запроса невалидные

Vasily
17.08.2017
06:42:17
Эксепшны дорогие довольно

Vladimir
17.08.2017
06:42:20
https://github.com/Lanayx/PerformanceTest

ну тогда надо писать валидатор полей вручную

через chiron

Vasily
17.08.2017
06:43:40
Консольный вывод отруби еще

Vladimir
17.08.2017
06:44:28
чего, он не влияет почти, раз в 1000 запросов только работает

Google
Vasily
17.08.2017
06:44:45
Это в каунтере

Vladimir
17.08.2017
06:45:02
а больше нигде и не пишет)

Vasily
17.08.2017
06:53:13
Короче

Идем дальше

В целом идея этого соревнования,похоже,повторить event sourcing

Поэтому есть смысл по максимуму отказаться от сериализации/десериализации

Vladimir
17.08.2017
07:03:47
так уже)

Vasily
17.08.2017
07:04:21
При добавлении/обновлении данных не надо сразу валидировать,по идее

Vladimir
17.08.2017
07:04:38
нельзя, надо же невалидные данные отбрасывать

с 400 ошибкой

Vasily
17.08.2017
07:05:03
На получении?

Или на добавлении?

Vladimir
17.08.2017
07:05:23
на добавлении

на получении тоже

Vasily
17.08.2017
07:07:17
Значит,надо ускорять десериализацию

Точнее не так

Надо в процессе десериализации валидировать данные

Vladimir
17.08.2017
07:08:35
=) не понял)

Vasily
17.08.2017
07:09:42
В json.net можно написать конвертер по идее

Vladimir
17.08.2017
07:10:49
не, не понял смысл идеи)

Vasily
17.08.2017
07:11:03
Идея в том, что если при десериализации попалось невалидное поле,то дальше можно не ходить

Vladimir
17.08.2017
07:11:16
ну, сейчас так и работает

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