我最近开始学习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倍