有时需要在代码中使用笨拙/难以置信的构造,以便向智障编辑提供帮助,因为他们智慧的权力决定了程序应该在每次使用之前进行操作在构建时或安装时运行优化编译器一次。
是否存在标记这些笨拙/难以置信的构造的现有约定,类似于追溯到lint的/*FALLTHRU*/
事物?
这些构造必须被标记,原因类似于切换语句(在C / C ++中)中的漏洞案例需要用/*FALLTHRU*/
标记,而不是为了自动化工具的好处,而是为了保护它们免受更多善意但短视的维护程序员(可能是我们自己在几周/几个月/几年的时间)。标记的另一个好处是在看到足够正确标记的代码后,随着时间的推移调整内置的性能感。在散文中添加警告会产生更多噪音,并且它不会那么有效......
需要标记的典型示例是:
class Foo
{
int[] m_a;
public void f ()
{
var a = m_a;
int n = a.Length;
// ...
for (int i = 0; i < a.Length; ++i)
a[i] = ...
}
}
某些MS抖动能够自己创建和管理成员数组的本地阴影变量,但是没有一个能够在所有时间都这样做。此外,只有当循环测试针对循环体中正在访问的数组的.Length
成员但不时,循环体中至少有一些eliminate the bounds check test针对缓存值(示例中为n
)。另请参阅主题Array bounds check efficiency in .net 4 and above。
因此,影子变量a
需要标记为必要的基准证明,不基于偏见的过早优化&#39;以及{{1}的使用而不是a.Length
需要被标记为“不要触摸这一点,以免我的愤怒在你身上”。
我对此敏感的原因是我经常可以从调优的安全/托管C#中获得足够的性能,这样我就不必允许使用C ++编写的DLL来安装不安全的代码或放弃它。然而,这些调整有点脆弱。此外,这里的5%性能和10%的爬行损失可能难以检测,但在我的图像处理代码中,它们可以在一个工作日内累加数分钟甚至数小时。由于输入图像的质量具有漂移的趋势,因此检测到这种回归的困难变得更加严重,并且对于同一客户,它可以从一个客户端到下一个客户端以及从一天到下一天变化很大。
因此,明确标记作为防止不必要的绩效损失的保险措施(还有其他措施,但它们与标记问题没有密切关系)。
PS:还有其他需要标记的区域,例如使用有符号整数而不是无符号整数,因为较新的(!)抖动无法将无符号除以常数除以与反函数相乘他们使用有符号整数。如果使用有符号整数,即使逻辑需要无符号整数,并且即使有符号语义通常比无符号数学需要一定的开销,一些紧密循环也可以变快几倍。