2009-09-02 40 views
0

我们试图在.NET中对FileInfo对象的集合进行排序。我们实现了我们的IComparer,以确保FileInfo对象根据我们的标准进行排序。然后我们注意到对FileInfo对象进行排序的性能要比ints慢许多倍。在预感(并且记住C中的引用是如何工作的)我们能够通过使用局部变量来限制引用FileInfo属性的次数来提高性能。排序引用类型与值类型的性能

我的想法是局部变量比对象上的属性更快。我认为这在非​​托管代码的世界中是有道理的,我可以真正了解堆栈如何工作以及如何引用值。但是,我知道托管代码的世界可能会更复杂。我的问题是:这些关于内存管理和程序流程的基本概念是否可以通过托管代码的世界进行投影?

最终在KeeperOfTheSoul的帮助下,我们能够跟踪到我们如何嘲笑FileInfo对象。出于这个原因,我为这个问题添加了一个RhinoMock标签。

回答

1

除了比较方法的实现之外,排序值类型与引用类型之间不应该存在速度差异。如果我实现了使用罪的比较方法,那么整数也会慢慢排序。

访问属性确实涉及方法调用,同时访问本地变量,该值直接在堆栈中或已在寄存器中。但是,简单的属性可以通过JIT进行优化以提供类似于内联的内容。

在这种情况下,我认为问题是FileInfo可能需要读取文件系统以获取属性值,并且如果FileInfo没有内部缓存该值,它可能会最终重复执行此读取操作。

+0

我不认为FileInfo对象直接访问文件系统。在我们的测试中,我们实际上是使用RhinoMock嘲笑FileInfo对象。这提出了一个很好的观点,难道它只是RhinoMock框架,它减缓了我们的测试吗? – LJM 2009-09-02 15:54:51

+0

也许,我认为rhino mock会通过一些反思来放置它,当然足以阻止JIT优化效率的提高。 – 2009-09-02 15:56:45

+0

我只是运行一些测试来验证,它看起来像嘲笑对象的性能。谢谢您的帮助。 – LJM 2009-09-02 18:38:30