【问题标题】:Java vs C (Run time) EDIT: Added Code [closed]Java vs C(运行时)编辑:添加代码[关闭]
【发布时间】:2014-09-02 18:27:27
【问题描述】:

我刚刚编写了一个程序,可以找到所有有上限的素数。

算法:埃拉托色尼筛法。

用 C 和 Java 编写。上限为 666014。

出于某种原因,C 会在超过 2.5 秒的时间内给出结果,而 Java 会在半秒内完成。

详情:

  • C 中的数组是 char 类型

  • Java 中的数组是布尔类型

C IDE:代码块

Java IDE:IntellijIdea 社区版

C 代码:

#include <stdio.h>

int main() {

    int n = 666013;
    int i;
    int k;

    char a[n];

    for (i = 2; i <= n; i++)
        a[i] = 0;

    for (i = 2; i <= n; i++)
         if ( a[i] == 0 )
         {
            printf("%d\n", i);
            for (k = i + i; k <= n; k += i)
                 a[k] = 1;
         }

    return 0;

}

Java 代码:

package primes;

public class Prime {

    public static void main(String[] args) {
        long starttime = System.nanoTime();
        final int MAXN = 666013;
        boolean a[] = new boolean[MAXN];

        for (int i = 2; i < a.length; i++)
            a[i] = true;

        for (int i = 2; i < a.length; i++)
            if (a[i])
            {
                System.out.println(i);
                System.out.printf("");
                for (int j = i + i; j < a.length; j += i) {
                    a[j] = false;
                }
            }

        System.out.println(System.nanoTime() - starttime);

    }
}

上次编辑:使用 System.nanoTime() Java 给出 0.35 秒

C 算法再快不过了。 Java在这里更快的原因是什么?

【问题讨论】:

  • 您有问题吗?
  • 示例代码在哪里?
  • 根据您的标题,您在什么意义上谈论编译时间?
  • 如果您分享一些 Java 版本和 C 版本的代码示例,将会很有帮助。仅提及您使用的数组不是很有帮助,因为您甚至没有指定数组的用途。
  • For some reason C gives the result in more than 2.5 seconds 那么您是在告诉我们您的C 编码技能达不到标准吗?

标签: java c intellij-idea codeblocks


【解决方案1】:

我敢打赌,尽管您在问题标题中列出了编译时间,但您实际上是在询问运行时间。如果您尝试对编译进行计时,那么它真的很适合橘子,尤其是当您在 IDE 中而不是使用命令行时。

如果您将 Java 应用程序与 C++ 应用程序进行比较,您必须考虑很多事情。

  • 您应该使用相同的数据类型。
  • 您必须确保您的 Java 代码不会触发额外的装箱。
  • 您应该阅读这两种语言并了解如何使用最准确的低级系统计时器。例如,System.currentTimeMillis() 在 Java 中不是很准确。
  • 您应确保在将其输出之前测量您的时间,以免在测试中测量两种语言的输出差异。
  • 您是否在两种语言中运行相同的体系结构? (32 位或 64 位)。

坦率地说,您的评估非常依赖于代码。如果不显示代码,人们将无法帮助您。即使是最简单的代码,您也可以做很多很多事情来影响计时。

【讨论】:

  • 只是为了说明,System.currentTimeMillis() 比 nanoTime() 更准确
  • 为什么是出于好奇?我想我记得 Joshua Bloch 的有效 Java 中说 currentTimeMillis() 不准确,但我现在没有工作中的书要检查。我可能记错了文字。
  • 此链接可能有用:stackoverflow.com/questions/351565/…
  • 那本书是在另一个标签页中打开的。干杯:)
  • 啊,不错的链接 :) 对答案的 28 票评论很有帮助。这是一本很棒的书,我之所以买它是因为它以 Effective C++ 为蓝本,这也很棒。 :D
猜你喜欢
  • 2021-11-17
  • 1970-01-01
  • 2014-06-16
  • 2020-08-08
  • 1970-01-01
  • 1970-01-01
  • 2020-12-11
  • 1970-01-01
  • 2013-11-04
相关资源
最近更新 更多