C# 代码分析






1.24/5 (10投票s)
2006年8月16日
1分钟阅读

57464
优化您的代码
引言
游戏程序员一直都有相同的目标:编写尽可能快的代码。不必在所有地方都使用汇编或记住 MSIL,只需使用性能分析器查看即可;p 循环在 C# 中非常有用且被广泛使用,但是对于 ArrayList 浏览所有项目,哪种解决方案最好? IEnumerator 是否比 for() 循环更快? 让我们拭目以待。 对于这篇文章,我选择了 Red Gate Ants Profiler 2.6.0 Build 62 (http://www.red-gate.com/products/ants_profiler/index.htm)。 结果……令人惊讶。
ArrayList
我找到了 4 种浏览 ArrayList 的方法,Antony 又找到了另外一种
static public void Browse1 (ArrayList list)
{
int Total = 0;
for (int i = 0; i < list.Count; i++)
{
Total += (int)list[i];
}
}
static public void Browse2 (ArrayList list)
{
int Total = 0;
int Count = list.Count;
for (int i = 0; i < Count; i++)
{
Total += (int)list[i];
}
}
static public void Browse3 (ArrayList list)
{
int Total = 0;
IEnumerator Iterator = list.GetEnumerator ();
while (Iterator.MoveNext ())
{
Total += (int)Iterator.Current;
}
}
static public void Browse4 (ArrayList list)
{
int Total = 0;
foreach (int i in list)
{
Total += i;
}
}
static public void Browse5(ArrayList list)
{
int Total = 0;
for (int i = list.Count - 1; i >= 0; i--)
{
Total += (int)list[i];
}
}
在 Main() 中,只需填充 ArrayList
ArrayList MyList = new ArrayList ();
// Add items
DateTime CurrentTime = DateTime.Now;
Random rand = new Random (CurrentTime.Millisecond);
int Count = (int)(CurrentTime.Ticks % (1<<25));
int NewValue = (rand.Next () % 100);
Console.WriteLine ("Fill list with {0} elements", Count);
for (int i = 0; i < Count; i++)
{
MyList.Add (NewValue);
}
// Browse
DateTime d1, d2, d3, d4, d5, d6;
d1 = DateTime.Now;
Console.WriteLine ("Browse1");
Browse1 (MyList);
d2 = DateTime.Now;
Console.WriteLine ("Browse2");
Browse2 (MyList);
d3 = DateTime.Now;
Console.WriteLine ("Browse3");
Browse3 (MyList);
d4 = DateTime.Now;
Console.WriteLine ("Browse4");
Browse4 (MyList);
d5 = DateTime.Now;
Console.WriteLine("Browse5");
Browse5(MyList);
d6 = DateTime.Now;
// Print results
TimeSpan r1,r2,r3,r4,r5;
r1 = d2 - d1;
r2 = d3 - d2;
r3 = d4 - d3;
r4 = d5 - d4;
r5 = d6 - d5;
Console.WriteLine("Browse1 : {0}", r1.TotalMilliseconds);
Console.WriteLine("Browse2 : {0}", r2.TotalMilliseconds);
Console.WriteLine("Browse3 : {0}", r3.TotalMilliseconds);
Console.WriteLine("Browse4 : {0}", r4.TotalMilliseconds);
Console.WriteLine("Browse5 : {0}", r5.TotalMilliseconds);
Console.WriteLine("Press any key");
Console.ReadKey();
以下是结果(发布版本,PIV C,XP Pro SP2)
Count |
24 145 243 |
18 491 373 |
Browse1 | 327.55 毫秒 |
249.56 毫秒 |
Browse2 | 233.96 毫秒 |
202.77 毫秒 |
Browse3 | 717.48 毫秒 |
545.91 毫秒 |
Browse4 | 717.48 毫秒 |
561.51 毫秒 |
Browse5 | 249.56 毫秒 |
171.57 毫秒 |
有趣的是,在第一种情况下,解决方案 3 和 4 的时间相同,但在第二种情况下则不同。
方法 2 或 5 似乎是最快的,但并非总是以相同的顺序。
我们可以在其他计算机上进行其他测试
- 使用 Red Gate Ants Profiler 重新测试,而不仅仅是在计时器上
- 观察物理内存分配,以避免硬盘交换
- 在虚拟机上测试