Йоксель » Главный форум

Быстродействие при построении (обходе) больших таблиц

(9 posts)
  1. testotest
    Участник

    Для заполнения данными формируемого табличного документа часто используется такая (условная) схема:
    Значение = ТабДок.Область(x, y).Расшифровка() * k;
    Обл = ТабДок.Область(y1, x1);
    Обл.Расшифровка(Значение);
    Обл.Текст = Строка(Значение);

    Вопрос: Поскольку в таких операциях, как правило, адресуется единственная ячейка, то можно ли серьезно повысить быстродействие, если исключить из этой схемы работу с областью документа? Например реализовав в самом табличном документе пару методов прямого доступа к расшифровке и тексту конкретной ячейки:
    УстановитьЗначение(y, x, Значение, Представление)
    ПолучитьЗначение(y, x, Значение, Представление)

    Отправлено 17 года(лет) назад #
  2. Вопрос: Поскольку в таких операциях, как правило, адресуется единственная ячейка, то можно ли серьезно повысить быстродействие, если исключить из этой схемы работу с областью документа?

    Вряд ли. Здесь лучше зайти с другой стороны: ты можешь сделать какой-нибудь законченный тестовый пример, который бы показывал тормоза и примерно отражал твой способ работы с документом? Тогда можно было бы погонять его через профайлер и определить, что там тормозит.

    Отправлено 17 года(лет) назад #
  3. testotest
    Участник

    Пример

    Attachments

    1. пример.zip (11.4 KB, 121 downloads) 17 года(лет) old
    Отправлено 17 года(лет) назад #
  4. testotest
    Участник

    Из этого примера видно что штатный объект 1С "Таблица" выполняет аналогичные действия втрое медленнее, чем "ТабличныйДокумент". Поскольку работа идет с одним и тем же форматом, а сама операция простая (чтение/установка значения без какойлибо обработки) то предполагаю, что ощутимая часть разницы кроется в стоимости вызовов "FindMethod" и им подобных. Но хотя для йокселя она и так значительно ниже чем у штатной таблицы 1С, все же чтоб прочесть значение расшифровки нужно преодолеть 2 точки (если бы был прямой метод - тогда была бы одна), а если учесть что модификация расшифровки как правило требует изменение и текста ячейки, то прямой метод для таких операций смотрится очень выигрышно.

    Отправлено 17 года(лет) назад #
  5. Спасибо за пример - интересно. Насчет спецметодов - не уверен, что это даст выигрыш. В частности, все равно "внутри" будет создаваться объект "Область" (чтобы избежать дублирования кода - там не такие уж тривиальные действия производятся). Но посмотреть, конечно, можно :)

    Отправлено 17 года(лет) назад #
  6. testotest
    Участник

    В частности, все равно "внутри" будет создаваться объект "Область" (чтобы избежать дублирования кода - там не такие уж тривиальные действия производятся).

    Какие-бы там нетривиальные действия не производились, работа с областью "изнутри" все равно ошутимо быстрее, т.к. не производится масса подготовительной работы в виде вызовов методов класса CBLContext перед вызовом целевого действия.
    Например, разница между

    // Работа с объектом "Область" из встроенного языка 1С
    int iMethodNum= pCellContext->FindMethod("Расшифровка");
    int nParams = pCellContext->GetNParams(iMethodNum);
    ...
    pCellContext->GetParamDefValue(iMethodNum, iParamNum, pDefValue);
    ...
    if (pCellContext->HasRetVal(iMethodNum))
    ...
    else
    pCellContext->CallAsFunc(iMethodNum, rValue, ppValue);

    и

    // Работа с объектом "Область" "изнутри"
    pCells->SetRashifrovka(pValue, iMode, bAsHipelLink);

    будет весьма ощутима, особенно когда в таблице не 100 ячеек а десятки тысяч.

    Отправлено 17 года(лет) назад #
  7. testotest
    Участник

    В этой ситуации как раз пригодился бы API к йокселю, об актуальности которого был вопрос на этом форуме (ветку найти не могу - форум что-то глючит).
    Тогда не было бы необходимости оснащать объекты встроенного языка 1С "экзотическими" методами.

    Отправлено 17 года(лет) назад #
  8. В этой ситуации как раз пригодился бы API к йокселю

    API - это для создания ВК или просто дополнительных модулей на компилируемом языке. Или ты уже и до такого готов дойти? :)

    Отправлено 17 года(лет) назад #
  9. testotest
    Участник

    API - это для создания ВК или просто дополнительных модулей на компилируемом языке.

    Я так и знал! :)

    Или ты уже и до такого готов дойти? :)

    Обычно именно этим я и пользуюсь, когда быстродействие критично.

    Отправлено 17 года(лет) назад #

RSS экспорт этой темы

Отправить сообщение

Вы должны войти в систему, чтобы оставлять сообщения.