Как стать автором
Обновить

Комментарии 38

прошу прощения за, возможно, глупый вопрос, но для чего так делать? И почему именно 24? (Я не программист, и только недавно ради интереса решил ознакомиться с ruby, по-этому стало интересно)
Возможно изза того что большинство строк короче 23 символов
Возможно, но из-за чего такое странное число 24? Не 32/64? (Ну, или 42 в конце-концов :) )
Видимо, в структуре есть и другие данные (та же длина строки) длиной, например, 4 байта для 32-бит и 8 байт для 64-бит, чтоб получилось 16 и 32 байт соответственно.
Упс, до юнион не додумался :(
Размер структуры?
8+8+8
Товарищи, перед тем как поставить минус, смотрите хронологию комментариев. Мой комментарий появился задолго до других про union.
То ли некоторые матчасти про зависимость размера указателей от разрядности архитектуры не знают, то ли нет демократии на хабре.
Там для хранения значений, как я понял, используется в частности структура Rstring. Для длинных строк там хранятся указатели на буфер в куче и длина строки, а короткие строки целиком запихиваются в нее. В 32-битной системе 3 4-байтных поля — это 12 байт, в 64-битной — 24 байта, вот отсюда и 23 символа.
А Вы не поняли просто потому что Ализар не до конца передрал вот эту статью (ну, как обычно).
А в ней четко описана структура RString :
struct RString {

  struct RBasic basic;

  union {
    struct {
      long len;
      char *ptr;
      union {
        long capa;
        VALUE shared;
      } aux;
    } heap;

    char ary[RSTRING_EMBED_LEN_MAX + 1];
  } as;
};

Ключевое слово union обозначает объединение, а значит массив ary должен занимать столько же, сколько занимает всё, написанное до него (а это как раз 24 байта на х64-системах).
это в корне меняет дело! Спасибо.
Прошу прощения. :(
Почему статья на Хабре не отмечена, как перевод?
Формально это не перевод.
А что это? :)
текст испоганеный ализаром
ребрендинг. alizar software
Я сначала тоже негативно воспринял статью, поскольку раньше читал оригинал.
Но я подумал немного — пускай Ализар перевел плохо, пускай он это сделал частично из личных побуждений (насколько я понял, ему нравится увеличивать свою карму), но ведь толк от статьи есть — те, кто не знает английского, получили интересную информацию и могут копнуть дальше если им интересно, а это уже вклад.
Давайте не будем такими строгими к человеку.
Я и не предлагаю его казнить. Без Ализара на Хабре было бы гораздо меньше полезной информации. Целью моих комментариев было пристыдить его за халтурность перевода и отсутствие ссылки на оригинал.

А сделал он это, вероятно, не из-за кармы, а из-за денег: по ППА переводы стоят в 2 раза меньше уникальных статей.
Что значит отсутствие ссылки на оригинал? В самом начале топика стоит ссылка, в середине топика — фамилия разработчика, который всё это обнаружил, автора поста в блоге. Я сначала хотел делать дословный перевод топика, сейчас очень жалею, что передумал.
Вижу, я перепутал, извините.
Ну, например, в Твиттере большинство сообщений 28 символов длиной. А ведь он на Руби. Почему же тогда не 28, например?
Прочитал коммент выше. Теперь понятно.
Код Твиттер по большей части переписали на Scala. Хотя сути это не меняет.
Интересно, но после прочтения статьи меня немного другое заинтересовало.

Вопрос к знающим:
В каких еще ЯП интерпретатор/виртуальная машина/рантайм проверяем строку на уникальность?
И еще, получается что скорость работы софтины будет снижаться пропорционально количеству строк одновременно хранящихся в памяти?
Да почти все проверяют. В делфи тип строки явно включает в себя счетчик ссылок на неё. .NET этим занимается. В С\С++ в явном виде этого нет (ну потому что встроенного класса строк нет), но почти все реализации строк (а хоть бы в тех же MFC\ATL) предполагают такую возможность. Ну и т.д. Без этого было бы хуже, поскольку в среднестатистической программе дофига одинаковых строк.
PHP, вроде, работает также. И не только со строками, но и с массивами и объектами.

Насчёт скорости не понял. Да, время инициализации увеличивается (и то, смотря что быстрее поиск или лишнее выделение памяти), но само время работы — нет (вряд ли проверка при каждом изменении). Да и поиск уникальных, наверное, нелинейный а, например, половинным делением по хэшу или ещё какому индексу.
да не работает php так же. Если вы задаёте разным переменным одинаковые строки, то он их и разместит в памяти.
Питон сравнивает не только строки, но и небольшие числа:

>>> i = 32
>>> j = 32
>>> i is j
True

>>> i = 9000
>>> j = 9000
>>> i is j
False

(is — это проверка, что слева и справа один и тот же объект)

C / C++ / Objective-C компиляторы умеют объединять одинаковые строковые константы, например.

Сравнивается хеш, а не строковые данные — это очень эффективная операция.
>>> i = 32
>>> j = 32
>>> j is i
True
>>> j = 40
>>> i
32
>>> i is j
False

Фух, выдохнул.

Вообще, странно, что так сделано. Т.е. оно вначале 1 раз выделило память, а при изменении значения одной из переменной выделило второй. Такой типа copy on write?
На самом деле эти числа (-5..256) создаются еще при старте интерпретатора, а операция i = 32 — просто копирование указателя.

Ссылки: документация, код, сибирь.
Как бы достаточно распространенная практика.
В C++ STL'e basic_string тоже хранит короткие строки в себе, без выделения памяти.
Правда размер более «человечный» — 16 / sizeof(_Elem), то есть для string — 16 символов, для wstring — 8.
23 символа хватит всем!
Учимся писать кратко.
А что )
Даже не знаю в каких случаях стоит помнить об этом нюансе. Ведь это имеет значение только при создании миллионов строк.

P.S. необъяснимое чувство — читать плохо переведенную статью, которую уже читал на hacker news
Alizar отрицает, что это перевод и я сним согласен — это ужасный огрызок от замечательной статьи.
Заголовок статьи навеял вопрос, который меня очень интересует — давно ли «на 92% меньше» стало означать «в 1.92 раза меньше», а не «8% от исходной величины»? Это случилось как-то очень неожиданно, и непонятно, почему. Вдруг кто-нибудь с этим разобрался?
С «меньше» не означает, а вот с «быстрее» вполне можно трактовать, как «скорость увеличилась на 92% от исходной, а значит время стало в 1,92 раза меньше». «Мерседес на 100% быстрее Запоржца» вы же не поймете, как «Мерседес перемещается мгновенно»?

Для всех, что было понятно о чем речь:
заголовок поста был сменен с «Строки до 23 символов в Ruby обрабатываются на 92% быстрее» на «Строки до 23 символов в Ruby обрабатываются в 1,92 раза быстрее»
Зарегистрируйтесь на Хабре, чтобы оставить комментарий

Публикации

Истории