VB.net比C++更快?

And*_*ect 4 c++ vb.net optimization

可能重复:
为什么C#执行Math.Sqrt()比VB.NET慢?

我遇到了一个有趣的问题,其中我在VB.net中有代码,在C++中有完全相同的代码.我希望C++自然比VB.net运行得更快,但我得到的恰恰相反:VB.net的运行速度是C++的两倍多.程序遍历从1到2,000,000的所有数字,确定它们是否为素数,并将所有素数加在一起.以下是以下片段:

C++

void problem10(void)
{   
   clock_t init, final;
   init=clock();

   int maxVal = 2000000;
   long long sumOfPrimes = 0;
   for (long i = 2; i < maxVal; i++)
   {
      if (isPrime(i))
      {
         sumOfPrimes+= i;
      }
   }
   final = clock() - init;
   cout << (double)final / ((double)CLOCKS_PER_SEC);
   cout << "The sum of all the prime numbers below " << maxVal << " is " << sumOfPrimes;
}

bool isPrime(int NumToCheck)
{
   for (int i = 2; i <= (sqrt((double)NumToCheck)); i++)
   {
      if (NumToCheck % i == 0)
      {
         return false;
      }
   }
   return true;
}
Run Code Online (Sandbox Code Playgroud)

C++输出:

3.846The sum of all the prime numbers below 2000000 is 142913828922
Run Code Online (Sandbox Code Playgroud)

这是完全相同的东西,只用VB.net编写

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 = 2000000
    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
Run Code Online (Sandbox Code Playgroud)

VB输出:

1643
The sum of all the prime numbers below 2000000 is 142913828922
Run Code Online (Sandbox Code Playgroud)

我觉得我有一些显而易见的东西,因为我真的看不到VB.net比C++更快.有任何想法吗?

Gab*_*abe 8

VB.Net解决方案在循环开始时计算一次平方根,而C++(以及C和C#和Java等)都通过循环计算平方根,因为它们的循环基元的定义不同.


jos*_*efx 6

你的问题是

For i As Integer = 2 To (Math.Sqrt(CDbl(NumToCheck)))
Run Code Online (Sandbox Code Playgroud)

是不一样的

for (int i = 2; i <= (sqrt((double)NumToCheck)); i++)
Run Code Online (Sandbox Code Playgroud)

VB.Net将在开始时对Math.Sqrt进行一次评估,而c ++必须在每次迭代时对其进行评估.在C#而不是c ++的stackoverflow上已经存在同样的问题.