C#Pre-invkoing代表以提高性能

时间:2018-01-10 10:57:58

标签: c# performance lambda delegates invoke

我正在c#中进行一些动态的deleagate调用。

由于我的删除主要是实例化对象,我想比较它们的性能。

由于我无法发布我的完整代码(项目太大),这就是我的大多数集合/变量所包含的内容:

  • objCreatorrs - Dictionary<ushort, Func<int, Result>> - 通过id持有lambdas。 lambdas看起来像id => new SomeObjectType() {Id = id}
  • propSetters - Dictionary<int, Action<Selection>> - 按ID进行操作。他们看起来像someObject => AStaticClass.SomeMethod(someobject)
  • inputSelections - 只是一个包含2个整数的Selection个对象数组。没什么特别的

所以我做了一个粗略代表以下的测试

for (int c = 0; c < 10; c++)
        {
            for (int i = 0; i < count; i++)
            {
                foreach (var selection in inputSelections)
                {
                    var s = objCreators[selection.MarketID].Invoke(selection.SelectionID + c);
                    propSetters[selection.SelectionID].Invoke(s);
                }
            }
        }

我将它与一些if / else代码进行比较并得到以下结果

# 1 - Static If/Else: 209ms. | Static Switch 201ms. | Dynamic: 794ms.
# 2 - Static If/Else: 213ms. | Static Switch 188ms. | Dynamic: 201ms.
# 3 - Static If/Else: 195ms. | Static Switch 187ms. | Dynamic: 188ms.
# 4 - Static If/Else: 193ms. | Static Switch 186ms. | Dynamic: 187ms.
# 5 - Static If/Else: 199ms. | Static Switch 193ms. | Dynamic: 186ms.
# 6 - Static If/Else: 196ms. | Static Switch 186ms. | Dynamic: 193ms.
# 7 - Static If/Else: 196ms. | Static Switch 187ms. | Dynamic: 186ms.
# 8 - Static If/Else: 194ms. | Static Switch 188ms. | Dynamic: 187ms.
# 9 - Static If/Else: 193ms. | Static Switch 186ms. | Dynamic: 188ms.
# 10 - Static If/Else: 193ms. | Static Switch 186ms. | Dynamic: 186ms.

正如你在#1中看到的,我第一次调用我的删除它需要794ms,在接下来的测试中它会下降到大约190ms。

所以我决定通过遍历所有的deleagtes并在运行测试之前使用虚拟参数调用它们来提高我的性能,如下所示:

 foreach (var @delegate in objCreators)
        {
            var s = objCreators[@delegate.Key].Invoke(@delegate.Key);
            propSetters[@delegate.Key].Invoke(s);
        }

但是,我的测试结果没有改变。

我的问题是第一次运行我的10次测试时缓存/编译的内容,我无法通过简单地迭代我的所有lambdas并使用虚拟参数调用它们来再运行测试

我认为这是参数,但我让我的lambda invokactions依赖于c的值,我仍然设法在第一次运行后获得改进的性能,所以不是那样。 < / p>

0 个答案:

没有答案