Я пытаюсь преобразовать изображение, полученное из ресурсов, в ByteArray, который позже будет отправлен через Socket.Я измерял время каждого из этих преобразований.
Я делал это как на Flutter, так и на нативном Android (Kotlin).Все тесты были выполнены на одном изображении, размер которого составлял около 1-2 МБ.
Код флаттера:
sendMessage() async {
if (socket != null) {
Stopwatch start = Stopwatch()..start();
final imageBytes = await rootBundle.load('assets/images/stars.jpg');
final image = base64Encode(imageBytes.buffer.asUint8List(imageBytes.offsetInBytes, imageBytes.lengthInBytes));
print('Converting took ${start.elapsedMilliseconds}');
socket.emit("message", [image]);
}
}
Код Котлина:
private fun sendMessage() {
var message = ""
val thread = Thread(Runnable {
val start = SystemClock.elapsedRealtime()
val bitmap = BitmapFactory.decodeResource(resources, R.drawable.stars)
message = Base64.encodeToString(getBytesFromBitmap(bitmap), Base64.DEFAULT)
Log.d("Tag", "Converting time was : ${SystemClock.elapsedRealtime() - start}")
})
thread.start()
thread.join()
socket.emit("message", message)
}
private fun getBytesFromBitmap(bitmap: Bitmap): ByteArray? {
val stream = ByteArrayOutputStream()
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, stream)
return stream.toByteArray()
}
Я действительно ожидал, что нативный код будет намного быстрее, чем код Флаттера, но это не так.. Преобразование для флаттера занимает около 50 мс, а для родного - около 2000-3000 мс.Я подумал, что может иметь место Threading, поэтому я попытался запустить это преобразование в фоновом потоке для собственного кода, но это не помогло.Подскажите, пожалуйста, почему так по-разному, и как я могу лучше реализовать его в нативном коде?Есть ли способ пропустить приведение к растровому изображению и т. Д.?Может быть, это так долго.
РЕДАКТИРОВАТЬ.Добавлена функция getBytesFromBitmap