gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 20:56:24 27 4
gpt4 key购买 nike

我最近开始学习 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# - 在我的控制台项目中生成偶数的更有效语法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31351449/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com