
Vladimir
23.08.2017
13:30:36

Friedrich
23.08.2017
13:31:00

Nikolay
23.08.2017
13:32:16
https://repl.it/KWI1/0
Хотя казалось бы можно оптимизировать

Google

Friedrich
23.08.2017
13:33:41

Nikolay
23.08.2017
13:33:57

Friedrich
23.08.2017
13:34:14
Не, ну можно написать отдельную либу, которая бы пыталась оптимизировать такие кейсы
Но много ли ты так для продакшена наоптимизируешь? Какая будет выгода? Часто такой код в реальности пишут?
(у меня статистики нет и я не берусь предполагать; может быть, много, а может и мало)

Vasily
23.08.2017
13:35:05
Все же я считаю, там засада в десериализации

Nikolay
23.08.2017
13:35:09
Двойной map тоже не оптимизируется

Friedrich
23.08.2017
13:35:32

Evgeniy
23.08.2017
13:35:36

Vladimir
23.08.2017
13:35:38
не тут, где-то в другом месте

Friedrich
23.08.2017
13:35:52

Vasily
23.08.2017
13:36:29
Nessos streams, кстати, довольно -таки шустрые, насколько я помню по бенчмаркам

Google

Nikolay
23.08.2017
13:37:31
Не оптимизирует)

Friedrich
23.08.2017
13:38:57

Roman
23.08.2017
13:39:19
Привет!
Признавайся, ты бот?

Nikolay
23.08.2017
13:39:25

Friedrich
23.08.2017
13:39:37
Вроде тут как раз нормально: функция 2 вызвалась только для тех записей, в которых функция 1 вернула больше 10.

Nikolay
23.08.2017
13:39:58
Речь была про оптимизацию вот этого
Подскажите, пожалуйста. Я правильно помню, что цепочки с Seq не очень быстро работают? Например, из кода:
|> Seq.map (fun key -> visits.[key])
|> Seq.filter (filterByQueryVisit query)
|> Seq.map (fun visit -> { mark = visit.mark; visited_at = visit.visited_at; place = locations.[visit.location].place})
|> Seq.sortBy (fun v -> v.visited_at)

Vladimir
23.08.2017
13:40:50
все же норм)
убери фильтр
и будет 1, 2, 1, 2
т.е. цикл пробегается один раз а не два

Nikolay
23.08.2017
13:41:53
А, хотя оно может его и в один цикл прогоняет
Так то да, не понятно

Ilya
23.08.2017
13:42:52
Если бы был не 1 проход, то не 1 2 1 2 было бы, а 1 1 1, 2 2 2

Nikolay
23.08.2017
13:43:11

Evgeniy
23.08.2017
13:53:29
Ладно. Мой вопрос всё-таки касался сортировки по большей части.
Но если все быстро, то норм.

Nikolay
23.08.2017
13:56:29
И всё же, я бы хранил в SortedDictionary отсортированными по дате ;)

Google

Vladimir
23.08.2017
14:01:00
я нахожу нужные мне айдишки локаций, выбираю локации по айдишке, как они чудесным образом окажутся отсортированными по дате?)
вот что можно осортировать по дате так это айдишки локаций
тогда когда я буду по ним делать map последовательно, выйдет то что надо

Vasily
23.08.2017
14:15:27
Кстати да
Айдишки проще отсортировать

Vladimir
23.08.2017
14:18:33
только непонятно когда их сортировать

Vlad
23.08.2017
14:37:00
на тему профайлеров, еще вот это случайно увидел: https://aloiskraus.wordpress.com/2017/08/17/memanalyzer-v2-5-released/
может оно поможет?

Vladimir
23.08.2017
14:38:12
Спасибо) может и поможет, если снова с GC будем бороться) я пока все никак до перфоманс профайлинга не доберусь, как доберусь скажу результаты
возник вопрос, а есть на сишарпе что-нибудь типа мейлбокса, типа отправил респонс клиенту, а сам продолжил обрабатывать в бэкграунде?

Roman
23.08.2017
14:47:21

Ilya
23.08.2017
14:50:04

Vladimir
23.08.2017
14:51:57

Ilya
23.08.2017
14:52:16
Запускать поток?
Прост new Thread(() => {foreach x in queue.GetConsumingEnumerable() {doWith(x)}}).Start()

Vladimir
23.08.2017
14:54:18
оки, спасибо

Ilya
23.08.2017
14:55:27
если хочешь обратной связи от этого треда, то можно засылать в очередь вместе с твоим объектом TaskCompletionSource и когда закончил делать дела в треде сетить его

Vladimir
23.08.2017
14:56:26
не, не хочу, просто хочу чтобы он не умирал вместе с потоком запроса

Google

Ilya
23.08.2017
14:58:27
так тред стартовать надо не в потоке запроса, а где-то в другом месте. В потоке запроса тебе надо класть в очередь что-то

Vladimir
23.08.2017
15:01:12
а где его стартовать) только в статическом классе значит, как я и сейчас делаю с мейлбоксом, так?

Ilya
23.08.2017
15:03:41
ну да
альтернативу мейлбоксу же просил, вот это в чистом виде оно. Очередь+бэкграунд воркер
не обязательно в статическом, но где-то один раз.

