Отражение: оптимизировать производительность - PullRequest
0 голосов
/ 25 октября 2010

Я хочу знать, смогу ли я оптимизировать отражающую часть моего приложения.

Справочная информация:

Приложение Windows vb.net проверяет, применяются ли записи базы данных к другим правилам. Итак, я создал интерфейс iRule и (пока) 54 класса правил, которые его реализуют. Все они принадлежат одному и тому же проекту (Rule.dll). Поскольку люди должны настроить их так, чтобы они были активны при определенных условиях, в базе данных также есть таблица tabRule, в которой перечислены все эти правила (с RuleKey / RuleName и т. Д.). Это кажется излишним, но я не видел альтернативы.

Чтобы прийти к точке:

Я создаю экземпляры каждого правила, которое активируется для текущей записи. Поскольку число записей составляет 50000, а число правил - 54, создание экземпляров отнимает много времени. У вас есть идея (общие / статические объекты?) О том, как оптимизировать следующую часть или предложения для различных подходов?

Dim asmRule As System.Reflection.Assembly = System.Reflection.Assembly.LoadFrom(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Rule.dll"))

... и позже примерно 2700000 раз ...

' Find the rule in the rules assembly'
Dim ruleObj As Rule.IRule = Nothing, found As Boolean = False
For Each typeAsm As System.Type In asmRule.GetTypes
    If typeAsm.GetInterface(GetType(Rule.IRule).FullName) IsNot Nothing Then
        ruleObj = CType(asmRule.CreateInstance(typeAsm.FullName, True), Rule.IRule)
        If ruleObj.GetKey = ruleRow.RuleKey Then 'ruleRow is the db-counterpart of the rule class'
            found = True
            Exit For
        End If
    End If
Next
'..... execute rule if found....'

Спасибо

Ответы [ 3 ]

3 голосов
/ 25 октября 2010

Не могли бы вы заранее создать экземпляры каждого правила, сохранить их в статическом словаре с ключом Rule.GetKey, затем, когда вам нужен новый, найти объект в словаре и клонировать его?

В начале вашего кода, который будет повторять 50000 строк, вы можете загрузить каждое правило и сохранить его в словаре. Теперь вам просто нужно перебрать строки, получить ключи правил и клонировать нужные правила для каждой строки. Поиск в словаре будет световыми годами быстрее, чем создание объекта с помощью отражения только для проверки его ключа.

Редактировать: Просто подумал о другом возможном решении. У вас есть доступ к Rule.dll, как вы собираете, создавая эту DLL. В этом случае вы можете добавить статический вспомогательный класс с одним статическим фабричным методом, который будет принимать rule.Key и возвращать соответствующий объект IRule. Тогда единственной необходимостью для отражения будет загрузка этого статического класса, тогда при итерации ваших строк вы можете просто передать ключ правила и вернуть соответствующий объект правила.

2 голосов
/ 25 октября 2010

Действительно небольшое улучшение, но вместо:

ruleObj = CType(asmRule.CreateInstance(typeAsm.FullName, True), Rule.IRule)

попробовать:

ruleObj = CType(Activator.CreateInstance(typeAsm, True), Rule.IRule)

У вас уже есть тип, поэтому нет необходимости искать его еще раз внутри сборки.

0 голосов
/ 17 ноября 2011

Попробуйте также реализовать это:)

System.Reflection является "тяжеловесным", я всегда сначала применяю более легкий метод ..

// C #

if (item is IEnumerable) {
    foreach (object o in item as IEnumerable) {
            //do function
    }
} else {
    foreach (System.Reflection.PropertyInfo p in obj.GetType().GetProperties())      {
        if (p.CanRead) {
            Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj,  null)); //possible function
        }
    }
}

'VB.Net

  If TypeOf item Is IEnumerable Then

    For Each o As Object In TryCast(item, IEnumerable)
               'Do Function
     Next
  Else
    For Each p As System.Reflection.PropertyInfo In obj.GetType().GetProperties()
         If p.CanRead Then
               Console.WriteLine("{0}: {1}", p.Name, p.GetValue(obj, Nothing))  'possible function
          End If
      Next
  End If
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...