Visual Studio 目标CPU显著影响执行时间

hmae6n7t  于 2023-10-23  发布在  其他
关注(0)|答案(3)|浏览(167)

最近,我一直在用C和VB.NET运行一些测试来比较执行速度。在last thread I posted中,我谈到了我如何遇到C执行速度与VB一样快的事实,但解决了这个问题。现在我的头撞到了另一堵墙:
我为VB.NET做了一个DLL来测试这个理论,并在一个程序中比较相同的VB.NET和C代码的并行执行时间。但有趣的是?VB.NET的执行时间得到了改善,现在它的执行时间与C的执行时间完全相同。花了一些时间解决这个问题,我发现Visual Studio 2008中高级编译选项中的“目标CPU”选项是罪魁祸首!
由于我运行的是64位Windows 7,我认为将目标CPU设置为x64将产生最佳的执行时间。错误。下面是一个VB.NET的Windows窗体应用程序的执行时间结果,计算10,000,000以内的所有素数并得到它们的和。
任何CPU:15.231秒

x86:10.858秒

x64:15.236秒
下面是我正在使用的代码,请随意测试它:

Public Class Form1

Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Dim watch As New Stopwatch
    watch.Start()

    Dim maxVal As Long = 10000000
    Dim sumOfPrimes As Long = 0
    For i As Integer = 2 To maxVal
        If (isPrime(i) = True) Then
            sumOfPrimes += i
        End If
    Next
    watch.Stop()
    Console.WriteLine(watch.ElapsedMilliseconds)
    Console.WriteLine("The sum of all the prime numbers below " & maxVal & " is " & sumOfPrimes)
End Sub

Function isPrime(ByVal NumToCheck As Integer) As Boolean
    For i As Integer = 2 To (Math.Sqrt(CDbl(NumToCheck)))
        If (NumToCheck Mod i = 0) Then
            Return False
        End If
    Next
    Return True
End Function

End Class

当我运行64位时,为什么选择目标CPU为32位会导致性能提高?任何帮助这个问题将不胜感激。

zbdgwd5y

zbdgwd5y1#

32位和64位模式之间存在许多差异,每种差异都可能以某种方式扭曲性能差异。
在64位模式下,CPU有更多的寄存器,并且每个寄存器都更大,这使得某些操作能够更快地执行(例如,更高的寄存器计数可以避免内存访问)。
但32位至少有一个优势:
指针的宽度为32位,在64位模式下为64位。对于严重依赖指针的程序,这可能会导致64位模式下的内存使用率显着提高,这意味着CPU缓存中的程序数据比例较小,因此64位模式下的性能可能会下降,因为缓存未命中的数量更高。
另一个因素是.NET框架在这两方面并不同样出色。它们还没有在32位和64位版本的JavaScript之间实现功能对等,并且JIT可能不会像针对32位代码那样针对64位代码进行调优。

lf5gs5x2

lf5gs5x22#

我在Release模式下运行了以下代码。我使用Ctrl + F5来运行代码。

Public Class Form1

    Function isPrime(ByVal NumToCheck As Integer) As Boolean
        Dim limit As Integer = CInt(Math.Ceiling(Math.Sqrt(CDbl(NumToCheck))))
        For i As Integer = 2 To limit
            If (NumToCheck Mod i = 0) Then
                Return False
            End If
        Next
        Return True
    End Function

    Dim watch As New Stopwatch
    Private Sub Button1_Click(ByVal sender As System.Object, _
                              ByVal e As System.EventArgs) Handles Button1.Click
        watch.Reset()
        watch.Start()

        Dim maxVal As Integer = 2000000
        Dim sumOfPrimes As Long = 0
        For i As Integer = 2 To maxVal
            If isPrime(i) Then
                sumOfPrimes += i
            End If
        Next
        watch.Stop()
        Label1.Text = watch.ElapsedMilliseconds.ToString
        Label2.Text = "The sum of all the prime numbers below " & maxVal & " is " & sumOfPrimes
    End Sub
End Class

AnyCPU每次都比x86快。我使用.NET 4.0。

a2mppw5e

a2mppw5e3#

.NET 3.5 SP1(即Visual Studio 2008 SP1)附带了许多性能增强,使JIT:er更有效地内联。不幸的是,这些增强功能仅针对x86:
How are value types implemented in the 32-bit CLR? What has been done to improve their performance?
然而,在.NET 4.0中,我发现x64和x86现在可以提供与x64相同或稍好的性能。

相关问题