C# 为什么C比Java和C慢得多+;在我的素数测试中

C# 为什么C比Java和C慢得多+;在我的素数测试中,c#,java,c++,C#,Java,C++,(听我说,我的问题之前有很多解释) 正如你们中的一些人可能知道的,在过去的几天里,我已经发布了一些关于C++性能的问题。作为一个java程序员,我想知道C++是值得专门研究的,或者java足够好的性能编程。 不管怎样,我决定写一个基本的(非有效算法)素数程序——不创建对象,看看3种语言在时间上的比较。我不会发布代码,只是因为代码在算法中完全相同(除了我在C++中使用int而不是boolean)。只有计时代码不同(这显然超出了算法) 总之,要计算前10000个素数并将其循环40次(以夸大速度差异)

(听我说,我的问题之前有很多解释)

正如你们中的一些人可能知道的,在过去的几天里,我已经发布了一些关于C++性能的问题。作为一个java程序员,我想知道C++是值得专门研究的,或者java足够好的性能编程。 不管怎样,我决定写一个基本的(非有效算法)素数程序——不创建对象,看看3种语言在时间上的比较。我不会发布代码,只是因为代码在算法中完全相同(除了我在C++中使用int而不是boolean)。只有计时代码不同(这显然超出了算法)

总之,要计算前10000个素数并将其循环40次(以夸大速度差异),需要:

爪哇:190.5秒

C++:189秒

C#:242秒

要计算前100000个素数(一次运行),需要:

爪哇:591秒

C++:588秒

C#:771秒

那么我的问题是,为什么C#比其他2个要慢得多?我认为Java和C#会非常接近。下面是C#算法(我知道有更快的方法可以找到素数):

