简介
我发现有关代码的合同在本月初的MSDN非常令人兴奋的文章。我不知道这个功能,NET 4.0中,在阅读文章之前,和asnbsp;的复杂的应用程序的开发者保持一个非常大的andnbsp的团队的经理,我总是在技术,提高代码质量和正确性。我不会老调重弹,在这篇文章中的有关代码合同有趣的细节。 {A}到Microsoft DevLabs下载页面,你需要运行下面的代码。
阅读MSDN文章时,我首先想到的是,带来的好处,必须拿出一些价格,和我最初关注的是对性能的影响。合同是在运行时执行自定义代码在编译时插入,每当其他一些进程将代码添加到矿山,我担心隐藏的性能成本。
我写了下面的小应用程序得到一些指标和评估如何昂贵的合同相比,可以用来验证前和执行后条件的其他技术。使用代码
MSDN文章的作者使用一个简单的计算器功能,突出合同的好处。我将使用相同的基本功能:private static Int32 Add(Int32 x, Int32 y) {
if (x == y)
return x * 2;
return x + y;
}
额外的,如果在那里的声明只是为了加强加入条件后,到处检查你的代码,你过早退出的难度。我要离开这里的分析。
"IF - THEN - Throwquot;
的方法来检查前,后的条件是使用明确的,如果语句以验证您的输入参数和输出结果。所有的前,后的条件,我们在这里加入是完全任意的,但自然会在所有的例子一致。{C}Debug.Assert的
另一种方法是使用Debug.Assert的():
合同private static Int32 AssertCheckedAdd(Int32 x, Int32 y) {
System.Diagnostics.Debug.Assert(x >= 0);
if (x == y) {
System.Diagnostics.Debug.Assert(x * 2 >= 0);
return x * 2;
}
System.Diagnostics.Debug.Assert(x + y >= 0);
return x + y;
}
最后的方法来检查是有趣的新的代码约定:private static Int32 ContractCheckedAdd(Int32 x, Int32 y) {
Contract.Requires(x >= 0, "X must be greater than 0");
Contract.Ensures(Contract.Result<Int32>() >= 0, "Result must be positive");
if (x == y)
return x * 2;
return x + y;
}
的合同,你不必担心你退出的好处之一。后检查条件都集中在方法的顶部。运行的不同方法
我定时亿次以上的方法执行了多长时间。
安装private delegate Int32 testMethod(Int32 x, Int32 y);
static void Main(string[] args) {
const Int32 ITERATIONS = 10000;
foreach (testMethod tm in new testMethod[] { new testMethod(Add),
new testMethod(IfCheckedAdd),
new testMethod(AssertCheckedAdd),
new testMethod(ContractCheckedAdd) }) {
DateTime start = DateTime.Now;
for (Int32 i = 0; i < ITERATIONS; i++)
for (Int32 j = 0; j < ITERATIONS; j++)
tm(i, j);
System.Console.WriteLine(tm.Method.Name + " " +
(DateTime.Now - start).TotalMilliseconds.ToString());
}
}
我运行应用程序的5倍,平均次数和结果的可变性的感觉。执行这些测试是在Windows 7(32位),双核心(英特尔酷睿2 E8400 3.0GHz处理器)的RAM。
的4Gb的CPU我用的代码合同SDK与前版本1.4.40314.1和检查后合同启用。
我不感兴趣,在执行的不同方法的表现时前或后的条件不具备,只是不同的验证框架的开销。
结果调试添加IF - THEN -抛出断言合同运行1(MS)2199.62230.83213.6运行21950.02184.02215.2运行31950.02199.62246.43260.4运行41950.02246.42293.23369.6运行51934.42184.02246.43244.8平均1940.62202.72246.43266.6标准偏差8.5425.6329.1860.0113.5%1.98%45.42%
15.76%68.33%
表1。结果从运行调试内置在Visual Studio 2008代码