#prog #go
В Go недавно (кстати, thanks @go_perf) внесли изменение: "strconv: optimize Parse for []byte arguments". Что же там такого сделали? Читаем:
When one has a []byte on hand, but desires to call the Parse functions,
the conversion from []byte to string would allocate.
any of the Parse functions. Together with the compiler optimization
where the compiler stack allocates any string smaller than 32B
this makes most valid inputs for strconv.ParseXXX(string(b), ...)
not require an allocation for the input string.
<...>
Previously, this was not possible since the input leaked to the error,
which causes the prover to give up and instead heap copy the []byte.
We fix this by copying the input string in the error case.
The advantage of this change is that you can now call strconv.ParseXXX
with a []byte without allocations (most times) in the non-error case.
The detriment is that the error-case now has an extra allocation.
We should optimize for the non-error path, rather than the error path.
Так а для чего это в принципе понадобилось? Дело в том, что строки в Go — это единственный, помимо числовых, неизменяемый тип данных. Не смотря на то, что представление строки — это префикс представления слайса (указатель и длина) и, по идее, конвертация из одного в другое должна быть дешёвой, в общем случае это делать небезопасно: этот слайс могут менять где-то в другом месте и таким образом инвалидировать иммутабельность строки. Именно поэтому конвертация из
(Кстати, функции для парсинга почему-то хоть и возвращают всегда
Как и описано в изменении, на error path строка теперь копируется. Но причём тут extra allocation, если аллокация и так раньше была? Дело в том, как именно это копирование строки реализовано — через написанную на месте функцию
Для сравнения: в Rust операция парсинга (которая, между прочим, называется одинаково вне зависимости от разбираемого типа и даже может поддержать кастомный тип через реализацию FromStr) проводится на
TL;DR: отсутствие иммутабельности в Go (как, впрочем, и странные решения в стандартной библиотеке) напрямую ведёт к необходимости трейдоффов по производительности.
В Go недавно (кстати, thanks @go_perf) внесли изменение: "strconv: optimize Parse for []byte arguments". Что же там такого сделали? Читаем:
When one has a []byte on hand, but desires to call the Parse functions,
the conversion from []byte to string would allocate.
var b []byte = ...This changes it such that the input string never escapes from
v, err := strconv.ParseXXX(string(b), ...)
any of the Parse functions. Together with the compiler optimization
where the compiler stack allocates any string smaller than 32B
this makes most valid inputs for strconv.ParseXXX(string(b), ...)
not require an allocation for the input string.
<...>
Previously, this was not possible since the input leaked to the error,
which causes the prover to give up and instead heap copy the []byte.
We fix this by copying the input string in the error case.
The advantage of this change is that you can now call strconv.ParseXXX
with a []byte without allocations (most times) in the non-error case.
The detriment is that the error-case now has an extra allocation.
We should optimize for the non-error path, rather than the error path.
Так а для чего это в принципе понадобилось? Дело в том, что строки в Go — это единственный, помимо числовых, неизменяемый тип данных. Не смотря на то, что представление строки — это префикс представления слайса (указатель и длина) и, по идее, конвертация из одного в другое должна быть дешёвой, в общем случае это делать небезопасно: этот слайс могут менять где-то в другом месте и таким образом инвалидировать иммутабельность строки. Именно поэтому конвертация из
[]byte
в string
в общем случае должна аллоцировать память. Да, в Go есть escape analysis, но он тут не работал из-за сомнительного дизайн-решения: ошибка парсинга включает в себя текст разбираемой строки.(Кстати, функции для парсинга почему-то хоть и возвращают всегда
*NumError
— и даже пишут об этом в документации — но скрывают это в типах за error)Как и описано в изменении, на error path строка теперь копируется. Но причём тут extra allocation, если аллокация и так раньше была? Дело в том, как именно это копирование строки реализовано — через написанную на месте функцию
cloneString
:func cloneString(x string) string { return string([]byte(x)) }
И тут действительно две аллокации: из строки в слайс и из слайса в строку — на одну больше, чем до изменения. Казалось бы, можно использовать strings.Clone, которая ровно для этого и предназначена (и, кстати, которая эксплуатирует одинаковое представление префикса слайса и строки). Но нет, как написано в комментариях, транзитивной зависимостью strings
является пакет unicode с объёмными таблицами, добавляющими размер итоговому бинарю.Для сравнения: в Rust операция парсинга (которая, между прочим, называется одинаково вне зависимости от разбираемого типа и даже может поддержать кастомный тип через реализацию FromStr) проводится на
&str
. Какими бы не были байты на руках, их всегда можно привести к &[u8]
, ссылке на байтовый слайс, а их, в свою очередь, через std::str::from_utf8 к &str
. Это не совсем дёшево в том плане, что требует прохода по всем байтам для того, чтобы убедиться, что они корректно закодированы в UTF-8, но всё же не требует аллокации в куче. Иммутабельность ссылки на пару с borrow checker-ом гарантируют, что во время вызова str::parse
нижележащие байтики не будут изменены. При этом этот запрет на изменение действует лишь на время жизни ссылки, а потому ничто не мешает сделать это со ссылкой на некоторый изменяемый буфер.TL;DR: отсутствие иммутабельности в Go (как, впрочем, и странные решения в стандартной библиотеке) напрямую ведёт к необходимости трейдоффов по производительности.
👍9
Блог*
#prog #rust #rustlib #serde #amazingopensource Хозяйке на заметку Подборка библиотек для работы с serde от замечательного Толяна dtolnay. erased-serde — трейты из serde со стёртыми типами. Позволяют сделать из (де)сериализаторов трейт-объекты. Обычно это…
#prog #rust #serde #article
Exploring Traits with Erased ‘serde’ — статья с демонстрацией того, как erased-serde выглядит на практике и где это может пригодиться
Exploring Traits with Erased ‘serde’ — статья с демонстрацией того, как erased-serde выглядит на практике и где это может пригодиться
The Coded Message
Exploring Traits with Erased 'serde'
I came across a programming problem recently where I wanted to use dynamic polymorphism with serde. This turned out to be much easier than I expected, and I thought it was an interesting enough case study to share, especially for people who are learning Rust.…
#prog #rust #article
Trivia About Rust Types: An (Authorized) Transcription of Jon Gjengset’s Twitter Thread
Коллекция небольших неожиданных фактов о типах в Rust. И пофиг, что это компиляция треда в твиттере, всё равно интересно
Trivia About Rust Types: An (Authorized) Transcription of Jon Gjengset’s Twitter Thread
Коллекция небольших неожиданных фактов о типах в Rust. И пофиг, что это компиляция треда в твиттере, всё равно интересно
The Coded Message
Trivia About Rust Types: An (Authorized) Transcription of Jon Gjengset's Twitter Thread
Preface (by Jimmy Hartzell) I am a huge fan of Jon Gjengset’s Rust for Rustaceans, an excellent book to bridge the gap between beginner Rust programming skills and becoming a fully-functional member of the Rust community. He’s famous for his YouTube channel…
👍4
То есть вы хотите сказать, что Грейдон Хоар бросил Rust ради того, чтобы работать над Swift? Это крайне упрощённое и потому неверное представление о ходе событий. Это заблуждение развенчал сам Грейдон.
Reddit
r/rust on Reddit: I wonder, why Graydon Hoare, the author of Rust, stopped contributing into it and switched to Swift?
Posted by u/IngvarrEm - 44 votes and 29 comments
👍5
#prog #web
Why your website should be under 14kB in size (перевод на Хабре)
Having a smaller website makes it load faster — that's not surprising.
What is surprising is that a 14kB page can load much faster than a 15kB page — maybe 612ms faster — while the difference between a 15kB and a 16kB page is trivial.
Why your website should be under 14kB in size (перевод на Хабре)
Having a smaller website makes it load faster — that's not surprising.
What is surprising is that a 14kB page can load much faster than a 15kB page — maybe 612ms faster — while the difference between a 15kB and a 16kB page is trivial.
Хабр
Почему ваш веб-сайт должен быть меньше 14 КБ
Чем меньше веб-сайт, тем быстрее он грузится, и это неудивительно. Удивительно то, что страница на 14 КБ может грузиться гораздо быстрее, чем страница на 15 КБ , даже на 612 мс быстрее, хотя разница...
👍4❤1👎1
— Надо разделять работу и нерабочее время, — говорит Антон и пушит в репу в час ночи.
🤮3🔥2
Forwarded from Врен о Японии для туриста
Увидеть желтый синкансен на японском вокзале – это хорошая примета! Поэтому суперэкспресс на фото фотографируют не только иностранные туристы, но и все подряд.
Такой поезд в народе называют Doctor Yellow, и он предназначен для тестирования железнодорожных путей. Пассажиров на нем нет, зато есть целый арсенал специальных датчиков. Во время тестирования он иногда разгоняется аж до 440 км/ч!
Желтых синкансенов нет ни в одном расписании, повезет – увидите (я вот ни разу не видел)! Отсюда (а также потому что желтый цвет символизирует счастье) и поверье, что встреча с таким поездом приносит удачу.
Такой поезд в народе называют Doctor Yellow, и он предназначен для тестирования железнодорожных путей. Пассажиров на нем нет, зато есть целый арсенал специальных датчиков. Во время тестирования он иногда разгоняется аж до 440 км/ч!
Желтых синкансенов нет ни в одном расписании, повезет – увидите (я вот ни разу не видел)! Отсюда (а также потому что желтый цвет символизирует счастье) и поверье, что встреча с таким поездом приносит удачу.
❤13
Осторожно, если вы оставляете комментарии под моими постами — я могу найти ваш публичный блог и что-то с него репостнуть
❤6😱6👍3❤🔥2
Forwarded from Какой я сегодня кролик? (Totally Animated Rabbit)
*(ava + 5)
Есть такой стиль анимации "тотальная". Это когда в кадре двигаются не только персонажи, но ещё и задний фон, меняется перспектива как в фильме. В итоге каждый кадр надо перерисовывать с нуля. Тотальная анимация является самым сложным видом анимации, требующим сильной проработки взаимного расположения объектов и прочих деталей.
Не смотря на все сложности, в СССР сняли короткометражку с использованием тотальной анимации. Был 1986 год, так что естественно всё это рисовалось от руки.
https://youtu.be/I5DofuztDUg
Соответственно, у меня на аве кадр из этого мультфильма.
Ну и префикс "Totally Animated" в честь стиля анимации.
Есть такой стиль анимации "тотальная". Это когда в кадре двигаются не только персонажи, но ещё и задний фон, меняется перспектива как в фильме. В итоге каждый кадр надо перерисовывать с нуля. Тотальная анимация является самым сложным видом анимации, требующим сильной проработки взаимного расположения объектов и прочих деталей.
Не смотря на все сложности, в СССР сняли короткометражку с использованием тотальной анимации. Был 1986 год, так что естественно всё это рисовалось от руки.
https://youtu.be/I5DofuztDUg
Соответственно, у меня на аве кадр из этого мультфильма.
Ну и префикс "Totally Animated" в честь стиля анимации.
👍6❤1