c# – 在我的控制台项目中生成偶数的更有效的语法是什么?

前端之家收集整理的这篇文章主要介绍了c# – 在我的控制台项目中生成偶数的更有效的语法是什么?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我最近开始学习c#,并了解到当我写这个For循环时,有两种方法可以让我的代码输出偶数.我学习了第2版的语法,这对我来说很直观.但是,版本1是我在网上其他地方找到的一个例子.我想了解两个版本之间是否存在差异.
//Version 1
for (int num = 0; num < 100; num+=2) 
{
    Console.WriteLine (num); 
}

//Version 2
for (int num = 0; num < 100; num++)
{
    if (num % 2 == 0)
    {
        Console.WriteLine (num);
    } 
}

在两种可能的方法中,两种语法之间有什么区别吗?如果是,哪个更有效,为什么?

解决方法

对于给定的N值(在您的示例代码中,N = 100)

>版本#1添加N / 2
>版本#2确实增加了N个,加上N个整数除法(相对昂贵的操作).

你忘记了第3版,有点笨拙.按位运算比除法更便宜,因为我们知道C#世界中的整数是二进制补码二进制值,所以低位的状态告诉我们整数是否是偶数,因此:

bool isEven( int n ) { return 0 == ( n & 1 ) ; }

我们可以编写一个测试工具,如下所示:

class Program
{
  public static int Version1(int n)
  {
    int cnt = 0;
    for ( int i = 0 ; i < n ; i+=2 )
    {
      ++cnt;
    }
    return cnt;
  }

  public static int Version2(int n)
  {
    int cnt = 0;
    for ( int i = 0 ; i < n ; ++i )
    {
      if ( i % 2 == 0 )
      {
        ++cnt;
      }
    }
    return cnt;
  }

  public static int Version3(int n)
  {
    int cnt = 0;
    for ( int i = 0 ; i < n ; ++i )
    {
      if ( 0 == (i & 1) )
      {
        ++cnt;
      }
    }
    return cnt;
  }

  private static void Main(string[] args)
  {
    int n = 500000000;
    Stopwatch timer = new Stopwatch();

    timer.Start();
    Version1( n );
    timer.Stop();
    Console.WriteLine( "{0:c} -- Version #1 (incrementing by 2)",timer.Elapsed ) ;

    timer.Restart();
    Version2(n);
    timer.Stop();
    Console.WriteLine( "{0:c} -- Version #2 (incrementing by 1 with modulo test)",timer.Elapsed ) ;

    timer.Restart();
    Version3(n);
    timer.Stop();
    Console.WriteLine( "{0:c} -- Version #3 (incrementing by 1 with bit twiddling)",timer.Elapsed ) ;

    return;

  }

}

并找出哪个实际上更快.上面的程序运行循环500,000,000次,因此我们得到足够大的数字来衡量.

以下是我在VS 2013中获得的时间:

>调试构建(非优化):

00:00:00.5500486 -- Version #1 (incrementing by 2)
00:00:02.0843776 -- Version #2 (incrementing by 1 with modulo test)
00:00:01.2507272 -- Version #3 (incrementing by 1 with bit twiddling)

>版本#2比版本#1慢3.789倍
>版本#3比版本#1慢2.274倍

>发布版本(优化)

00:00:00.1680107 -- Version #1 (incrementing by 2)
00:00:00.5109271 -- Version #2 (incrementing by 1 with modulo test)
00:00:00.3367961 -- Version #3 (incrementing by 1 with bit twiddling)

>版本#2比版本#1慢3.041倍>版本#3比版本#1慢2.005倍

猜你在找的C#相关文章