2010-10-13 2 views
3

Я вложил проект LuaInterface в приложение, написанное на C#, используя .NET Framework 4.0. После компиляции LuaInterface и Lua 5.1 я ссылался на них в своем приложении и создал Lua VM и выставил несколько классов .NET. Когда Lua VM не делает много вызовов, производительность вообще не изменяется; но когда он начинает вызывать большее число функций .NET, все приложение становится медленным и не отвечает.Вложение LuaInterface в приложение C# имеет медленную производительность?

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

Как решить эту проблему? У меня создалось впечатление, что дать Lua свою собственную нить, другую нить не следует влиять! Это в какой-то мере связано с моим собственным кодом? Есть ли у LuaInterface некоторые серьезные проблемы, связанные с функциями .NET (по производительности)? Что еще я мог использовать?

+0

Может у нас есть некоторые примеры кода Windows Forms? –

+0

Есть несколько 'if'. Загрузка системного процессора, сколько ядер у вас есть (только один?), Является ожиданием программы по результатам кода Lua, является кодом Lua, взаимодействующим с очередью сообщений основного приложения и т. Д. Сам вызов InterOp должен не блокировать другие потоки, кстати. (Тем не менее, для вызовов InterOp требуется, чтобы некоторые объекты GC были «исправлены» (не должны изменять местоположение памяти), поэтому в зависимости от типа использования его производительность GC может ухудшиться ... но _usually_ не в таких больших количествах – gimpf

ответ

0

Я не пытался скомпилировать LuaInterface против .NET 4. До сих пор я использовал только предварительно скомпилированные DLL. Я знаю, что вы можете ускорить сборку смешанных образов в .NET 4, установив нулевое значение. Согласно MS: .NET Framework 4, упрощенная архитектура маршаллинга interop обеспечивает значительное улучшение производительности для переходов из управляемого кода в неуправляемый код.

http://msdn.microsoft.com/en-us/library/ff361650.aspx

Держите нас в курсе в случае, если вы нашли трюк, который работает для вас. В Visual Studio 2010 вы действительно можете создать против .NET 2, поэтому, если бы я был вами, я бы попытался создать фиктивное приложение и скомпилировать его против нескольких целей. Это может помочь вам определить степень деградации скорости при использовании .NET 4.

Если вы дадите нам какой-нибудь код, возможно, я смогу немного поиграть с ним и выяснить, что не так. Я действительно интересуюсь LuaInterface и стараюсь выяснить, что не так.

Поскольку у меня нет образца кода, я просто размышляю над этим; но возможно, что проблема связана с тем, что ваш интерфейс не является потокобезопасным. Обычно проблемы блокировки, например, с помощью Windows Forms Controls.

Как: Сделать поточно-вызовы к элементам управления http://msdn.microsoft.com/en-us/library/ms171728(v=vs.80).aspx

+0

«Я знаю, что вы можете ускорить сборку смешанных образов в .NET 4, установив ____ в ноль» - Что? Не оставляйте меня висящим! :-) – Cameron

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