【问题标题】:Is java actually faster than C# in bubble sort? [closed]java 在冒泡排序中实际上比 C# 快吗? [关闭]
【发布时间】:2017-11-06 11:37:33
【问题描述】:

我想通过执行冒泡排序功能对 100000 条未排序的记录进行排序来检查 c# 或 java 是否更快。

对于 C#,我使用此代码进行冒泡排序:

        static void sort(int[] table)
    {
        int n = table.Length;
        do
        {
            for (int i = 0; i < n - 1; i++)
            {
                if (table[i] > table[i + 1])
                {
                    int tmp = table[i];
                    table[i] = table[i + 1];
                    table[i + 1] = tmp;
                }
            }
            n--;
        }
        while (n > 1);
    }

对于java来说,几乎是一样的:

static void sort(int[] table)
    {
        int n = table.length;
        do
        {
            for (int i = 0; i < n - 1; i++)
            {
                if (table[i] > table[i + 1])
                {
                    int tmp = table[i];
                    table[i] = table[i + 1];
                    table[i + 1] = tmp;
                }
            }
            n--;
        }
        while (n > 1);
    }

为了测量执行时间,我在 C# 中使用了Stopwatch 类:

Stopwatch sw = new Stopwatch();
            sw.Start();
            sort(arr);
            sw.Stop();

我在 Java 中找不到 Stopwatch 类,我使用此代码来测量 Java 中的执行时间:

 class ExecutionTimer {
  private long start;
  private long end;

  public ExecutionTimer() {
    start = System.nanoTime();
  }

  public void end() {
    end = System.nanoTime();
  }

  public float duration(){
    return (end-start);
  }

  public void reset() {
    start = 0;  
    end   = 0;
  }}

我在 C# 中运行算法 5 次,在 Java 中运行 5 次。在 C# 中平均执行时间为:40,13s,在 JAVA 中为:18,44s

为什么差距这么大?是因为我使用 StopWatch 在 C# 中测量时间吗? 在测试期间,我关闭了笔记本电脑上的所有程序、浏览器和防病毒软件。

谢谢。

【问题讨论】:

  • 你是否运行了带有调试器的 C# 版本?
  • 你是否在发布模式下编译了 C# 代码?
  • 我用调试模式运行它。
  • 运行调试版本会很慢。在附加调试器的情况下运行(即在 Visual Studio 中按 F5)会非常慢。运行不带调试器的发布版本(在 Visual Studio 中按 Ctrl+F5,或选择“不带调试器运行”)。如果您正在运行调试版本或附加了调试器,那么您的时间将会大大缩短。

标签: java c# sorting optimization


【解决方案1】:

如果 C# 运行速度比 java 慢,我不会感到惊讶,但这里的差异如此之大,因为您的测试方法不符合标准。

您不能只调用代码在时钟读数之间进行基准测试。您必须首先允许代码被 jit,通过多次运行它。在基准测试圈中,这被称为“预热”,对于编译成字节码(或 MSIL,在这种情况下可能是)然后在运行时即时编译的语言来说,这是必要的。

热身多少次才够?意见不一;我听说你必须运行它一次,我听说你必须运行它 10000 次。试试看你会得到什么。

【讨论】:

  • "Jitted" - 及时编译/解释
  • 为什么我必须“热身”?我在相同的条件下运行 C# 代码和 Java 代码——没有“预热”,在同一台电脑上,没有后台进程。然后,对我来说,java 更快,因为它不需要预热来更快地编译它。
  • 因为即时编译是一个您无法控制的巨大变量,因此您不希望它影响您的测量时间。如果不是出于其他原因,那么至少因为较慢的抖动可能会因为它产生更快的代码而变慢,但是如果与抖动的开销一起测量,更快的代码将受到不公平的惩罚。
  • @ElPolako Java 和 C# 都主要用于长时间运行的进程,这就是它们的优化目标。如果没有热身,您正在测量它们都没有任何好处的东西的速度。 +++ 所以即使 Java 快 100 倍,结果也没有任何意义。
猜你喜欢
  • 2011-01-21
  • 1970-01-01
  • 2021-08-15
  • 2018-03-28
  • 1970-01-01
  • 2017-01-30
  • 2013-02-02
  • 1970-01-01
  • 2018-05-18
相关资源
最近更新 更多