Цитата:
Сообщение от
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);
}
}
}