Немного теории.
Работа со стороками. Самый базовый элемент работы любой платформы. Конкатенация (соединение строк). Казалось бы - ну что может быть проще и однозначнее? Ан нет. Выражение T = "А"+"Б"; (если оно не вычислено на этапе компиляции/разбора) требует выделения памяти для "А", памяти для "Б", анализа длин "А" и "Б", выделение памяти для T,
(
Read more... )
"A"+"B" конечно все (ну не знаю про 1с) вычисляют на этапе компиляции, но положим будем смотреть на "A"+foo+"B". длину как и А так и В можно посчитать заранее, да и память на их уже отведена (они лежат в "месте для строчных литералов", умные люди еще все одинаковые вместе складывают, типа есть в ста местах написан литера "А" то все эти места будут ссылаться на одно место, очень удобно в смысле экономии кэшлайнов). соответственно чтобы создать Т надо только для него зааллоцировать память, посчитав длину foo и прибавив пару констант. константы эти, кстати, сложить можно на этапе компиляции тоже :). опять же "все нормальные люди"(тм) уже давно пользуются строчками с преаллоцированым буфером и длиной (что, например на 64битной архитектуре с помощью чьей-то матери и небольшого везения позволяет хранить строки длиной до 12 аскишных символов в самой структуре не меняя ее размера), и пользуются хитрыми алгоритмами для увеличения длины когда память кончилась (то есть ресайзят не на "минимум чего не хватает", а на "в полтора раза").
ну казалось делов-то, но зачем строчки в дотнете immutable я так никогда и не смог понять :)
Reply
2. Строки immutable, насколько я помню не только в доднед, но и в жабе, да и многих других средах. Подозреваю, что когда принималось решение, то выбор был между эффективностью изменябельных и простотой и надёжностью неизменябельных.
3. В описанную проблему в 1С на самом деле очень сложно уткнуться. Случаев, когда надо копировать/соединять строки многократно - раз-два и обчёлся. А учитывая, что даже просто передать управление на сервер приложения и вернуть обратно на клиент уже стоит почти 1 мс, то экономить на спичках просто нет смысла - в 99% случаев можно поднять производительность куда более очевидными способами (особенно, если учесть, что с кодом потом будет работать типичный программист 1С, 25% которых не в курсе что у таблиц в БД могут быть индексы).
Reply
Тема хорошая, заставляет подумать над простыми вещами.
Reply
Reply
Leave a comment