static void Main(字符串[]args)
{
int NumberOfPrimesToFind=100000;
int NumberOfRuns=1;
DateTime start=DateTime.Now;
对于(int k=0;k
C++

intmain()
{
int NumberOfPrimesToFind=100000;
int NumberOfRuns=1;
内部温度;
双dif;
开始、结束的时间;
时间(&开始);
对于(int k=0;k
爪哇:

publicstaticvoidmain(字符串[]args){
int NumberOfPrimesToFind=100000;
int NumberOfRuns=1;
长启动=System.currentTimeMillis();
对于(int k=0;k
关于C#:

首先,你应该用秒表代替日期时间。 Datetime对于代码计时不可靠

第二,您确定要在关闭VisualStudio的情况下以发布模式执行它吗? 如果visual studio已打开,或者您正在使用F5启动,JIT将不会优化代码

所以。。。使用秒表并关闭visual studio的所有实例。 您必须更改项目选项,您应该在顶部工具栏中有一个组合框,您可以在其中阅读“调试”,只需单击它并选择“发布”,或者右键单击您的项目、属性,然后将其更改为发布模式。然后,为了避免各种问题,关闭VisualStudio的所有实例并双击可执行文件启动

CTRL+F5不在发布模式下编译,它只在选定的编译模式下启动可执行文件,而不附加调试进程,因此如果它是在调试模式下编译的,它将在调试模式下启动编译的可执行文件,而不调试它

然后我建议您避免使用布尔变量,每个分支条件都会降低CPU的速度,您可以使用整数。这不仅适用于C#,而且适用于所有语言

static void Main()
{
常量int NumberOfPrimesToFind=100000;
常数int NumberOfRuns=1;
System.Diagnostic.Stopwatch sw=新的System.Diagnostic.Stopwatch();
sw.Start();
对于(int k=0;kstatic void Main(string[] args)
{

    int NumberOfPrimesToFind = 100000;
    int NumberOfRuns = 1;

    DateTime start = DateTime.Now;
    for (int k = 0; k < NumberOfRuns; k++)
    {
        FindPrimes(NumberOfPrimesToFind);

    }
    DateTime finish = DateTime.Now;
    Console.Out.WriteLine(finish-start);
    Console.In.Read();
}


static void FindPrimes(int NumberOfPrimesToFind)
{
    int NumberOfPrimes = 0;
    int CurrentPossible = 2;
    Boolean IsPrime ;

    while (NumberOfPrimes < NumberOfPrimesToFind)
    {
        IsPrime = true;

        for (int j = 2; j < CurrentPossible; j++)
        {
            if (CurrentPossible % j == 0)
            {
                IsPrime = false;
                break;
            }
        }

        if (IsPrime)
        {
            NumberOfPrimes++;
        }

        CurrentPossible++;
    }
}
int main()
{
    int NumberOfPrimesToFind = 100000;
    int NumberOfRuns = 1;
    int temp;
    double dif;

    time_t start,end;
    time (&start);

    for (int k = 0; k < NumberOfRuns; k++)
    {
        FindPrimes(NumberOfPrimesToFind);

    }

    time (&end);

    //Number of seconds
    dif = difftime (end,start);

    cout << (dif);
    cin >> temp;
}

void FindPrimes(int NumberOfPrimesToFind)
{
    int NumberOfPrimes = 0;
    int CurrentPossible = 2;
    int IsPrime ;

    while (NumberOfPrimes < NumberOfPrimesToFind)
    {
        IsPrime = 1;

        for (int j = 2; j < CurrentPossible; j++)
        {
            if (CurrentPossible % j == 0)
            {
                IsPrime = 0;
                break;
            }
        }

        if (IsPrime==1)
        {
            NumberOfPrimes++;
        }

        CurrentPossible++;
    }
}
public static void main(String[] args) {
    int NumberOfPrimesToFind = 100000;
    int NumberOfRuns = 1;

    long start = System.currentTimeMillis();
    for (int k = 0; k < NumberOfRuns; k++)
    {
        FindPrimes(NumberOfPrimesToFind);

    }
    long finish = System.currentTimeMillis();
    System.out.println((finish-start));

}

static void FindPrimes(int NumberOfPrimesToFind)
{
    int NumberOfPrimes = 0;
    int CurrentPossible = 2;
    Boolean IsPrime ;

    while (NumberOfPrimes < NumberOfPrimesToFind)
    {
        IsPrime = true;

        for (int j = 2; j < CurrentPossible; j++)
        {
            if (CurrentPossible % j == 0)
            {
                IsPrime = false;
                break;
            }
        }

        if (IsPrime)
        {
            NumberOfPrimes++;
        }

        CurrentPossible++;
    }
}
static void Main()
{
    const int NumberOfPrimesToFind = 100000;
    const int NumberOfRuns = 1;

    System.Diagnostic.Stopwatch sw = new System.Diagnostic.Stopwatch();

    sw.Start();
    for (int k = 0; k < NumberOfRuns; k++)
    {
        FindPrimes(NumberOfPrimesToFind);
    }
    sw.Stop();

    Console.WriteLine(sw.Elapsed.TotalMilliseconds);
    Console.ReadLine();
}

static void FindPrimes(int NumberOfPrimesToFind)
{
    int NumberOfPrimes = 0;
    int CurrentPossible = 2;

    while (NumberOfPrimes < NumberOfPrimesToFind)
    {
        int IsPrime = 1;

        for (int j = 2; j < CurrentPossible; j++)
        {
            if (CurrentPossible % j == 0)
            {
                IsPrime = 0;
                break;
            }
        }

        NumberOfPrimes += IsPrime;
        CurrentPossible++;
    }
}
int FindPrimes(int NumberOfPrimesToFind)
{
    int NumberOfPrimes = 0;
    int CurrentPossible = 2;
    while (NumberOfPrimes < NumberOfPrimesToFind)
    {
        int IsPrime = 1;

        for (int j = 2; j < CurrentPossible; j++)
        {
            if (CurrentPossible % j == 0)
            {
                IsPrime = 0;
                break;
            }
        }

        NumberOfPrimes += IsPrime;
        CurrentPossible++;
    }
    return NumberOfPrimes ;
}
public static void main(String... args) {
    int numberOfPrimesToFind = 100000;
    int numberOfRuns = 40;

    long start = System.currentTimeMillis();
    for (int k = 0; k < numberOfRuns; k++)
        findPrimes(numberOfPrimesToFind);

    long finish = System.currentTimeMillis() - start;
    System.out.printf("Took %.2f seconds to loop %,d times%n", finish/1e3, numberOfRuns);
}

static void findPrimes(int numberOfPrimesToFind) {
    int numberOfPrimes = 0;
    int currentPossible = 2;

    while (numberOfPrimes < numberOfPrimesToFind) {
        boolean isPrime = isPrime(currentPossible);

        if (isPrime) {
            numberOfPrimes++;
        }

        currentPossible++;
    }
}

private static boolean isPrime(int currentPossible) {
    if ((currentPossible & 1) == 0) return false;
    for (int j = 3; j * j <= currentPossible; j += 2)
        if (currentPossible % j == 0)
            return false;
    return true;
}
Took 9.26 seconds to loop 40 times