我在编写缓存部分排序结构的过程中,以便后续搜索相同结构时利用先前的搜索。预计这需要与大型集合(1m +项目)非常快速地工作,因此让一切都基本起作用,我试图将其分析下来。
在这样做的过程中,我遇到了下面的方法 - 显然 - 至少在Debug编译代码中 - 在初始化方法时使用大约17%的总执行时间(第一个{
旁边的17%性格),感觉很多。代码被频繁调用,并且在发布模式中我希望它被内联,但鉴于以下内容,我无法确定实际进行的初始化 - 所有访问和修改的变量都是字段代表搜索的整体struct
。
任何人都可以在下面找到C#编译器可能觉得需要创建变量代替语法糖等的地方,或者帮助我理解为什么这个方法的初始化成本与它的总执行大致相同? (第一个循环大约11%,第二个循环大约4%)。
值得注意的是_p_Items_SortedFlag
是指向布尔数组中第一项的指针,其他所有内容都是int
s。
[MethodImpl(MethodImplOptions.AggressiveInlining)]
private void StepBackToUnsorted()
{
// Step the RCursor back to the last unsorted item
// Costs circa 11% on the while conditions.
while (_p_Items_SortedFlag[_RCursor] && _RCursor > _LCursor)
{
--_RCursor;
++_RCount;
}
// Step the Upper Right bound through any sorted
// items
// Costs Circa 4% on the while conditions.
while (_p_Items_SortedFlag[_RUpper] && _RUpper > _RCursor)
--_RUpper;
}
如上所述,此代码可能最终在发布时内联。但是,我仍然非常感兴趣 - 从一个如何 - 我 - 避免它 - 当它不是内联的视角 - 关于什么可能导致如此大的初始化成本从字面上看,一切都应该在那里等待使用。