Java 简单程序在C语言中需要3倍以上的时间#
我编写了一个简单的“基准测试”来比较相同情况下的性能——Java和C#。在Java中,程序需要2,2秒才能完成(多次运行),在C#中,程序需要7,4秒(多次运行) 使用的软件:Windows、Java(JDK 10)、C#(.NET Framework 4.6.1) CSharp的运行时不是jitting吗,或者为什么Java的速度更快 Java程序: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
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);
}
}