Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 简单程序在C语言中需要3倍以上的时间#_Java_C#_Performance - Fatal编程技术网

Java 简单程序在C语言中需要3倍以上的时间#

Java 简单程序在C语言中需要3倍以上的时间#,java,c#,performance,Java,C#,Performance,我编写了一个简单的“基准测试”来比较相同情况下的性能——Java和C#。在Java中,程序需要2,2秒才能完成(多次运行),在C#中,程序需要7,4秒(多次运行) 使用的软件:Windows、Java(JDK 10)、C#(.NET Framework 4.6.1) CSharp的运行时不是jitting吗,或者为什么Java的速度更快 Java程序: Dummy[] dummies = new Dummy[100000000]; // Dummy = empty class var time

我编写了一个简单的“基准测试”来比较相同情况下的性能——Java和C#。在Java中,程序需要2,2秒才能完成(多次运行),在C#中,程序需要7,4秒(多次运行)

使用的软件:Windows、Java(JDK 10)、C#(.NET Framework 4.6.1)

CSharp的运行时不是jitting吗,或者为什么Java的速度更快

Java程序:

Dummy[] dummies = new Dummy[100000000]; // Dummy = empty class

var timer = new Timer();
timer.start();

for (int i = 0; i < 100000000; i++) {
    dummies[i] = new Dummy();
}

timer.stop();
System.out.println(String.format("Elapsed time: %sms", timer.millis(2)));
在C#中:


在C#中,使用秒表类测量计时膨胀-使用分析器。可能是字节码、尚未启动的JIT编译器、额外内存的过度分配等等。仅仅从代码上说是不可能的。这种基准测试相对来说毫无意义。您是否经常需要创建1亿个对象并在数组中存储对它们的引用?这里可能有各种各样的事情在起作用,特别是在内存管理方面,其中许多可能并不代表真正的应用程序。您是在
Release
模式下运行的吗?像这样的微基准测试几乎总是误导。您应该专注于分析和优化实际生产代码。Java可能更快的原因有很多。例如,JIT可能会注意到您实际上没有使用
Dummy
执行任何操作,并优化掉所有或大部分对象创建。
Dummy[] dummies = new Dummy[100000000]; // Dummy = empty class

var timer = new Timer();
timer.Start();

for (int i = 0; i < 100000000; i++)
{
    dummies[i] = new Dummy();
}

timer.Stop();
Console.WriteLine("Elapsed time: {0}ms", timer.Millis(2));
public class Timer {
    private long startTime, stopTime;

    public void start() {
        startTime = System.nanoTime();
        stopTime = startTime;
    }

    public void stop() {
        stopTime = System.nanoTime();
    }

    public double millis() {
        return stopTime / 1e6 - startTime / 1e6;
    }

    public double millis(int decimals) {
        double factor = Math.pow(10.0, decimals);
        return Math.round(millis() * factor) / factor;
    }
}
public class Timer
{
    private double startTime, stopTime;

    public void start()
    {
        startTime = TimeSpan.FromTicks(DateTime.Now.Ticks).TotalMilliseconds;
        stopTime = startTime;
    }

    public void stop()
    {
        stopTime = TimeSpan.FromTicks(DateTime.Now.Ticks).TotalMilliseconds;
    }

    public double Millis()
    {
        return stopTime - startTime;
    }

    public double Millis(int decimals)
    {
        return Math.Round(Millis(), decimals);
    }
}