Автор Тема: Чем плохи изменяемые строки?  (Прочитано 13847 раз)

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #30 : Декабрь 18, 2012, 07:39:12 pm »
Цитировать
Несколько неожиданно, что после создания string-объекта символы, вхо­дящие в строку, нельзя изменять. Сначала это кажется серьезным ограниче­нием. Однако это не так. Над этим объектом можно выполнять все типы строковых операций. Для того чтобы изменить версию существующей стро­ки, нужно создать новый объект типа string, который содержит необхо­димую модификацию. Исходная строка остается неизменной. Этот подход используется, потому что фиксированные, неизменяемые строки можно реализовать более эффективно, чем изменяемые. Для тех случаев, когда же­лательна изменяемая строка, существует компаньон класса string с именем stringBuffer, чьи объекты содержат строки, которые могут изменяться по­сле их создания.
:o
http://www.ppgrefinish.ru/?page_id=16
В топике запахло жабой :-)
Y = λf.(λx.f (x x)) (λx.f (x x))

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #31 : Декабрь 18, 2012, 07:39:45 pm »
Цитировать
Чем плохи изменяемые строки?
Неправильная постановка вопроса.

Правильно: Чем плохи изменяемые объекты?

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #32 : Декабрь 18, 2012, 07:45:18 pm »
Правильно: Чем плохи изменяемые объекты?

Теперь в топике запахло хаскелем :-)

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Чем плохи изменяемые строки?
« Ответ #33 : Декабрь 19, 2012, 01:06:20 pm »
В x86 есть машинные инструкции для работы с последовательностями, в частности со строками. Чтобы компилятор их использовал на самодельной строке он должен быть слишком умным. Гораздо легче зашить строки в язык, чтобы компилятор о них знал изначально. Это одна из причин почему операции со строками зашивают в язык.

Заманчивая идея реализации строк на буфере фиксированного размера (256?) разрушается при столкновении с реальностью. Если буфер взять слишком маленьким, то некоторые строки в него не уберутся, а если большим, то будет слишком большой перерасход памяти когда придётся иметь десятки миллионов строк одновременно.

То есть, в общем случае, строки должны быть доступны по указателю (или по индексу в массиве). Но длину таких строк нельзя менять. Какой смысл разрешать модификацию букв таких строк если длину нельзя менять? Даже если разрешить менять буквы не меняя длины, то в многопоточной программе это будет тормознее чем создать новую строку ибо лочить придётся при изменении каждой буквы. Опять же вопрос лочить что? Одно дело лочить только лишь одну эту строку, другое дело лочить весь строковый менеджер памяти, который используется для её аллокации. Наивно думать, что быстрее лочить одну лишь строку, так как внутри менеджера памяти при удалении строки придётся лочить и его самого и строку (два лока вместо одного). Так что нафиг-нафиг эта мутабельность.

Когда я писал свою UnmanagedString то специально сделал её неизменяемой по этим соображениям (жёсткая экономия памяти, свой аллокатор памяти, быстрая потокобезопасность).

Губанов Сергей Юрьевич

  • Hero Member
  • *****
  • Сообщений: 590
    • Просмотр профиля
    • Домашняя страница
Re: Чем плохи изменяемые строки?
« Ответ #34 : Декабрь 19, 2012, 01:24:36 pm »
(два лока вместо одного)
Акцент на то, что второй лок надо делать не выходя из первого лока.

Просто два последовательных независимых лока не страшно.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #35 : Декабрь 19, 2012, 01:35:25 pm »
В x86 есть машинные инструкции для работы с последовательностями, в частности со строками. Чтобы компилятор их использовал на самодельной строке он должен быть слишком умным. Гораздо легче зашить строки в язык, чтобы компилятор о них знал изначально. Это одна из причин почему операции со строками зашивают в язык.
Какие именно?

То есть, в общем случае, строки должны быть доступны по указателю (или по индексу в массиве). Но длину таких строк нельзя менять. Какой смысл разрешать модификацию букв таких строк если длину нельзя менять? Даже если разрешить менять буквы не меняя длины, то в многопоточной программе это будет тормознее чем создать новую строку ибо лочить придётся при изменении каждой буквы. Опять же вопрос лочить что? Одно дело лочить только лишь одну эту строку, другое дело лочить весь строковый менеджер памяти, который используется для её аллокации. Наивно думать, что быстрее лочить одну лишь строку, так как внутри менеджера памяти при удалении строки придётся лочить и его самого и строку (два лока вместо одного). Так что нафиг-нафиг эта мутабельность.

Когда я писал свою UnmanagedString то специально сделал её неизменяемой по этим соображениям (жёсткая экономия памяти, свой аллокатор памяти, быстрая потокобезопасность).
Наивно думать, что все вышеперечисленное специфично для строк.
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #36 : Декабрь 19, 2012, 01:50:05 pm »
В x86 есть машинные инструкции для работы с последовательностями, в частности со строками.
Какие именно?
Очевидно, что имеются в виду цепочечные (String) команды: MOVS, INS и др.

valexey_u

  • Hero Member
  • *****
  • Сообщений: 3013
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #37 : Декабрь 19, 2012, 01:56:55 pm »
В x86 есть машинные инструкции для работы с последовательностями, в частности со строками.
Какие именно?
Очевидно, что имеются в виду цепочечные (String) команды: MOVS, INS и др.
Это вот это? http://www.club155.ru/x86cmd/MOVS
Не вижу с этой инструкции особого профита (ну разве что машкодов получается чуть меньше) - один фиг копирование идет побайтово/пословесно. Тем более что там не указано сколько тактов процессора эта инструкция занимает.

Смысла в этой инструкции нет вовсе относительно скажем векторизации (AltVec, Ion инструкции и так далее. Всякий разный SIMD).
Y = λf.(λx.f (x x)) (λx.f (x x))

igor

  • Sr. Member
  • ****
  • Сообщений: 438
    • Просмотр профиля
Re: Чем плохи изменяемые строки?
« Ответ #38 : Декабрь 19, 2012, 02:44:34 pm »
Это вот это? http://www.club155.ru/x86cmd/MOVS
Не вижу с этой инструкции особого профита (ну разве что машкодов получается чуть меньше) - один фиг копирование идет побайтово/пословесно. Тем более что там не указано сколько тактов процессора эта инструкция занимает.
Да, это оно. Не берусь защищать эти команды. Я вообще-то сторонник RISC.  :)

ilovb

  • Hero Member
  • *****
  • Сообщений: 2538
  • just another nazi test
    • Просмотр профиля
    • Oberon systems