【发布时间】:2015-09-15 19:58:13
【问题描述】:
我有一个使用第三方工具迭代点集合的代码。
for (int i = 0; i < pcoll.PointCount; i++) { /* ... */ }
通过 dotTrace 进行分析时,我注意到每次迭代都会访问 PointCount-proerty(见上图)
.
我预计该属性的值会被编译器优化掉,但显然这不会发生。也许这实际上是基于 COM 的 3rd-party 库中的一个问题,或者在收集信息时也出现在 dotTrace self 中。
我不确定这个主题是否更适合 Gis.StackExchange。但是,也许有人知道在哪些情况下不会进行优化或如何进行优化。
【问题讨论】:
-
我不肯定,但我认为这与属性有关,是 C# 中的方法。所以它可能无法静态知道
pcoll.PointCountEDIT 的值。查看调用 get 方法时发生的堆栈跟踪。除非它们可以内联,否则您无法优化它们。 -
int pointCount = pcoll.PointCount; for (int i = 0; i < pointCount ; i++) { /*.. */ }现在被缓存,属性只被访问一次。 -
@TomDDD 内联是较小的一点 - 较大的一点是编译器无法知道存储
PointCount的值是否安全,因为只有当pcoll是不可变的时才有可能,并且 @ 987654328@ 是纯的 - 编译器无法知道这一点。通常,编译器会忽略第一点(也就是说,它们会忽略跨线程访问——在同一个线程中访问它也可能会阻止“优化”),但第二点是可靠的——编译器根本不允许这样做这种优化,永远。
标签: c# performance arcgis