Friedrich
23.08.2017
15:11:50
Господа, кто-нибудь собирал F#-приложения на .NET Core в x86-режиме? Хочу свою программу проверить под 32 битами, и не могу понять, как её собрать в этом режиме ~_~
dotnet build -r win10-x86 ругается на какие-то недостающие ассеты.
Кажется, разобрался. Надо было делать так:
dotnet restore -r win10-x86
dotnet publish -c Release -r win10-x86

Vladimir
23.08.2017
15:21:18
по идее уже рестор помог, паблиш необязательно)

Friedrich
23.08.2017
15:22:01
Не, рестор обязательно делать с указанием «ненативного» рантайма.

Vladimir
23.08.2017
15:22:11
да, я про это и говорю

Friedrich
23.08.2017
15:22:49
Я опубликовал, но как теперь запускать? %)
Похоже, у меня 64-битный dotnet. Как и где брать 32-битный — непонятно.

Aleksander
23.08.2017
15:27:18
https://www.microsoft.com/net/download/core - тут вроде есть x86 инсталлеры)

Friedrich
23.08.2017
15:35:41
Ладно, я решил, что мне не очень это надо :)

Vladimir
23.08.2017
16:07:17
http://clip2net.com/s/3NaA0ml

Mike
23.08.2017
16:10:26
Пытаюсь перенести пример из документации из C# в код на F#:
код из примера:
var client = new AmazonDynamoDBClient();
var table = Table.LoadTable(client, "AnimalsInventory");
var item = table.GetItem(3, "Horse");
Код на F#:
let client = new AmazonDynamoDBClient()
let table = Table.LoadTable(client, "Subscriptions")
let item = table.GetItem("0")
Страшно ругается:
error FS0039: The field, constructor or member 'GetItem' is not defined. Maybe you want one of the following:↔️ GetItemAsync↔️ GetType [C:\Users\mpotanin\wg\exp\FSharp-Template-for-Aws-Lambda\FSharp-Template-for-Aws-Lambda.fsproj]
Заменяю GetItem на GetItemAsync - ругается еще страшнее:
error FS0041: No overloads match for method 'GetItemAsync'. The available overloads are shown below (or in the Error List window). [C:\Users\mpotanin\wg\exp\FSharp-Template-for-Aws-Lambda\FSharp-Template-for-Aws-Lambda.fsproj]
Как с этим бороться?


Friedrich
23.08.2017
16:11:14
Начнём с того, что у тебя для GetItem явно другое количество аргументов.
Ну и компилятор чёт говорит, что вообще нету такого метода. А на самом деле есть? Точно?
Может, это экстеншен какой-то?
(в F# экстеншены работают так же, как в C# — нужно просто открыть нужный неймспейс)

Google

Ilya
23.08.2017
16:12:37
ну и тип у первого аргумента разный

Friedrich
23.08.2017
16:13:39
Я не знаю — может, так и нужно. Может, там метод принимает params-массив для какого-то запроса к таблице.

Mike
23.08.2017
16:15:58
Добавление аргументов не помогает. В документации тип аргумента Primitive. По смыслу это ключ в таблице, котрый может быть и строкой и числом.
А как узнать, что это экшен?

Aleksander
23.08.2017
16:16:40

Ilya
23.08.2017
16:17:01
Так значит там implicit конверсии работают на Primitive https://stackoverflow.com/questions/10719770/is-there-anyway-to-use-c-sharp-implicit-operators-from-f можно сделать как тут советуют, а можно создавать тип Primitive явно

Friedrich
23.08.2017
16:18:16
А то я не могу там найти никаких Table.LoadTable, а тут это критический кусочек паззла.

Mike
23.08.2017
16:19:12
http://docs.aws.amazon.com/sdk-for-net/v2/developer-guide/dynamodb-intro.html

Friedrich
23.08.2017
16:19:12
Всё, что я нашёл — это вот это: http://docs.aws.amazon.com/sdkfornet/v3/apidocs/index.html?page=DynamoDBv2/MDynamoDBv2DynamoDBGetItemGetItemRequest.html
Но там сигнатура и класс немного другие.

Vladimir
23.08.2017
16:19:31

Friedrich
23.08.2017
16:20:11
Я же правильно понял, что Table.LoadTable это какой-то статический метод?
Во! http://docs.aws.amazon.com/sdkfornet/latest/apidocs/items/MDynamoDBv2DocumentModelTableLoadTableIDynamoDBStringNET35.html
http://docs.aws.amazon.com/sdkfornet/latest/apidocs/items/MDynamoDBv2DocumentModelTableGetItemPrimitivePrimitiveNET35.html — таки пишут, что есть такой метод у Table.

Ilya
23.08.2017
16:23:28
ну так проблема явно в имплисит конверсиях, ф шарп их не может просто так делать, ему надо либо подсказывать, либо не использовать их

Friedrich
23.08.2017
16:23:54
http://docs.aws.amazon.com/sdkfornet/latest/apidocs/items/TDynamoDBv2DocumentModelPrimitiveNET35.html — вот класс примитива, можно просто конструкторы у него вызвать попробовать.

Ilya
23.08.2017
16:24:02
угу

Friedrich
23.08.2017
16:24:32
Вот так:
let item = table.GetItem(Amazon.DynamoDBv2.DocumentModel.Primitive "0")

Mike
23.08.2017
16:26:04