2013-04-17 4 views
0

После регистрации (RegAsm) мой класс видимости C# COM, я вижу, что CoCreateInstance(__uuidof(myclass)) занимает много времени только в первый раз, последующие попытки в том же процессе клиента решаются мгновенно. Любая идея, почему это занимает время? NGen - это не вариант для меня.CoCreateInstance занимает много времени

Мой COM сервер находится в C# и клиент в MFC/ATL

CComPtr<namespace::Imyclass> obj; 
hrx = obj.CoCreateInstance(__uuidof(namespace::myclass)); 
+0

Какой язык/окружающая среда ваш COM-клиент, написанный на? –

+0

Что значит «второй раз»? Во второй раз, когда вы вызываете CoCreateInstance в том же процессе клиента? Или во второй раз, когда вы запускаете клиентское приложение, он идет намного быстрее? – selbie

+0

@selbie отправить время в том же процессе клиента, если я перезапущу свой клиент, он снова имеет значительную задержку –

ответ

0

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

Второй вызов очень сильно выгоден из этих предыдущих шагов. Если первый вызов был успешным, тогда код уже загружен и инициализирован, и все, что ему нужно сделать, это повторить завод заново.

1

Первый звонок CoCreateInstance должен загружаться в процесс и инициализировать среду выполнения .NET. Затем ваша DLL должна быть загружена, «проверена» и скомпилирована в машинный код (хотя точно и вовремя помогает ускорить запуск). Время выполнения .NET также должно анализировать метаданные вашей сборки, а затем динамически генерировать и компилировать «COM-вызываемые обертки» (http://msdn.microsoft.com/en-us/library/f07c8z1c.aspx), которые являются прокси-серверами, которые соединяются между неуправляемым миром COM и управляемой средой .NET. Любые дополнительные библиотеки, которые могут использовать ваш код, также должны быть загружены, проверены и, возможно, скомпилированы в машинный код (если не NGEN'd).

Это по своей сути дорогостоящий процесс. Задержки, о которых вы говорите, не являются неслыханными.

Я не верю, что вы можете многое сделать, чтобы ускорить процесс. Я предлагаю вам подумать о том, можете ли вы принять удар в начале своей жизни, создав объект вскоре после запуска. Это не ускорится, но может значительно улучшить работу пользователя. если ваша программа просто не может терпеть задержки, то вы не должны использовать .NET для записи COM-объекта (более конкретно, вы не должны использовать .NET в своем процессе вообще. Это не проблема с использованием COM, это проблема с загрузкой .NET.)

Кстати, это одна из причин, почему написание расширений оболочки в .NET ... «сильно обескуражено». См. Недавнее сообщение на эту тему, в котором также рассказывается о производительности запуска .NET: http://blogs.msdn.com/b/oldnewthing/archive/2013/02/22/10396079.aspx

(Вот почему я спросил раньше, какого клиента вы запускали. Клиент, который уже запускает управляемый код .NET, зависит от время выполнения .NET и не повлияет на эти задержки)

+0

И все же ... Хотя я видел 45 задержек, я должен признать, что 45 секунд немного жесткие, если только машина не слишком сильная или перегруженная. Вы не указываете, о какой машине и нагрузке мы говорим. Кроме того, вы измеряете эту задержку во время отладки? Это может существенно повлиять на время запуска. –

0

Если эта задержка предназначена только для первой загрузки (после запуска компьютера), то это вызвано загрузкой всех библиотек. Первая задержка после запуска (или после длительного использования без использования .NET) всегда будет медленным. (См. Ответ Микелли)

Задержка может быть также вызвана при каждой загрузке. Сегодня я узнал, что подключение к Интернету также может вызвать задержку.

Измеренные значения:

  1. Нет Ethernet и нет задержки подключения Wi-Fi: 94 мс (Win7)/1.5 (WinXP)
  2. Windows XP: подключение к Интернету (с прокси и не стандартного шлюза, а не все порты разрешены): 4-5 сек (WinXP)
  3. Подключен к сети Ethernet не не Интернет: 10 лет (Win7)
  4. Short после подключения к Ethernet (Windows соединения теста Интернет, синий круг на значке сети): 30 s (Win7)
  5. подключения к Интернету (с прокси и не стандартный шлюзом; только несколько портов разрешено): 30 с (Win7)

* нестандартный шлюз: разрешенные TCP-порты и соединения различны для каждого компьютера (разные для WinXP и Win7).

Протестировано на Windows 7 (x64) и WinXP. Я тестировал его, потому что он пришел как жалоба от клиента и обнаружил задержку до CoCreateInstance Загруженная библиотека находится в C# и подписана (подписанная сборка со snk и со стандартным сертификатом для подписания исполняемых файлов).

Смотрите также: http://social.msdn.microsoft.com/Forums/sqlserver/en-US/cda45e39-ed11-4a17-a922-e47aa2e7b325/ce-40-delay-when-cocreateinstance-on-pc-without-internet?forum=sqlce

Смежные вопросы