![]() |
#11 |
Moderator
|
Цитата:
Сообщение от AndyD
Значительное увеличение времени в первом варианте присходит из-за реализации метода findRange(), используемого в insertValue(). Если заменить этот код на более простой (часть кода взята из второго варианта)
Код: COM doc; COM actSheet; COM range; ... doc = excel.getComDocument(); actSheet = doc.ActiveSheet(); ... while () { ... range = actSheet.range(ComExcelDocument_RU::numToNameCell( 1, row)); range.Value2(ledgerTrans.RecId); range = actSheet.range(ComExcelDocument_RU::numToNameCell( 2, row)); range.Value2(ledgerTrans.AccountNum); ... ![]() Итак, что мы имеем? Выяснено: 1. Первый способ - джоб SpeedTest_Job1, основанный на использовании методов ComExcelDocument_RU, медленнее, чем SpeedTest_Job2, основанный на COM, примерно в 3 раза. 2. Причиной трёхкратного замедления являются методы класса ComExcelDocument_RU: - InsertValue (записывает значение в ячейку), - numToNameCell (вычисляет текстовый адрес ячейки). То, что "загрузка хотя и будет происходить медленнее второго способа, но разница будет составлять уже проценты, не разы", просто говорит о том, что метод InsertValue (с findRange внутри), пардон, "гадит" на характеристики процесса гораздо больше, чем метод numToNameCell. На мой взгляд, использование этого комбинированного варианта Код: COM range; ......... range = actSheet.range(ComExcelDocument_RU::numToNameCell( 1, row)); range.Value2(ledgerTrans.RecId); Но использование Value2 в чистом виде - это уже не совсем класс ComExcelDocument_RU. Тогда зачем нам оставлять в алгоритме numToNameCell? Сказав "А", скажем и "Б": Код: COM cells; ......... COM::createFromVariant( cells.Item(row, 1) ).Value2( ledgerTrans.RecId ); ![]() |
|
Теги |
benchmark, download, excel, faq, xml, законченный пример, производительность, экспорт/импорт |
|
|