Комментарии 38
прошу прощения за, возможно, глупый вопрос, но для чего так делать? И почему именно 24? (Я не программист, и только недавно ради интереса решил ознакомиться с ruby, по-этому стало интересно)
+2
Возможно изза того что большинство строк короче 23 символов
0
Возможно, но из-за чего такое странное число 24? Не 32/64? (Ну, или 42 в конце-концов :) )
+2
Видимо, в структуре есть и другие данные (та же длина строки) длиной, например, 4 байта для 32-бит и 8 байт для 64-бит, чтоб получилось 16 и 32 байт соответственно.
+1
Размер структуры?
8+8+8
8+8+8
0
Там для хранения значений, как я понял, используется в частности структура Rstring. Для длинных строк там хранятся указатели на буфер в куче и длина строки, а короткие строки целиком запихиваются в нее. В 32-битной системе 3 4-байтных поля — это 12 байт, в 64-битной — 24 байта, вот отсюда и 23 символа.
+3
А Вы не поняли просто потому что Ализар не до конца передрал вот эту статью (ну, как обычно).
А в ней четко описана структура RString :
Ключевое слово union обозначает объединение, а значит массив ary должен занимать столько же, сколько занимает всё, написанное до него (а это как раз 24 байта на х64-системах).
А в ней четко описана структура 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-системах).
+37
это в корне меняет дело! Спасибо.
+1
Прошу прощения. :(
+1
Почему статья на Хабре не отмечена, как перевод?
+5
Формально это не перевод.
-11
А что это? :)
+6
текст испоганеный ализаром
+29
ребрендинг. alizar software
-1
Я сначала тоже негативно воспринял статью, поскольку раньше читал оригинал.
Но я подумал немного — пускай Ализар перевел плохо, пускай он это сделал частично из личных побуждений (насколько я понял, ему нравится увеличивать свою карму), но ведь толк от статьи есть — те, кто не знает английского, получили интересную информацию и могут копнуть дальше если им интересно, а это уже вклад.
Давайте не будем такими строгими к человеку.
Но я подумал немного — пускай Ализар перевел плохо, пускай он это сделал частично из личных побуждений (насколько я понял, ему нравится увеличивать свою карму), но ведь толк от статьи есть — те, кто не знает английского, получили интересную информацию и могут копнуть дальше если им интересно, а это уже вклад.
Давайте не будем такими строгими к человеку.
+2
Я и не предлагаю его казнить. Без Ализара на Хабре было бы гораздо меньше полезной информации. Целью моих комментариев было пристыдить его за халтурность перевода и отсутствие ссылки на оригинал.
А сделал он это, вероятно, не из-за кармы, а из-за денег: по ППА переводы стоят в 2 раза меньше уникальных статей.
А сделал он это, вероятно, не из-за кармы, а из-за денег: по ППА переводы стоят в 2 раза меньше уникальных статей.
-1
Ну, например, в Твиттере большинство сообщений 28 символов длиной. А ведь он на Руби. Почему же тогда не 28, например?
-4
Интересно, но после прочтения статьи меня немного другое заинтересовало.
Вопрос к знающим:
В каких еще ЯП интерпретатор/виртуальная машина/рантайм проверяем строку на уникальность?
И еще, получается что скорость работы софтины будет снижаться пропорционально количеству строк одновременно хранящихся в памяти?
Вопрос к знающим:
В каких еще ЯП интерпретатор/виртуальная машина/рантайм проверяем строку на уникальность?
И еще, получается что скорость работы софтины будет снижаться пропорционально количеству строк одновременно хранящихся в памяти?
+1
Да почти все проверяют. В делфи тип строки явно включает в себя счетчик ссылок на неё. .NET этим занимается. В С\С++ в явном виде этого нет (ну потому что встроенного класса строк нет), но почти все реализации строк (а хоть бы в тех же MFC\ATL) предполагают такую возможность. Ну и т.д. Без этого было бы хуже, поскольку в среднестатистической программе дофига одинаковых строк.
+2
PHP, вроде, работает также. И не только со строками, но и с массивами и объектами.
Насчёт скорости не понял. Да, время инициализации увеличивается (и то, смотря что быстрее поиск или лишнее выделение памяти), но само время работы — нет (вряд ли проверка при каждом изменении). Да и поиск уникальных, наверное, нелинейный а, например, половинным делением по хэшу или ещё какому индексу.
Насчёт скорости не понял. Да, время инициализации увеличивается (и то, смотря что быстрее поиск или лишнее выделение памяти), но само время работы — нет (вряд ли проверка при каждом изменении). Да и поиск уникальных, наверное, нелинейный а, например, половинным делением по хэшу или ещё какому индексу.
-2
Питон сравнивает не только строки, но и небольшие числа:
(
C / C++ / Objective-C компиляторы умеют объединять одинаковые строковые константы, например.
Сравнивается хеш, а не строковые данные — это очень эффективная операция.
>>> i = 32
>>> j = 32
>>> i is j
True
>>> i = 9000
>>> j = 9000
>>> i is j
False
(
is
— это проверка, что слева и справа один и тот же объект)C / C++ / Objective-C компиляторы умеют объединять одинаковые строковые константы, например.
Сравнивается хеш, а не строковые данные — это очень эффективная операция.
+2
>>> i = 32
>>> j = 32
>>> j is i
True
>>> j = 40
>>> i
32
>>> i is j
False
Фух, выдохнул.
Вообще, странно, что так сделано. Т.е. оно вначале 1 раз выделило память, а при изменении значения одной из переменной выделило второй. Такой типа copy on write?
>>> j = 32
>>> j is i
True
>>> j = 40
>>> i
32
>>> i is j
False
Фух, выдохнул.
Вообще, странно, что так сделано. Т.е. оно вначале 1 раз выделило память, а при изменении значения одной из переменной выделило второй. Такой типа copy on write?
+1
На самом деле эти числа (-5..256) создаются еще при старте интерпретатора, а операция
Ссылки: документация, код,сибирь.
i = 32
— просто копирование указателя.Ссылки: документация, код,
+5
Как бы достаточно распространенная практика.
В C++ STL'e basic_string тоже хранит короткие строки в себе, без выделения памяти.
Правда размер более «человечный» — 16 / sizeof(_Elem), то есть для string — 16 символов, для wstring — 8.
В C++ STL'e basic_string тоже хранит короткие строки в себе, без выделения памяти.
Правда размер более «человечный» — 16 / sizeof(_Elem), то есть для string — 16 символов, для wstring — 8.
+1
23 символа хватит всем!
+6
Учимся писать кратко.
А что )
А что )
+1
Даже не знаю в каких случаях стоит помнить об этом нюансе. Ведь это имеет значение только при создании миллионов строк.
P.S. необъяснимое чувство — читать плохо переведенную статью, которую уже читал на hacker news
P.S. необъяснимое чувство — читать плохо переведенную статью, которую уже читал на hacker news
0
Заголовок статьи навеял вопрос, который меня очень интересует — давно ли «на 92% меньше» стало означать «в 1.92 раза меньше», а не «8% от исходной величины»? Это случилось как-то очень неожиданно, и непонятно, почему. Вдруг кто-нибудь с этим разобрался?
+1
С «меньше» не означает, а вот с «быстрее» вполне можно трактовать, как «скорость увеличилась на 92% от исходной, а значит время стало в 1,92 раза меньше». «Мерседес на 100% быстрее Запоржца» вы же не поймете, как «Мерседес перемещается мгновенно»?
Для всех, что было понятно о чем речь:
заголовок поста был сменен с «Строки до 23 символов в Ruby обрабатываются на 92% быстрее» на «Строки до 23 символов в Ruby обрабатываются в 1,92 раза быстрее»
Для всех, что было понятно о чем речь:
заголовок поста был сменен с «Строки до 23 символов в Ruby обрабатываются на 92% быстрее» на «Строки до 23 символов в Ruby обрабатываются в 1,92 раза быстрее»
0
Зарегистрируйтесь на Хабре, чтобы оставить комментарий
Строки до 23 символов в Ruby обрабатываются в 1,92 раза быстрее