Есть out-of-proc сервер, все интерфейсы дуальные. Есть VB-скрипт клиент, он вызывает допустим 100000 раз typename(object). При этом сервер очень хорошо загружается, хотя ни один метод object не вызывается, а вызывается GetTypeInfo в реализации IDispatch.
Почему
Re: VB-script client и out-of-proc сервер - проблемы маршали
Здравствуйте, sap2, Вы писали:
S>Привет всем!
S>Есть out-of-proc сервер, все интерфейсы дуальные. Есть VB-скрипт клиент, он вызывает допустим 100000 раз typename(object). При этом сервер очень хорошо загружается, хотя ни один метод object не вызывается, а вызывается GetTypeInfo в реализации IDispatch. S>Почему
Так ведь GetTypeInfo в данноv случае это такой-же метод out-of-proc объекта как и прочие
Re[2]: VB-script client и out-of-proc сервер - проблемы марш
Здравствуйте, dimzon, Вы писали:
D>Здравствуйте, sap2, Вы писали:
S>>Привет всем!
S>>Есть out-of-proc сервер, все интерфейсы дуальные. Есть VB-скрипт клиент, он вызывает допустим 100000 раз typename(object). При этом сервер очень хорошо загружается, хотя ни один метод object не вызывается, а вызывается GetTypeInfo в реализации IDispatch. S>>Почему
D>Так ведь GetTypeInfo в данноv случае это такой-же метод out-of-proc объекта как и прочие
Замечательно, но тогда получается, что в случае вызова одного метода из скрипта вызываются несколько методов IDispatch, как же в этом случае работает typelib-маршалинг, производительность страдает.
Re[3]: VB-script client и out-of-proc сервер - проблемы марш
Здравствуйте, sap2, Вы писали:
S>Замечательно, но тогда получается, что в случае вызова одного метода из скрипта вызываются несколько методов IDispatch, как же в этом случае работает typelib-маршалинг, производительность страдает.
Какой еще typelib маршаллинг в VBS ?
Имею скафандр — готов путешествовать!
Re[4]: VB-script client и out-of-proc сервер - проблемы марш
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, sap2, Вы писали:
S>>Замечательно, но тогда получается, что в случае вызова одного метода из скрипта вызываются несколько методов IDispatch, как же в этом случае работает typelib-маршалинг, производительность страдает.
RB>Какой еще typelib маршаллинг в VBS ?
А какой там используется маршалинг? И как соптимизировать межпроцесные вызовы?
Re[5]: VB-script client и out-of-proc сервер - проблемы марш
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, sap2, Вы писали:
S>>А какой там используется маршалинг? И как соптимизировать межпроцесные вызовы?
RB>Никак. IDispatch и только. RB>Оптимизируй количество вызовов.
так я написал, что вызовов методов объекта object вообще нет, есть только typename( object ) в VB-скрипт, а на сервере дергается GetTypeInfo интерфейса IDispatch. А что будет если дернуть хотя бы один метод объекта object. Сколько методов дернется на сервере?
Re[7]: VB-script client и out-of-proc сервер - проблемы марш
Здравствуйте, sap2, Вы писали:
S>так я написал, что вызовов методов объекта object вообще нет, есть только typename( object ) в VB-скрипт, а на сервере дергается GetTypeInfo интерфейса IDispatch. А что будет если дернуть хотя бы один метод объекта object. Сколько методов дернется на сервере?
Я так понимаю, метод TypeName вызывает IDisatch::GetTypeInfo, и у полученного интерфейса вызывается
ITypeInfo::GetDocumentation(MEMBERID_NIL, ...);
При вызыве методов вызываются IDispatch::GetIDsOfNames и IDispatch::Invoke. Кеширования DISPID-ов не наблюдается, вроде бы...
Имею скафандр — готов путешествовать!
Re[8]: VB-script client и out-of-proc сервер - проблемы марш
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, sap2, Вы писали:
S>>так я написал, что вызовов методов объекта object вообще нет, есть только typename( object ) в VB-скрипт, а на сервере дергается GetTypeInfo интерфейса IDispatch. А что будет если дернуть хотя бы один метод объекта object. Сколько методов дернется на сервере?
RB>Я так понимаю, метод TypeName вызывает IDisatch::GetTypeInfo, и у полученного интерфейса вызывается RB>
RB>При вызыве методов вызываются IDispatch::GetIDsOfNames и IDispatch::Invoke. Кеширования DISPID-ов не наблюдается, вроде бы...
То есть получается когда клиент дергает один метод на сервере, то на сервере дергается 3 метода IDispatch::GetIDsOfNames, IDispatch::Invoke и object::method. Неужели это правильно и ничего нельзя сделать
Re[9]: VB-script client и out-of-proc сервер - проблемы марш
Здравствуйте, sap2, Вы писали:
S>То есть получается когда клиент дергает один метод на сервере, то на сервере дергается 3 метода IDispatch::GetIDsOfNames, IDispatch::Invoke и object::method. Неужели это правильно и ничего нельзя сделать
Что еще за object::method ??? Invoke — это и есть вызов метода.
Нет, в VBS только IDispatch. И упаковка параметров в variant-ы (и соответственно, распаковка на сервере).
Так устроен WSH — никакой типизации, вообще.
Оптимизируй вызовы к серверу, кешируй результаты и пр.
Имею скафандр — готов путешествовать!
Re[10]: VB-script client и out-of-proc сервер - проблемы мар
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, sap2, Вы писали:
S>>То есть получается когда клиент дергает один метод на сервере, то на сервере дергается 3 метода IDispatch::GetIDsOfNames, IDispatch::Invoke и object::method. Неужели это правильно и ничего нельзя сделать
RB>Что еще за object::method ??? Invoke — это и есть вызов метода.
RB>Нет, в VBS только IDispatch. И упаковка параметров в variant-ы (и соответственно, распаковка на сервере).
RB>Так устроен WSH — никакой типизации, вообще.
RB>Оптимизируй вызовы к серверу, кешируй результаты и пр.
Есть out-of-proc сервер, в нем есть object, который релизует дуальный интерфейс IObject : public IDispatch, у него есть метод method. Когда из VB-клиента вызывается object.method на сервере дергаются 3 метода IDispatch::GetIDsOfNames, IDispatch::Invoke и IObject::method. Это правильно? Один вызов клиента — 3 вызова сервера.
Re[11]: VB-script client и out-of-proc сервер - проблемы мар
Здравствуйте, sap2, Вы писали:
S>Есть out-of-proc сервер, в нем есть object, который релизует дуальный интерфейс IObject : public IDispatch, у него есть метод method. Когда из VB-клиента вызывается object.method на сервере дергаются 3 метода IDispatch::GetIDsOfNames, IDispatch::Invoke и IObject::method. Это правильно? Один вызов клиента — 3 вызова сервера.
Скорее всего IObject::method вызывается из IDispatch::Invoke.
Так что через межпроцесс идет все таки два вызыва, а не три.
Проверь, плз.
Имею скафандр — готов путешествовать!
Re[12]: VB-script client и out-of-proc сервер - проблемы мар
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, sap2, Вы писали:
S>>Есть out-of-proc сервер, в нем есть object, который релизует дуальный интерфейс IObject : public IDispatch, у него есть метод method. Когда из VB-клиента вызывается object.method на сервере дергаются 3 метода IDispatch::GetIDsOfNames, IDispatch::Invoke и IObject::method. Это правильно? Один вызов клиента — 3 вызова сервера.
RB>Скорее всего IObject::method вызывается из IDispatch::Invoke.
RB>Так что через межпроцесс идет все таки два вызыва, а не три.
RB>Проверь, плз.
Стек вызовов такой:
object::method()
OLEAUT32! 77124626()
OLEAUT32! 7713d52f()
ATL::CComTypeInfoHolder::Invoke() line 3276 + 49 bytes
ATL::IDispatchImpl<IObject,&IID_IObject,&LIBID_ObjectLib,1,0,ATL::CComTypeInfoHolder>::Invoke() line 4041
OLEAUT32! 7716603a()
00730065()
так что все-таки 3 вызова
Как0нибудь можно победить эту проблему с out-of-proc сервером и VB-клиентом?
Re[13]: VB-script client и out-of-proc сервер - проблемы мар
Здравствуйте, sap2, Вы писали:
S>Стек вызовов такой: S>
S>object::method()
S>OLEAUT32! 77124626()
S>OLEAUT32! 7713d52f()
S>ATL::CComTypeInfoHolder::Invoke() line 3276 + 49 bytes
S>ATL::IDispatchImpl<IObject,&IID_IObject,&LIBID_ObjectLib,1,0,ATL::CComTypeInfoHolder>::Invoke() line 4041
S>OLEAUT32! 7716603a()
S>00730065()
S>
S>так что все-таки 3 вызова
Так это же внутри твоего сервера идет. Через межпроцесс это не идет.
Так работает метод Invoke — клиент дергает Invoke, а Invoke уже вызывается твои методы.
В VBS — никак не победить. В VB можно пробовать раннее связывание.
Имею скафандр — готов путешествовать!
Re[14]: VB-script client и out-of-proc сервер - проблемы мар
Здравствуйте, rus blood, Вы писали:
RB>Здравствуйте, sap2, Вы писали:
S>>Стек вызовов такой: S>>
S>>object::method()
RB>S>OLEAUT32! 77124626()
S>>OLEAUT32! 7713d52f()
S>>ATL::CComTypeInfoHolder::Invoke() line 3276 + 49 bytes
S>>ATL::IDispatchImpl<IObject,&IID_IObject,&LIBID_ObjectLib,1,0,ATL::CComTypeInfoHolder>::Invoke() line 4041
S>>OLEAUT32! 7716603a()
S>>00730065()
S>>
S>>так что все-таки 3 вызова
RB>Так это же внутри твоего сервера идет. Через межпроцесс это не идет. RB>Так работает метод Invoke — клиент дергает Invoke, а Invoke уже вызывается твои методы.
RB>В VBS — никак не победить. В VB можно пробовать раннее связывание.
Значит все-таки 2 вызова на метод. И никак не улучшить. Жалко