Показать сообщение отдельно
Старый 16.02.2017, 17:46   #3  
Logger is offline
Logger
Участник
Лучший по профессии 2015
Лучший по профессии 2014
 
3,875 / 3123 (112) ++++++++++
Регистрация: 12.10.2004
Адрес: Москва
Записей в блоге: 2
Цитата:
Сообщение от kashperuk Посмотреть сообщение
Интересно, кто-то замерял производительность старых и новых методов?
Как раз искал ответ на этот вопрос.
Провел замеры сам.

Во вложении джобики, которыми замерял, примерно такого вида
X++:
static void testPackSpeed_02(Args _args)
{
    int64   tickFrom;
    int64   tickTo;
    int     i;
    // int     iMax = 10000;
    int     iMax = 20000;
    SalesTable  salesTable;
    container   con;
    ;
    select salesTable order by RecId;
    //tickFrom = WinAPI::getTickCount64();
    tickFrom = WinAPI::getTickCount();
    for (i = 1; i <= iMax; i++)
    {
        con = salesTable.buf2con(false); // дефолтное поведение в 2012-й
    }
    tickTo = WinAPI::getTickCount();
    info(strFmt("Способ упаковки salesTable.buf2con(false) время %1 млсек для %2 вызовов. На один вызов %3 млсек",
        tickTo - tickFrom,
        iMax,
        strLRTrim(num2str((tickTo - tickFrom)/iMax, 16, 6, 2, 0))
        ));

}
Что меряли
Сравнивали скорость упаковки такими способами
con = salesTable.buf2con(false);
con = salesTable.buf2con(true);
con = [salesTable];
Global::buf2ConOLD2009(salesTable)

и распаковки такими способами
salesTable.con2buf(con)
Global::con2Buf(con, salesTable);
salesTable = Global::con2Buf(con);
salesTable = conPeek(con, 1);
[salesTable] = con;
Global::con2BufOLD2009(con, salesTable);

где
Global::buf2ConOLD2009
Global::con2BufOLD2009

это методы
Global::buf2Con
Global::con2Buf
взятые из 2009-й
код методов такой:
X++:
static container buf2ConOLD2009(Common common)
{
    container c         = [common.TableId];
    DictTable dictTable = new DictTable(common.TableId);
    fieldId   fieldId   = dictTable.fieldNext(0);
    DictField dictField;
    ;

    while (fieldId)
    {
        dictField = new DictField(common.TableId,fieldId);

        if(dictField.baseType() == Types::Container)
            c += [common.(fieldId)];
        else
            c += common.(fieldId);

        fieldId = dictTable.fieldNext(fieldId);
    }

    return c;
}
X++:
static void con2BufOLD2009(container c,
                    Common    common)
{
    fieldId   fieldId;
    int       i;
    DictTable dictTable;

    if (common.TableId == conpeek(c,1))
    {
        dictTable = new DictTable(common.TableId);
        fieldId = dictTable.fieldNext(0);
        i = 2;
        while (fieldId)
        {
            //common.(fieldId) = conpeek(c,i);
            common.(fieldId)[1] = conpeek(c,i); // array fix
            i++;
            fieldId = dictTable.fieldNext(fieldId);

        }
    }
}
Вложения
Тип файла: zip SharedProject_TestPackBuffer_2017_02_16_17_56_DEV.zip (2.0 Кб, 82 просмотров)

Последний раз редактировалось Logger; 16.02.2017 в 17:57.