Показать сообщение отдельно
Старый 22.02.2007, 12:58   #16  
kashperuk is offline
kashperuk
Участник
Аватар для kashperuk
MCBMSS
Соотечественники
Сотрудники Microsoft Dynamics
Лучший по профессии 2017
Лучший по профессии 2015
Лучший по профессии 2014
Лучший по профессии 2011
Лучший по профессии 2009
 
4,361 / 2084 (78) +++++++++
Регистрация: 30.05.2004
Адрес: Atlanta, GA, USA
Еще информация для размышлений:

Вот job для экспериментов
X++:
static void tutorial_Job_getMemAlloc(Args _args)
{
    HeapCheck heapHeck = new HeapCheck();
    int allocFirst;
    Set set1;
    Set set2;
    Set set3;
    int i;
    timeOfDay time1;
    TmpInventTable tmpIT;
    Counter recIdCount;
    ;
    recIdCount = 40000;
    allocFirst = heapHeck.bytesAllocated();
    info(strfmt("%1 - До заполнения", allocFirst));

    time1 = timeNow();
    set1 = new Set(Types::Integer);
    for (i = 1; i <= recIdCount; i++)
        set1.add(i);
    allocFirst = heapHeck.bytesAllocated();
    info(strfmt("%1 - %2сек - заполнили Set(Types::Integer)", allocFirst, timeNow() - time1));

    time1 = timeNow();
    set1 = new Set(Types::String);
    for (i = 1; i <= recIdCount; i++)
        set1.add(strFmt("Item%1", i));
    allocFirst = heapHeck.bytesAllocated();
    info(strfmt("%1 - %2сек - заполнили Set(Types::String)", allocFirst, timeNow() - time1));

    time1 = timeNow();
    for (i = 1; i <= recIdCount; i++)
    {
        tmpIT.ItemId = strFmt("Item%1", i);
        tmpIT.insert();
    }
    allocFirst = heapHeck.bytesAllocated();
    info(strfmt("%1 - %2сек - заполнили временную таблицу из одного поля - ItemId", allocFirst, timeNow() - time1));
}
Вот мои результаты: (40000 элементов)
28 939 792 - До заполнения
30 413 632 - 1сек - заполнили Set(Types::Integer)
30 401 280 - 1сек - заполнили Set(Types::String)
32 763 840 - 13сек - заполнили временную таблицу из одного поля - ItemId

Обращу внимание на время, требуемое для заполнения временной таблицы таким большим кол-вом записей. SET заполняется почти мгновенно. (правда у других проверяющих время заполнения меньше для таблицы - видимо это связано с тем, что винт у меня на ноутбуке не очень быстрый)

Оговорка:
Результаты по выделению памяти приблизительные, так как
Цитата:
Сообщение от AndyD
Память выделяется кусками. Т.е. если объект в памяти занимает меньше места, чем свободно - то выделение не происходит, а размещается в свободном куске
Для небольшого числа записей разница настолько мала, что измерить не удалось

Анализ результатов (краткий):
первые два заполнения - 2 Мб выделилось приблизительно, (на двоих)
на табличку - еще столько же где-то.

Учитывая это и время заполнения, использование временной таблицы ставится под вопрос.
+ большой конечно, что можно ее потом использовать в запросах. Правда и в этом нужно быть осторожным, так как нужно учитывать, где формировалась эта таблица (первая запись).

У кого какие соображения?
За это сообщение автора поблагодарили: EVGL (3).