有一次,我只是纠正你的错误,因为我认为你打算,我用Ctrl + F5时使用Visual Studio 2010发布版本得到如下的输出:
0,5,8,17,24 ,37,48,65,80,101,120,145,168,197,224,257,288,325,360,401,440,485,528,577,624,677,728,785,840,901,960,1025,1088,1157,1224,1297,1368,1445,1520,1601,1680,1765,1848,1937,2024,2117,2208,2305,2400,2501,2600,2705 ,2808,2917,3024,3137,3248,3365,3480,3601,3720,3845,3968,4097,4224,4357,4488,4625,4760,4901,5040,5185,5328,5477,5624,5777,5928 ,6085,6240,6401,6560,6725,6888,7057,7224,7397,7568,7745,7920,8101,8280,8465,8648,8837,9024,9217,9408,9605,9800,10001
33。9106
与此代码是:
Sub Main()
Dim watch As Stopwatch = Stopwatch.StartNew()
Dim l As New List(Of ULong)(CInt(My.Application.CommandLineArgs(0)))
For i As ULong = 1 To CULng(l.Capacity)
' ONE LINE IF STMT: If l.Capacity And 1 <> 0 Then If i And 1 = 0 Then l.Add((i * i) - 1) Else l.Add((i * i) + 1) Else If i And 1 = 0 Then l.Add((i * i) + 1) Else l.Add((i * i) - 1)
If (l.Capacity And 1) <> 0 Then
If (i And 1UL) = 0UL Then
l.Add((i * i) - 1UL)
Else
l.Add((i * i) + 1UL)
End If
Else
If (i And 1UL) = 0UL Then
l.Add((i * i) + 1UL)
Else
l.Add((i * i) - 1UL)
End If
End If
Next i
Console.WriteLine(String.Join(","c, l.ToArray))
watch.Stop()
Console.WriteLine(watch.Elapsed.TotalMilliseconds)
Console.ReadLine()
End Sub
使用LINQ:
0,5,8,17,24,37,48,65,80,101,120,145,168,197,224,257,288,325,360,401,440,485,528,577,624,677,728,785,840,901,960,1025,1088, 1157,1224,1297,1368,1445,1520,1601,1680,1765,1848,1937,2024,2117,2208,2305,2400,2501,2600,2705,2808,2917,3024,3137,3248,3365, 3480,3601,3720,3845,3968,4097,4224,4357,4488,4625,4760,4901,5040,5185,5328,5477,5624,5777,5928,6085,6240,6401,6560,6725,6888, 7057,7224, 7397,7568,7745,7920,8101,8280,8465,8648,8837,9024,9217,9408,9605,9800,10001
13.0721
与是:
Sub Main()
Dim watch As Stopwatch = Stopwatch.StartNew()
Dim arg = CInt(My.Application.CommandLineArgs(0))
Console.WriteLine(String.Join(","c, Enumerable.Range(1, arg).Select(
Function(i) ((i * i +
If((arg And 1) <> 0,
If((i And 1) = 0, -1, 1),
If((i And 1) = 0, 1, -1))).ToString()))))
watch.Stop()
Console.WriteLine(watch.Elapsed.TotalMilliseconds)
Console.ReadLine()
End Sub
现在优化:
0,5,8,17,24,37,48,65,80,101,120,145,168,197,224,257,288,325,360,401,440,485,528,577,624,677,728,785,840,901,960,1025,1088,1157,1224,1297,1368,1445,1520,1601,1680,1765,1848,1937 ,2024,2117,2208,2305,2400,2501,2600,2705,2808,2917,3024,3137,3248,3365,3 480,3601,3720,3845,3968,4097,4224,4357,4488,4625,4760,4901,5040,5185,5328,5477,5624,5777,5928,6085,6240,6401,6560,6725,6888, 7057,7224,7397,7568,7745,7920,8101,8280,8465,8648,8837,9024,9217,9408,9605,9800,10001
12.5956
而在这一点上,我想我清楚打Console.WriteLine
方差作为计时内,但即使有下面的代码,我仍然得到12到15毫秒...
Sub Main()
Dim watch As Stopwatch = Stopwatch.StartNew()
Dim arg = CInt(My.Application.CommandLineArgs(0))
Dim fn As Func(Of Integer, String) = If((arg And 1) <> 0,
Function(i As Integer) ((i * i + If((i And 1) = 0, -1, 1)).ToString()),
Function(i As Integer) ((i * i + If((i And 1) = 0, 1, -1)).ToString()))
Dim s = String.Join(","c, Enumerable.Range(1, arg).Select(fn))
watch.Stop()
Console.WriteLine(s)
Console.WriteLine(watch.Elapsed.TotalMilliseconds)
Console.ReadLine()
End Sub
为什么在度量console.write? string.join会不会比字符串生成器更好/更快,并且在最后转储? – 2012-07-28 11:55:21
您正在测量Console.WriteLine()的速度。是的,它很慢。不是一个问题,它只需要和人类一样快就可以阅读。 – 2012-07-28 16:48:02
使用Option Strict On将您的代码粘贴到默认的新控制台项目中,可以突出显示代码中的许多问题。在尝试优化代码之前,您需要确保代码正在做你想做的事情! – 2012-07-30 07:50:48