0

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

我的想法是访问局部变量比访问对象上的属性更快。我认为这在非​​托管代码的世界中是有意义的,在那里我实际上可以想象堆栈是如何工作的以及如何引用值。但是,我知道托管代码的世界在幕后可能会更加复杂。我的问题是:这些非托管代码中的内存管理和程序流程的基本思想可以普遍地投射到托管代码的世界中吗?

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

4

1 回答 1

1

除了比较方法的实现之外,与引用类型相比,对值类型进行排序之间应该没有真正的速度差异。如果我实现了一个使用 sin 的比较方法,那么 int 的排序也会很慢。

访问属性确实涉及方法调用,同时访问局部变量,该值直接在堆栈上或已经在寄存器中。但是,JIT 可以优化简单的属性以提供类似于内联的功能。

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

于 2009-09-02T15:49:09.167 回答