И вторая, написана на BCB 5.0 с использованием OLE-вызовов, примеров море в интернете, приводить не буду.
Так вот... ATL-вариант делает это за 1 минуту 15 секунд, а OLE за 47 секунд, хотя, даже Inprise утверждает, что ATL круче OLE в плане новизны и правильности. Может я что-то не так сделал?
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте Saddam, Вы писали:
S>Две программы. Обе заполняют в Excel 15 тысяч ячеек. Одна написана на MSVC 6.0 с использованием ATL.
... S>И вторая, написана на BCB 5.0 с использованием OLE-вызовов, примеров море в интернете, приводить не буду.
Нет уж, покажи цикл. Заодно и узнаем, что такое ole-вызовы.
S>Так вот... ATL-вариант делает это за 1 минуту 15 секунд, а OLE за 47 секунд, хотя, даже Inprise утверждает, что ATL круче OLE в плане новизны и правильности. Может я что-то не так сделал?
Скорее всего делается вызов разных наборов методов. Типа в одном случае диспатч, а в другом — нет. Или ранж по-разному вычисляется.
Здравствуйте George Seryakov, Вы писали:
S>>Две программы. Обе заполняют в Excel 15 тысяч ячеек. Одна написана на MSVC 6.0 с использованием ATL. GS>... S>>И вторая, написана на BCB 5.0 с использованием OLE-вызовов, примеров море в интернете, приводить не буду.
GS> Нет уж, покажи цикл. Заодно и узнаем, что такое ole-вызовы.
S>>Так вот... ATL-вариант делает это за 1 минуту 15 секунд, а OLE за 47 секунд, хотя, даже Inprise утверждает, что ATL круче OLE в плане новизны и правильности. Может я что-то не так сделал?
GS> Скорее всего делается вызов разных наборов методов. Типа в одном случае диспатч, а в другом — нет. Или ранж по-разному вычисляется.
Пожалуйста...
#define PS(param) PropertySet(param)
string XlsDocument::MakeAddr(int row,int col)
{
string cell;
char strrow[6];
int i,j;
col--;
if (col<0 || col>229 || row & 0xFFFF0000) //230 равно адресу IV (последний столбец)return"A1";
if (i=col/26) //получаем первую букву столбца
{
j=col%26; //вторая буква стобца
cell+=char('A'-1 + i);
cell+=char('A' + j);
}
else//буква столбца состоит из одного символа
cell+=char('A' + col);
itoa(row,strrow,10);
cell+=strrow;
return cell;
}
void XlsDocument::WriteCell(const string &cell,const string &value)
{
Doc.Exec(PS("Range") << cell.c_str() << value.c_str());
}
//---------------------------Главный циклchar tmp[32];
for (int j=1;j<16;j++)
for(int i=1;i<1001;i++)
{
itoa(j,tmp,10);
MyDoc.WriteCell(i,j,tmp);
}
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте IT, Вы писали:
IT>Здравствуйте George Seryakov, Вы писали:
IT>>>А где определена WriteCell(int,int,char*) ?
GS>>Строкой выше. Итого имеем:
IT>Строкой выше идёт WriteCell(const string &cell,const string &value);
void XlsDocument::WriteCell(const int i, const int j,const string &value)
{
Doc.Exec(PS("Range") << MakeAddr(i,j).c_str() << value.c_str());
}
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
GS>У моего ёкселя метода Exec нет. Соответвенно, не ясно, в какой набор COM-вызовов выливается BC-шный код.
Тут OLE. Это в ATL — COM-вызовы.
Variant::Exec
____________________________________________________________________________________
Executes an OLE procedure, function, or a property Get or Set method.
Variant __fastcall Exec(AutoCmd& cmd, Integer lcid = LOCALE_SYSTEM_DEFAULT);
Description
Use Exec to call Automation methods.
The cmd parameter is the wrapper class for the method on an interface that is assigned as the Variant’s value. Use this parameter to identify the method you want to call and to assign any parameter values.
The lcid parameter is ignored by Variant. The locale identifier used to interpret parameters is always LOCALE_SYSTEM_DEFAULT.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте Saddam, Вы писали:
S>Две программы. Обе заполняют в Excel 15 тысяч ячеек. Одна написана на MSVC 6.0 с использованием ATL. S>Та часть, которая заполняет:
Неужели OLE быстрее COM почти в полтора раза?
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
GS>>У моего ёкселя метода Exec нет. Соответвенно, не ясно, в какой набор COM-вызовов выливается BC-шный код.
S>Тут OLE. Это в ATL — COM-вызовы.
Это не OLE, а библиотека поддержки COM в билдере. Метод Exec таки сводится к набору COM-вызовов, как и любой код, работающий с екселем через интерфейсы автоматизации. Настоящий OLE тоже.
Здравствуйте George Seryakov, Вы писали:
S>>Тут OLE. Это в ATL — COM-вызовы.
GS>Это не OLE, а библиотека поддержки COM в билдере. Метод Exec таки сводится к набору COM-вызовов, как и любой код, работающий с екселем через интерфейсы автоматизации. Настоящий OLE тоже.
Это чем-то смахивает на DDE...
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте Saddam, Вы писали:
S>>Две программы. Обе заполняют в Excel 15 тысяч ячеек. Одна написана на MSVC 6.0 с использованием ATL. S>>Та часть, которая заполняет:
S>Неужели OLE быстрее COM почти в полтора раза?
Дело скорее всего в том что в Билдере происходит один вызов сервера, а VC++ по честному делает два:
Первый раз возвращается объект Range, второй раз ты ему устанавливаешь значение через SetValue. Так как в этом случае происходит межзадачный вызов, то замедление обязательно должно быть. Вообще оптимизация работы COM серверов во многом сводится в первую очередь к оптимизации вызовов. Например, хороших результатов можно добиться, если написать в Ворде макрос и вызвать его, взвалив на него тем самым основную часть работы.
Вызов Exec в Билдере происходит скорее всего через DDE и делается это один раз вместо двух как показано в примере выше. Отсюда и разница.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте IT, Вы писали:
IT>Вызов Exec в Билдере происходит скорее всего через DDE и
Может быть. А может — и IOleCommandTarget::Exec. Я б его тоже проверил, во всяком случае.
IT>делается это один раз вместо двух как показано в примере выше. Отсюда и разница.
Здравствуйте George Seryakov, Вы писали:
IT>>Вызов Exec в Билдере происходит скорее всего через DDE и
GS>Может быть. А может — и IOleCommandTarget::Exec. Я б его тоже проверил, во всяком случае.
О, точно, это он
IT>>делается это один раз вместо двух как показано в примере выше. Отсюда и разница.
Если нам не помогут, то мы тоже никого не пощадим.
Здравствуйте George Seryakov, Вы писали:
GS>Здравствуйте Saddam, Вы писали:
GS> GS>>>У моего ёкселя метода Exec нет. Соответвенно, не ясно, в какой набор COM-вызовов выливается BC-шный код.
S>>Тут OLE. Это в ATL — COM-вызовы.
GS>Это не OLE, а библиотека поддержки COM в билдере. Метод Exec таки сводится к набору COM-вызовов, как и любой код, работающий с екселем через интерфейсы автоматизации. Настоящий OLE тоже.
То есть по-твоему Хелп билдера врет?
Executes an OLE procedure, function, or a property Get or Set method.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте IT, Вы писали:
IT>Здравствуйте Saddam, Вы писали:
S>>>Две программы. Обе заполняют в Excel 15 тысяч ячеек. Одна написана на MSVC 6.0 с использованием ATL. S>>>Та часть, которая заполняет:
S>>Неужели OLE быстрее COM почти в полтора раза?
IT>Дело скорее всего в том что в Билдере происходит один вызов сервера, а VC++ по честному делает два:
IT>
IT>Первый раз возвращается объект Range, второй раз ты ему устанавливаешь значение через SetValue. Так как в этом случае происходит межзадачный вызов, то замедление обязательно должно быть. Вообще оптимизация работы COM серверов во многом сводится в первую очередь к оптимизации вызовов. Например, хороших результатов можно добиться, если написать в Ворде макрос и вызвать его, взвалив на него тем самым основную часть работы.
IT>Вызов Exec в Билдере происходит скорее всего через DDE и делается это один раз вместо двух как показано в примере выше. Отсюда и разница.
Я где-то читал, что при вызове методов OLE производится дополнительный вызов для определения типа передаваемого параметра. Ну, для того, чтобы OLEVariant передал то, что хочет сервер. Или это не так? В Interbase API все так и происходит с Variantom.
- Вы знаете — жаль, просто по-человечески жаль Памелу Андерсон, которая никогда не сможет сыграть на баяне...
Здравствуйте Saddam, Вы писали:
S>>>Тут OLE. Это в ATL — COM-вызовы.
GS>>Это не OLE, а библиотека поддержки COM в билдере. Метод Exec таки сводится к набору COM-вызовов, как и любой код, работающий с екселем через интерфейсы автоматизации. Настоящий OLE тоже. S>То есть по-твоему Хелп билдера врет?
S>
S>Executes an OLE procedure, function, or a property Get or Set method.
S>
Существуют два OLE: OLE1, основанный на DDE и OLE2, основанный на COM. Если твой хелп имеет в виду OLE1 (в чем я лично сомневаюсь, хотя и не исключаю), то внутри это работа с DDE. Иначе это OLE2 и реализована как набор вызовов COM.