Java与.NET的性能 [英] Java vs .NET performance
问题描述
在我编写了这段小代码以比较计算机中的.NET 4.5和Java 8性能之后,我感到非常惊讶:
class ArrayTest
{
public int[][] jagged;
public ArrayTest(int width, int height)
{
Height = height;
Width = width;
Random rng = new Random();
jagged = new int[width][];
for (int i = 0; i < height; i++)
{
jagged[i] = new int[width];
for (int j = 0; j < jagged[i][j]; j++)
{
jagged[i][j] = rng.Next(2048);
}
}
}
public int this[int i, int j]
{
get
{
return jagged[i][j];
}
set
{
jagged[i][j] = value;
}
}
public void DoMath(ArrayTest a)
{
for (int i = 0; i < Height; i++)
{
for (int j = 0; j < Width; j++)
{
this[i, j] *= a[i, j];
}
}
}
public int Height { get; private set; }
public int Width { get; private set; }
}
class Program
{
static void Main(string[] args)
{
Random rng = new Random();
const int loop = 10;
int width = 10000,
height = 10000;
ArrayTest a1 = new ArrayTest(width, height),
a2 = new ArrayTest(width, height);
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < loop; i++)
{
a1.DoMath(a2);
}
sw.Stop();
Console.WriteLine("Time taken: " + sw.ElapsedMilliseconds);
Console.ReadKey();
}
}
这是Java版本:
public class ArrayTest {
private int width, height;
private int[][] array;
public ArrayTest(int width, int height) {
this.width = width;
this.height = height;
array = new int[height][width];
Random rng = new Random();
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
array[i][j] = rng.nextInt(2048);
}
}
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int[][] getArray() {
return array;
}
public void doMath(ArrayTest a) {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
array[i][j] *= a.getArray()[i][j];
}
}
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
final int loops = 10;
int width = 10000, height = 10000;
ArrayTest a1 = new ArrayTest(width, height),
a2 = new ArrayTest(width, height);
long start, end;
start = java.lang.System.currentTimeMillis();
for (int i = 0; i < loops; i++) {
a1.doMath(a2);
}
end = java.lang.System.currentTimeMillis();
System.out.println("Elapsed time: " + (float)(end - start));
}
}
在我的计算机上,此C#代码运行大约需要5200毫秒,而Java版本运行大约2800毫秒(!!!). 我实际上希望.NET版本比Java更快(或至少接近)运行,但对此结果感到非常惊讶.
注意:我在Visual Studio外部运行了以发布模式编译的.NET版本.
有人可以解释这个结果吗?这是真的吗 我该如何重写此代码,以使C#.NET版本的执行速度更接近Java?
嗯,我知道这不是一个真正有效的基准测试或公平的比较,但是我该如何重写此代码,以使C#.NET版本的执行速度更接近Java? 以任何形式进行了尝试(通过吸气剂等直接操纵锯齿状阵列),但是测试的运行速度甚至更慢.
编辑测试,使我的宽度和高度= 500,循环= 5000. 现在,.NET版本约有6300ms,而Java版本约有3700ms.当然,每个版本都要多次运行测试.
仅使用平面数组而不是2D数组编写了类似的测试,这一次.NET版本的运行速度与Java相同,甚至甚至更快.就是这样吗? C#.NET的锯齿状数组仅比Java的多维数组慢吗?
每当您进行任何类型的基准测试或性能分析时,您都需要问很多问题,并得出任何特定的结果(以释义
但是.... 我复制粘贴了您的代码,这就是我得到的: 因此Java程序的运行速度比C#程序快4.5倍. 我还运行了MSVS概要分析向导": https://msdn.microsoft.com/en-us/library/dd264959.aspx 您可能会从屏幕截图中看到,此配置文件中的大猪"是ArrayTest.get_item(int32,int32),它消耗了执行时间的近一半: >
I got myself very surprised after I wrote this small code to compare .NET 4.5 and Java 8 performance in my computer: Here is the Java version: In my computer this C# code is taking about 5200ms to run, and the Java version is taking about 2800ms(!!!).
I was actually expecting that the .NET version would run faster (or at least close to) than Java, but got very surprised with this result. Note: I ran the .NET version compiled in release mode, outside Visual Studio. Can somebody explain this result? Is this really right?
How could I rewrite this code so that the C#.NET version gets closer to the Java one in execution speed? [edit] Well, I know this is not a really valid benchmarking or a fair comparison, but how could I rewrite this code so that the C#.NET version gets closer to the Java one in execution speed?
Tried in any forms (manipulating the jagged array directly, via a getter, etc), but the test ran even slower. [edit 2] Edited the test so that I have width and height = 500, and loop = 5000.
Now I get about 6300ms for .NET version, and about 3700ms for Java version. ran the test multiple times for each version, of course. [edit 3] Just wrote a similar test using flat arrays instead of 2D arrays, and this time the .NET version runs equally or even faster than Java. So is that it?
C#.NET's jagged arrays are just slower than Java's multidimensional arrays? Any time you do any kind of benchmarking or performance analysis, you need to ask a lot of questions, and take any particular result with (to paraphrase Tanenbaum), "a metric ton of salt". HOWEVER .... I copied pasted your code, and this is what I got: So the Java program ran 4.5x faster than the C# program. I also ran the MSVS "Profiling Wizard": https://msdn.microsoft.com/en-us/library/dd264959.aspx As you might be able to see from the screenshot, the "Big Pig" in this profile was ArrayTest.get_item(int32, int32), which consumed NEARLY HALF of the execution time: 这篇关于Java与.NET的性能的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!Compiler Version Timing
-------- ------- ------
MSVS 2012 C# 5 4448.0
Eclipse Luna JRE 1.7 977.0
class ArrayTest
{
public int[][] jagged;
public ArrayTest(int width, int height)
{
Height = height;
Width = width;
Random rng = new Random();
jagged = new int[width][];
for (int i = 0; i < height; i++)
{
jagged[i] = new int[width];
for (int j = 0; j < jagged[i][j]; j++)
{
jagged[i][j] = rng.Next(2048);
}
}
}
public int this[int i, int j]
{
get
{
return jagged[i][j];
}
set
{
jagged[i][j] = value;
}
}
public void DoMath(ArrayTest a)
{
for (int i = 0; i < Height; i++)
{
for (int j = 0; j < Width; j++)
{
this[i, j] *= a[i, j];
}
}
}
public int Height { get; private set; }
public int Width { get; private set; }
}
class Program
{
static void Main(string[] args)
{
Random rng = new Random();
const int loop = 10;
int width = 10000,
height = 10000;
ArrayTest a1 = new ArrayTest(width, height),
a2 = new ArrayTest(width, height);
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < loop; i++)
{
a1.DoMath(a2);
}
sw.Stop();
Console.WriteLine("Time taken: " + sw.ElapsedMilliseconds);
Console.ReadKey();
}
}
public class ArrayTest {
private int width, height;
private int[][] array;
public ArrayTest(int width, int height) {
this.width = width;
this.height = height;
array = new int[height][width];
Random rng = new Random();
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
array[i][j] = rng.nextInt(2048);
}
}
}
public int getWidth() {
return width;
}
public void setWidth(int width) {
this.width = width;
}
public int getHeight() {
return height;
}
public void setHeight(int height) {
this.height = height;
}
public int[][] getArray() {
return array;
}
public void doMath(ArrayTest a) {
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
array[i][j] *= a.getArray()[i][j];
}
}
}
}
public class Main {
public static void main(String[] args) {
// TODO Auto-generated method stub
final int loops = 10;
int width = 10000, height = 10000;
ArrayTest a1 = new ArrayTest(width, height),
a2 = new ArrayTest(width, height);
long start, end;
start = java.lang.System.currentTimeMillis();
for (int i = 0; i < loops; i++) {
a1.doMath(a2);
}
end = java.lang.System.currentTimeMillis();
System.out.println("Elapsed time: " + (float)(end - start));
}
}
Compiler Version Timing
-------- ------- ------
MSVS 2012 C# 5 4448.0
Eclipse Luna JRE 1.7 977.0