[Go, Программирование] Конвертация целых чисел в interface{} в Go 1.15
Автор
Сообщение
news_bot ®
Стаж: 6 лет 9 месяцев
Сообщений: 27286
В релиз ноутах Go 1.15 я обнаружил следующую запись:
Конвертация малых целочисленных значений в интерфейс теперь происходит без аллокаций.
В этой небольшой заметке я расскажу в чем заключается оптимизация.
Как устроен interface{} в Go
Чтобы понять, как данная оптимизация работает, нужно освежить в памяти устройство interface{} в Go. Я не буду сильно погружаться в эту тему, просто напомню основные идеи.
Внутри src/runtime/runtime2.go есть вот такая структура:
type iface struct {
tab *itab
data unsafe.Pointer
}
Это и есть наш интерфейс. По факту interface{} представляет собой всего 2 указателя:
- data — указатель на сами данные, под которые была выделенная память на хипе
- tab — метаинформация об интерфейсе и базовом типе
Визуализируем полученные знания и пойдем дальше.
В чем собственно проблема
В Go аллокации новых объектов в хипе дорогие. Поэтому если вы хотите написать производительный код, то с этой проблемой вы обязательно столкнетесь. Так что любые, даже на первый взгляд незначительные, оптимизации могут улучшишь производительность всего приложения.
Проблема, которую решает рассматриваемая оптимизация, заключается в том, что аллоцировать объекты под небольшие целые числа расточительная затея.
Как ее решили
Вот что сделали ребята из Go. В пакете runtime у них уже был статический массив целых чисел от 0 до 255. В момент, когда происходит конвертация целого числа в interface{}, происходит проверка находится ли это число заданном диапазоне и если да, то в поле data типа iface записывается указатель на элемент в этом массиве. Тем самым происходит избавление от лишней аллокации.
В Go подобного рода оптимизации не новы. Так, если вы создаете односимвольную ascii строку, то никаких выделений памяти не будет. Не будет их все по тому же сценарию: runtime Go содержит в себе статический массив односимвольных строк. Кстати, не стоит волноваться, так как сейчас в runtime живет всего лишь один статический массив значений от 0 до 255. Он переиспользуется для строковых представлений.
===========
Источник:
habr.com
===========
Похожие новости:
- [Информационная безопасность, Реверс-инжиниринг, Программирование микроконтроллеров, Производство и разработка электроники] Реверс embedded: трассировка кода через SPI-flash
- [Законодательство в IT, Копирайт] Российские издательства потребовали запретить в ЕС Telegram, YouTube и Mail.ru
- [PostgreSQL, Программирование, SQL, Администрирование баз данных] PostgreSQL Antipatterns: уникальные идентификаторы
- [Open source, Программирование, Rust] Закладывая фундамент будущего Rust (перевод)
- [Разработка веб-сайтов, PHP, Программирование, Проектирование и рефакторинг] Мёртвый код: найти и обезвредить
- [Интерфейсы, Дизайн] Восприятие интерфейсов пользователями на примере панелей из Lego (перевод)
- [Тестирование IT-систем, Big Data, Исследования и прогнозы в IT] Как сократить издержки на автотестах
- [Kotlin] Опыт оптимизации вычислений через динамическую генерацию байт-кода JVM
- [Высокая производительность, Облачные вычисления, API, TensorFlow] Google: внедрение OpenCL вдвое ускорило механизм логического вывода в TensorFlow
- [Системное программирование, Сетевые технологии, Серверное администрирование] Мониторинг вашей инфраструктуры с помощью Grafana, InfluxDB и CollectD (перевод)
Теги для поиска: #_go, #_programmirovanie (Программирование), #_go, #_golang, #_programmirovanie (программирование), #_optimizatsija (оптимизация), #_go, #_programmirovanie (
Программирование
)
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:59
Часовой пояс: UTC + 5
Автор | Сообщение |
---|---|
news_bot ®
Стаж: 6 лет 9 месяцев |
|
В релиз ноутах Go 1.15 я обнаружил следующую запись: Конвертация малых целочисленных значений в интерфейс теперь происходит без аллокаций.
Как устроен interface{} в Go Чтобы понять, как данная оптимизация работает, нужно освежить в памяти устройство interface{} в Go. Я не буду сильно погружаться в эту тему, просто напомню основные идеи. Внутри src/runtime/runtime2.go есть вот такая структура: type iface struct {
tab *itab data unsafe.Pointer } Это и есть наш интерфейс. По факту interface{} представляет собой всего 2 указателя:
Визуализируем полученные знания и пойдем дальше. В чем собственно проблема В Go аллокации новых объектов в хипе дорогие. Поэтому если вы хотите написать производительный код, то с этой проблемой вы обязательно столкнетесь. Так что любые, даже на первый взгляд незначительные, оптимизации могут улучшишь производительность всего приложения. Проблема, которую решает рассматриваемая оптимизация, заключается в том, что аллоцировать объекты под небольшие целые числа расточительная затея. Как ее решили Вот что сделали ребята из Go. В пакете runtime у них уже был статический массив целых чисел от 0 до 255. В момент, когда происходит конвертация целого числа в interface{}, происходит проверка находится ли это число заданном диапазоне и если да, то в поле data типа iface записывается указатель на элемент в этом массиве. Тем самым происходит избавление от лишней аллокации. В Go подобного рода оптимизации не новы. Так, если вы создаете односимвольную ascii строку, то никаких выделений памяти не будет. Не будет их все по тому же сценарию: runtime Go содержит в себе статический массив односимвольных строк. Кстати, не стоит волноваться, так как сейчас в runtime живет всего лишь один статический массив значений от 0 до 255. Он переиспользуется для строковых представлений. =========== Источник: habr.com =========== Похожие новости:
Программирование ) |
|
Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы не можете скачивать файлы
Текущее время: 22-Ноя 19:59
Часовой пояс: UTC + 5