65.9K
CodeProject 正在变化。 阅读更多。
Home

C# 代码分析

2006年8月16日

1分钟阅读

viewsIcon

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 重新测试,而不仅仅是在计时器上

- 观察物理内存分配,以避免硬盘交换

- 在虚拟机上测试


© . All rights reserved.