Здравствуйте, Pavel Dvorkin, Вы писали:
PD>Я са могу создать иммутабл тип ? Есть такие средства в языке ?
Конечно. Будет ничуть не хуже, чем строка. См. DateTime.
PD>Ладно, оставим твои аппеляции к потокобезопасности в стороне. Не всегда она нужна, и уж тебе ли не знать, что большинство классов .Net не являются потокобезопасными, а значит, эту безопасность придется делать вне. Также и здесь можно было бы поступить. Но я даже и это обсуждать не хочу. Допустим, у меня вообще один всего поток — почему я должен платить за эту самую потокобезопасность, если она мне не нужна.
Потому что это не С++ здесь некоторые решения приняты за тебя. В частности, написать свою потокобезопасную строку намного сложнее, чем взять готовую.
PD>Слушай, не наводи тень на плетень. Хоть какие вргументы приводи — не докажешь, что не выполнять лишних действий лучше, чем их выполнять
Не хочешь — не буду. Это твое дело, насколько неэффективные программы ты будешь писать на управляемых языках.
PD>И потом — а скорость уборки GC всей этой кунсткамеры тоже пренебрежимо мала ?
Стоимость уборки строк равна нулю — у них нет финализатора.
PD>Да нет, в общем-то, угадал. В сущности этот самый m_StringValue и есть кусок из short, точнее, ссылка на него .
Не наводи тень на плетень. Ты спрашивал "где строки" — я показал тебе строки. Еще раз тебе объясняю: в управляемой среде в 99% случаев не надо ни "мешать" сборщику мусора, ни "помогать" ему. Понять, что ты попал в 1%, можно исключительно с помощью профайлера. Рассуждения типа "ой, тут что-то копируется, наверное без этого будет дешевле" не работают. Работает только профайлер.
Отдельные личности, к примеру, "для скорости" открывают коннекшн к базе данных в Application_Start и кладут в сессию веб-приложения. А потом удивляются, почему открытие/закрытие на каждый реквест работает так зверски лучше.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Pavel Dvorkin, Вы писали: PD>А оно таки всегда надо ? Строки, конечно, могут быть в кэше, кэш доступен из разных потоков, тут нужна потокобезопасность и другие случаи есть. Но если я в своей C/C++ функции завел локальную auto переменную (хоть std::string, хоть char[N]), то к ней все равно никто добраться не может, и почему я должен платить за эту потокобезопасность ? Ну а если уж она нужна, кто мешает обертку в виде thread_safe_string соорудить ?
Thread_safe_string крайне труден в написании. Более того, использование "обычной" строки вместо thread_safe — прямой путь к трудноуловимым граблям. А судя по количеству вопросов в наших форумах на тему "почему мне label.Text = "..." выкидывает исключение", рассчитывать на лёгкость применения здесь не стоит.
В дотнете баланс смещен с лозунга "не плати за то, чего не используешь" на лозунг "TANSTAAFL". Зато ленчи — гарантированные .
Это как Скандинавия — высокие налоги, зато офигенный уровень жизни и массовые гарантии. Не нравится — езжай в Сомали, там смелым мачо не мешает тотальный государственный контроль.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>char szString[N]; PD>gets(szString); PD>strupr(szString);
PD>и ни одного лишнего байта. Можно такое сделать ?
Что сделать?
Проезд по памяти?
Конечно нет.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, CreatorCray, Вы писали: S>>Thread_safe_string крайне труден в написании. CC>Да ну??? Неужто написать COW строку на refcounterах так сложно?
И она будет прямо таки вся thread safe?
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Здравствуйте, WolfHound, Вы писали:
ГВ>>"Парадокс блаба" апеллирует к зашоренности сознания и потому превосходно работает и в обратную сторону: если ты не научился усматривать необходимые конструктивные возможности в языке X, то ты их не усмотришь нигде, и хуже того — никогда не будешь уметь в полной мере использовать тот язык, которым располагаешь. В конце концов, какая разница, где именно находится тот пресловутый пунктик, которым ограничена мыслительная деятельность? WH>Если ты намекаешь на то что я не знаю С++ то ты мягко говоря не на того напал.
Нет. Всё, на что я "намекаю" написано открытым текстом.
WH>Можешь заглянуть в топ форума по С++... и это при том что я там уже не первый год почти не появляюсь.
Я знаю, что ты знаешь C++. Перечитай внимательно написанное.
ГВ>>Вот-вот. Возвращаемся к тому, с чего начали: к внутренней структуре строки. WH>И как грамотная реализация строки относится к тому что строк должно быть много?
Так грамотная — это rope или линейный буфер?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
ГВ>Так грамотная — это rope или линейный буфер?
Все же для разных задач разные алгоритмы. В С# досих пор стандартных Б+ деревьев нет.
Все что требует частого удаления всавок по аналогии с б деревьями должны иметь такую структуру.
Либо буилдер стрингбуилдеров с ограничением на длину стрингбуилдера.
Но нелинейность оправдывает себя на больших размеров, и соответсвенно частые вставки и удаления.
Все под задачу. Поэтому 3 вида строк вполне оправдано.
и солнце б утром не вставало, когда бы не было меня
Здравствуйте, WFrag, Вы писали:
WF>И что, даже на коротких строках (очень частый случай) «верёвки» будут эффективнее String/StringBuilder?
Они им не уступят.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, WFrag, Вы писали: WF>И что, даже на коротких строках (очень частый случай) «верёвки» будут эффективнее String/StringBuilder?
Нет, будут также эффективны.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
WF>Забавно. А с какой целью String/StringBuilder сделаны именно так, а не на базе char[] (который мог бы так же передаваться в String без копирования в StringBuilder.ToString())?
Не мог бы. Так как при внесении изменений в билдере(например, замене некоторых символов) эти изменения отразились бы и на строке, которая ранее была получена из этого билдера. А это
Новости очень смешные. Зря вы не смотрите. Как будто за наркоманами подсматриваешь. Только тетка с погодой в завязке.
There is no such thing as a winnable war.
Здравствуйте, CreatorCray, Вы писали:
CC>Да ну??? Неужто написать COW строку на refcounterах так сложно?
Чтобы она еще и работала быстро на многопроцессорной тачке очень сложно.
Ибо даже InterlockedIncrement/InterlockedDecrement весьма не бесплатны на многопроцессорных машинах.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Eugeny__, Вы писали:
E__>Не мог бы. Так как при внесении изменений в билдере(например, замене некоторых символов) эти изменения отразились бы и на строке, которая ранее была получена из этого билдера. А это
С изменяемым string ситуация ровно такая же. Ничто не мешает применить тот же финт ушами, что сделан в StringBuilder.ToString.
Здравствуйте, Pavel Dvorkin, Вы писали:
PD>А оно таки всегда надо ? Строки, конечно, могут быть в кэше, кэш доступен из разных потоков, тут нужна потокобезопасность и другие случаи есть. Но если я в своей C/C++ функции завел локальную auto переменную (хоть std::string, хоть char[N]), то к ней все равно никто добраться не может, и почему я должен платить за эту потокобезопасность ? Ну а если уж она нужна, кто мешает обертку в виде thread_safe_string соорудить ?
Ну в случае когда GC нет, ты всё более или мене верно говоришь, но в шарпее есть GC а COW фиг реализуешь, наоборот...
Так что фишка в том, получается, что в до-диезе хоршо одно работает, а в плюсах другое...
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, WolfHound, Вы писали:
WF>>И что, даже на коротких строках (очень частый случай) «верёвки» будут эффективнее String/StringBuilder? WH>Они им не уступят.
Да, действительно, не сообразил.
А как быть с заменой символа (например, 1000-ый, в строке, созданной конкатенацией пачки других строк)? В этом случае хочется по возможности не создавать лишние объекты, а значит изменяемый кусок не должен разделяться другими строками.
Здравствуйте, Serginio1, Вы писали:
ГВ>>Так грамотная — это rope или линейный буфер? S> Все же для разных задач разные алгоритмы. В С# досих пор стандартных Б+ деревьев нет.
Угу, угу.
S>Все что требует частого удаления всавок по аналогии с б деревьями должны иметь такую структуру. S>Либо буилдер стрингбуилдеров с ограничением на длину стрингбуилдера. S> Но нелинейность оправдывает себя на больших размеров, и соответсвенно частые вставки и удаления. S>Все под задачу. Поэтому 3 вида строк вполне оправдано.
О! Итак, ты уже нашёл оправдания для трёх видов строк. Кто больше?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, WolfHound, Вы писали:
ГВ>>Так грамотная — это rope или линейный буфер? WH>rope. Другие не нужны.
Даже с учётом immutability? Обход узлов — это уже бесплатно?
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, WFrag, Вы писали:
WF>А как быть с заменой символа (например, 1000-ый, в строке, созданной конкатенацией пачки других строк)? В этом случае хочется по возможности не создавать лишние объекты, а значит изменяемый кусок не должен разделяться другими строками.
А давай ты реалистичную задачу придумаешь где это может понадобиться.
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Даже с учётом immutability?
Это к чему?
Ропы сами неизменяемые.
ГВ>Обход узлов — это уже бесплатно?
А зачем нам их обходить?
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, Sinclair, Вы писали:
WF>>И что, даже на коротких строках (очень частый случай) «верёвки» будут эффективнее String/StringBuilder? S>Нет, будут также эффективны.