создаст символ, но прежде оно создаст стринг, потратит на это время и память, можно ли этого избежать (особенно учитывая, что символы существуют как раз ради экономии времени и памяти)?
Попытка адептов недоЯП оптимизировать настолько милы. Они как дети, которая не понимают, что каждая байдень в их ЯП даёт десятикратный оверхед, но доблесные оптимизаторы не сдаются. Они из 100кратного оверхеда сделают 99кратный и будут рады.
Символы существуют не ради экономии времени и памяти (кто вообще будет использовать руби там, где время и память ограничена?), а потому, что семантика у них отличается от строк.
Согласен с ораторами:
в руби «Symbol» нисколько не выгоднее «String».
Возможно, ты путаешь с Дельфи, где символьные переменные преобразуются компилятором в целые числа.
В руби и то и другое хранит целые строки.
Если хочешь скорости, то вместо хэша с символом:
person = {}
person['FirstName'] = 'Иван'
person['LastName'] = 'Сидоров'
В этом случае индексы действительно представляют из себя целые числа Fixnum и занимают 4 байта.
Выемка данных происходит мгновенно. Я всё время так делаю в «узких» местах.
Я помню об этом каждую секунду) Это не применимо к потоку данных, но применимо к ограниченному количеству данных. Проблема в том, что память под любые другие объекты так же выделяется! при этом, (если мы говорим про строки), она выделяется каждый раз, а затем, этот каждый раз будет удаляться из памяти, и на это будет уходить дополнительное время. В моем случае этих символов будет мало, примерно 500-1к. А вот аналогичных по строению хэшей будет много.. 500-1к.
Я бы может и некоторые другие объекты пометил бы как неудаляемые, если бы была такая возможность, чтобы интерпретатор не тратил время на их проверку. Хотя.. это слишком геморройно уже.. лучше сосредоточится на задаче.
Попытка адептов недоЯП оптимизировать настолько милы. Они как дети, которая не понимают, что каждая байдень в их ЯП даёт десятикратный оверхед, но доблесные оптимизаторы не сдаются. Они из 100кратного оверхеда сделают 99кратный и будут рады.
О Великий Гуру, Учитель ПравильныхЯП, ты окрыл мне глаза! Я брошу всё и куплю себе учебник ассемблера, уйду в горный монастырь и через 10 лет напишу эффективный код, который я был написал на руби за неделю с оверхедом, на который всем насрать.
Ну быстрее ни в каком смысле ты не напишешь, а зачем ты начинаешь про скорость чего-то там гвоорить?
Ты намекаешь на то, что я типа проповедую асмзатвор и запилил чего-то за 10лет, а ты типа такой шустрый, дерзкий, быстрый.
А теперь скажи в чем смысл твоего твоего ололо, когда я возьму и напишу твоё «рубизанеделю» за неделю и не получу 10кратных оверхедов? В чём, так сказать, профит?
Скорее меня не изнасиловал пхппешник/жабист/рубист и ООПшник головного мозга с мистической верой в то, что на сишке писать медленнее, а на оверхед можно класть.
Возможно я что-то не понимаю в этом мире, а так да, возможно.
А ещё вера в то, что писать на ассемблере долго, когда там есть такие фичи, о которох возможно только какие-нибудь вменяемые диалекты лиспам лишь могут.
Дак я не против, но ты смотри на его аргументы - он говорит, что выбрал руби не потому, что оно ему нравится, а ибо быстрее, хотя он наврал. Зачем он врёт?
Если бы он написал что-то, аля «а мне нравится» - я бы ему слово не сказал, но он начал вещать из свох догматов, которые я не люблю.
ну вообще-то, это так. чтобы писать на си быстро, как ты (по твоим словам), нужно заниматься им столько, сколько ты. У него выше порог вхождения (хотя после порога и знания качественнее), он содержит ненужные для многих случаев вещи (не могу придумать, зачем, например, в рельсах бы указатели пригодились) и т. д. Каждому свое. Если я пишу на руби быстрее, чем на си, то это не значит, что тебе надо говорить мне, что ты пишешь на си быстрее меня.
Обидели школьника, не дали померятся пиписьками? Я не знаю твой настоящий возраст, но стремление всем вокруг доказать что-то и соревноваться точно соответствует 9-10 классу. *ушёл из треда.
Это ведь просто сахар для to_sym. Стадию строки оно не минует.
Нет, создания символа происходит один раз, создание строки каждый раз.
Это не отменяет того, что создание символа будет более затратным, чем создание строки:
require 'benchmark'
require 'ffaker'
n = 2000000
Benchmark.bmbm do |x|
x.report('string') do
n.times { "#{Faker::Name.name}_#{rand(2)}" }
end
x.report('symbol') do
n.times { "#{Faker::Name.name}_#{rand(2)}".to_sym }
end
x.report('sugar_symbol') do
n.times { :"#{Faker::Name.name}_#{rand(2)}" }
end
end
Rehearsal ------------------------------------------------
string 9.910000 0.010000 9.920000 ( 9.938621)
symbol 16.540000 0.190000 16.730000 ( 16.785586)
sugar_symbol 18.270000 0.170000 18.440000 ( 18.458267)
-------------------------------------- total: 45.090000sec
user system total real
string 8.950000 0.080000 9.030000 ( 9.029096)
symbol 16.350000 0.070000 16.420000 ( 16.489534)
sugar_symbol 18.470000 0.060000 18.530000 ( 18.571173)
Как видите, символьный хэш одинаков по скорости с массивом.
У меня — нет:
user system total real
array : 0.130000 0.000000 0.130000 ( 0.127917)
hash : 0.220000 0.000000 0.220000 ( 0.222584)
sym hash: 0.160000 0.000000 0.160000 ( 0.157841)
да, только для intern :\ Пичаль, я надеялся, что оно обходит создание объекта строки..
создание символа будет более затратным
Изначально, суть в том, чтобы избегать создания новых символов, и иметь ограниченное число их. Т.е символы могут создаваться сколь угодно долго, если они будут создаваться только раз, а вызов значения символа уже будет быстрее чем создание нового объекта, но в настоящий момент это невозможно, т.к. созданию динамического символа предшествует создание строки.
Т.о. делать ключи на основе динамически создаваемых символов, сейчас, не имеет смысла.
символьный хэш одинаков по скорости с массивом
У меня — нет
Да практически, к тому же, у меня речь шла про имитацию с помощью ключей двумерного (и более, но мне сейчас нужен двумерный).
Вообще, руби хорош тем, что, например, скорости работы массива и хэша практически одинаковы, в отличии он того же js (особенно v8). Другое дело, что я хотел избавиться от постоянной генерации объектов ключей, при реализации эффекта многомерности через ключ.