代码之家  ›  专栏  ›  技术社区  ›  AndyPerfect

目标CPU显著影响执行时间

  •  1
  • AndyPerfect  · 技术社区  · 14 年前

    最近,我用C++和VB.NET运行了一些测试来比较执行速度。在 last thread I posted 我谈到了我是如何遇到C++执行的速度和VB一样快的,但是解决了这个问题。现在我的头撞到了另一面墙上:

    我已经为VB.NET开发了一个DLL来测试这个理论,并在一个程序的并行执行时间中对相同的VB.NET和C++代码进行比较。但有趣的是?VB.NET的执行时间得到改进,现在它与C++的执行时间完全相同。花了一段时间来解决这个问题,我发现Visual Studio 2008高级编译选项中的“target cpu”选项是罪魁祸首!

    因为我运行的是64位Windows7,所以我想让目标CPU X64产生最佳执行时间。错了。下面是Windows窗体应用程序在vb.net上执行时间的结果,计算所有最长10000000的素数并得到它们的和。

    任意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位会导致性能提高?对于这个问题的任何帮助都将不胜感激。

    3 回复  |  直到 14 年前
        1
  •  2
  •   Stack Overflow is garbage    14 年前

    32位模式和64位模式之间存在许多差异,这两种模式都可能以某种方式扭曲性能差异。

    在64位模式下,CPU有更多的寄存器,并且每个寄存器都更大,这使得一些操作可以更快地执行(例如,较高的寄存器计数可以避免内存访问)

    但32位至少也有一个优势:

    指针宽32位,64位模式下为64位。对于严重依赖指针的程序,这可能会导致64位模式下的内存使用率显著提高,这意味着程序数据中的一小部分将适合CPU缓存,因此64位模式下的性能可能会因缓存未命中次数增加而降低。

    另一个因素是.NET框架在这两方面都不擅长。它们还没有32位和64位版本的clr之间的特性奇偶校验,对于64位代码,JIT可能无法像32位代码那样进行调优。

        2
  •  0
  •   Peter Mortensen venu    14 年前

    我在释放模式下运行了以下代码。我用过 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
    

    任何CPU每次都比x86快。我正在使用.NET 4.0。

        3
  •  0
  •   Cyril Gandon niktrs    13 年前

    .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提供了相同或稍好的性能。