Решил снова пописать про 1С результаты некоторых набросков, которые делаю дома

Feb 05, 2010 01:05

Немного теории.
Работа со стороками. Самый базовый элемент работы любой платформы. Конкатенация (соединение строк). Казалось бы - ну что может быть проще и однозначнее? Ан нет. Выражение T = "А"+"Б"; (если оно не вычислено на этапе компиляции/разбора) требует выделения памяти для "А", памяти для "Б", анализа длин "А" и "Б", выделение памяти для T, ( Read more... )

Leave a comment

dennyrolling February 4 2010, 20:13:07 UTC
децл по сути дела. в дотнете строчки медленно складывать только потому что кто-то решил что строчки обязательно должны быть immutable, и с этого они поимели много головняков, включая придумывание стринг билдера и заставление людей им пользоваться. люди пользоваться не хотят, про стрингбилдер не знают и в итоге залетают на перф как фанеры над парижем.

"A"+"B" конечно все (ну не знаю про 1с) вычисляют на этапе компиляции, но положим будем смотреть на "A"+foo+"B". длину как и А так и В можно посчитать заранее, да и память на их уже отведена (они лежат в "месте для строчных литералов", умные люди еще все одинаковые вместе складывают, типа есть в ста местах написан литера "А" то все эти места будут ссылаться на одно место, очень удобно в смысле экономии кэшлайнов). соответственно чтобы создать Т надо только для него зааллоцировать память, посчитав длину foo и прибавив пару констант. константы эти, кстати, сложить можно на этапе компиляции тоже :). опять же "все нормальные люди"(тм) уже давно пользуются строчками с преаллоцированым буфером и длиной (что, например на 64битной архитектуре с помощью чьей-то матери и небольшого везения позволяет хранить строки длиной до 12 аскишных символов в самой структуре не меняя ее размера), и пользуются хитрыми алгоритмами для увеличения длины когда память кончилась (то есть ресайзят не на "минимум чего не хватает", а на "в полтора раза").

ну казалось делов-то, но зачем строчки в дотнете immutable я так никогда и не смог понять :)

Reply

speshuric February 5 2010, 14:33:59 UTC
1. В 1С полной компиляции нет, только достаточно примитивный разбор на лексемы. Я удивлюсь, если 1С "А"+"Б" будет считать на этапе этого разбора. Проверить можно, но лень. Я вообще как бы в курсе, что всё нормальное "А"+"Б" посчитает заранее, да и про то что память можно выделять заранее - тоже понятно. И, кстати, мне в целом было бы не западло это сделать, если бы задача была критична к этому. :) Только маааленькая бяда. Чтобы запустить этот код из 1С накладные расходы примерно как мне сходить к тебе домой в сортир. Даже если твой сортир в 1000 раз эффективнее моего :))) (Это, конечно, если исходить из реальности, что я нахожусь в Нске)
2. Строки immutable, насколько я помню не только в доднед, но и в жабе, да и многих других средах. Подозреваю, что когда принималось решение, то выбор был между эффективностью изменябельных и простотой и надёжностью неизменябельных.
3. В описанную проблему в 1С на самом деле очень сложно уткнуться. Случаев, когда надо копировать/соединять строки многократно - раз-два и обчёлся. А учитывая, что даже просто передать управление на сервер приложения и вернуть обратно на клиент уже стоит почти 1 мс, то экономить на спичках просто нет смысла - в 99% случаев можно поднять производительность куда более очевидными способами (особенно, если учесть, что с кодом потом будет работать типичный программист 1С, 25% которых не в курсе что у таблиц в БД могут быть индексы).

Reply

оптимист redokov February 6 2010, 23:22:51 UTC
25% очень хорошая оценка.
Тема хорошая, заставляет подумать над простыми вещами.

Reply

Re: оптимист speshuric February 7 2010, 05:06:25 UTC
нене. Я не оптимист. Лет 5 назад этот показатель стабильно зашкаливал за 50%. Сейчас как я вижу - это уже ближе к 25% (ну или сильнее фильтры на собеседованиях :) )

Reply


Leave a comment

Up