5

голосов
2

ответ
97

Просмотры

IOUArray to ByteSring, as quickly as possible

Мне нужно очень быстро мутировать элементы в массиве фиксированного размера в Word8. Для этого я использую IOUArray. Мне нужно отправить этот массив через соединение WebSocket. Функция sendBinaryData из пакета WebSockets требует байтовой строки. Мне нужно преобразовать из одного представления в другое. Я использую эту функцию в настоящее время: arrayToBS :: IOUArray Int Word8 -> IO (BS.ByteString) arrayToBS = (БПМЖ BS.pack). getElems Эта функция преобразует элементы массива к [Word8] перед упаковкой, что список в виде массива байт, и из профилирование я могу видеть, что это довольно медленно. Мне было интересно, если есть способ ускорить эту функцию, или, возможно, отправить массив через подключение WebSocket напрямую? Массив, который я использую в настоящее время является: размер = 1000; numBytes = размер * размер * 4 newBuffer :: IO (IOUArray Int Word8) newBuffer = newArray (0, numBytes) 200 :: IO (IOUArray Int Word8) и исключением из отчета об исполнении: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 в идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 IO (IOUArray Int Word8) и исключением из отчета об исполнении: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 в идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 IO (IOUArray Int Word8) и исключением из отчета об исполнении: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 в идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 В идеале arrayToBS бы намного быстрее чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 28: 1-37 88,1 99,0 newBuffer Lib ЦСИ / Lib.hs: (23,1) - (25,12) 9,9 0,8 В идеале arrayToBS бы намного быстрее чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 8 В идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1 8 В идеале arrayToBS бы гораздо быстрее, чем создание массива. Если изменить размер до 100: COST CENTER МОДУЛЬ SRC% времени% Alloc arrayToBS Lib ЦСИ / Lib.hs: 21: 1-37 100,0 86,1 mkEncodeTable.table Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs : 105: 5-75 0.0 8.0 mkEncodeTable.ix Data.ByteString.Base64.Internal данных / байтовой строки / Base64 / Internal.hs: 104: 5-43 0,0 1,1
felixgb
6

голосов
1

ответ
1.7k

Просмотры

Invalid Json: Нет содержания для отображения истекало входной текст при использовании воспроизведения тела анализатора

Я пытаюсь проверить метод контроллера, который пытается разобрать JSON отправлены в запросе: Защита addRoomToProfileForTime = Action.async (parse.json [AddRoomToProfileForTimeRequest]) {запроса => profileService.addRoomToProfileForTime (request.body.roomId, request.body .profileId, request.body.timeRange) .value.map {случай Xor.Right (_) => Ok случай Xor.Left (ERR) => BadRequest (Json.toJson (ERR))}} Это класс так, что представляет собой запрос: конечный случай класса AddRoomToProfileForTimeRequest (RoomID: Int, ProfileID: Int, TimeRange: TimeRange) неявное вал addRoomToProfileForTimeRequestFormat: Формат [AddRoomToProfileForTimeRequest] = Json.format Этот код работает, как ожидалось с я сделать запрос следующим образом: завиток -H " Content-Type: применение / JSON»-X POST -d«{ "RoomID": 3, "ProfileID":1, "TimeRange": { "ID": 1, "Fromtime": "2000-01-01T01: 01", "Totime": "2000-01-01T02: 01"}}»HTTP: // локальный: 9000 / API / профили / addRoomToProfileForTime Но я пытаюсь написать тест для этого метода (обратите внимание, что я использую macwire для инъекций зависимостей, следовательно, не может использовать WithApplication: «добавить номер в профиль для времени» в новом TestContext {вал RoomID = 1 вал ProfileID = 1 вал от = "2000-01-01T01: 01" VAL для = "2000-01-01T02: 01" вал requestJson = Json.obj ( "RoomID" -> RoomID, "ProfileID" -> ProfileID, "TimeRange" -> Json.obj ( "ID" -> 1, "Fromtime" -> от "Totime" ->к)) неявной системы валь = ActorSystem () неявным вал Materializer = ActorMaterializer () = Val fakeReq FakeRequest (Helpers.POST, "API / профили / addRoomToProfileForTime") .withHeaders (CONTENT_TYPE -> "приложения / JSON") .withJsonBody (requestJson ) вал результат = profileController.addRoomToProfileForTime () (fakeReq) .run VAL содержание = contentAsString (результат) Println (содержание) статус (результат) должен equalTo (OK)} Однако этот тест не с плохим запросом от игры: Bad Request Для запрос «POST апи / профили / addRoomToProfileForTime» [Invalid Json: нет содержания для отображения в связи с истекшим входа в [Источник:API / профили / addRoomToProfileForTime ") .withHeaders (CONTENT_TYPE -> "приложения / JSON") .withJsonBody (requestJson) Val результат = profileController.addRoomToProfileForTime () (fakeReq) .run содержание = contentAsString (результат) Println (содержание) статус VAL ( результат) должен equalTo (OK)} Однако этот тест не с плохим запросом от игры: Bad Request для запроса «POST API / профилей / addRoomToProfileForTime» [Invalid Json: Нет содержимого для отображения в связи с истекшим входом в [Источнике :API / профили / addRoomToProfileForTime ") .withHeaders (CONTENT_TYPE -> "приложения / JSON") .withJsonBody (requestJson) Val результат = profileController.addRoomToProfileForTime () (fakeReq) .run содержание = contentAsString (результат) Println (содержание) статус VAL ( результат) должен equalTo (OK)} Однако этот тест не с плохим запросом от игры: Bad Request для запроса «POST API / профилей / addRoomToProfileForTime» [Invalid Json: Нет содержимого для отображения в связи с истекшим входом в [Источнике :запустить VAL содержание = contentAsString (результат) Println (содержание) статус (результат) должен equalTo (OK)} Однако этот тест не с плохим запросом от игры: Bad Request Для запроса 'POST API / профилей / addRoomToProfileForTime' [Invalid Json: нет содержания для отображения в связи с истекшим входа в [Источник:запустить VAL содержание = contentAsString (результат) Println (содержание) статус (результат) должен equalTo (OK)} Однако этот тест не с плохим запросом от игры: Bad Request Для запроса 'POST API / профилей / addRoomToProfileForTime' [Invalid Json: нет содержания для отображения в связи с истекшим входа в [Источник:[email protected] ; Линия: 1, колонка: 0]] Если я разобрать JSON с request.body.asJson метод ведет себя , как ожидалось. Это только с помощью метода синтаксического анализа тела выше , что я получаю эту ошибку.
felixgb