我有一段代码,使用第三方工具迭代一组点的集合。
当使用dotTrace进行分析时,我注意到每次迭代都会访问
我期望这个属性的值会被编译器优化掉,但显然并没有发生。也许这实际上是基于COM的第三方库或在收集信息时由dotTrace自身引起的问题。
我不确定这个话题是否更适合于Gis.StackExchange。然而,也许有人知道在什么情况下不会发生优化,或者它可能会发生的方式。
for (int i = 0; i < pcoll.PointCount; i++) { /* ... */ }
当使用dotTrace进行分析时,我注意到每次迭代都会访问
PointCount
属性(如上图所示)。我期望这个属性的值会被编译器优化掉,但显然并没有发生。也许这实际上是基于COM的第三方库或在收集信息时由dotTrace自身引起的问题。
我不确定这个话题是否更适合于Gis.StackExchange。然而,也许有人知道在什么情况下不会发生优化,或者它可能会发生的方式。
pcoll.PointCount
的值。根据堆栈跟踪,调用了get方法。除非可以内联,否则无法对其进行优化。 - t3dodsonint pointCount = pcoll.PointCount; for (int i = 0; i < pointCount ; i++) { /*.. */ }
- Tim SchmelterPointCount
的值,因为只有在pcoll
是不可变的且PointCount
是纯的情况下才可能实现,而编译器无法知道这一点。通常,编译器会忽略第一个点(也就是说,它们会忽略跨线程访问 - 在同一线程中访问可能也会防止“优化”),但第二个点是确定的 - 编译器根本不允许进行这种类型的优化。 - Luaan