• 请不要在回答技术问题时复制粘贴 AI 生成的内容
xpol
V2EX  ›  程序员

为什么 leetcode 上面 Java 跑得比 C/C++ 快?

  •  
  •   xpol · Jul 7, 2016 · 10777 views
    This topic created in 3780 days ago, the information mentioned may be changed or developed.

    如下图:

    Imgur

    最快的居然是 Java ?为什么呢?

    我猜想可能是这几个方面:

    1. 由于 GC 机制, Java 没有内存释放的时间消耗
    2. 或者 leetcode 跑 Java 代码的虚拟机一直运行着的,没有启动开销
    Supplement 1  ·  Jul 7, 2016

    补充一下,我说的是 第二题,这是我的C++代码:

    /**
     * Definition for singly-linked list.
     * struct ListNode {
     *     int val;
     *     ListNode *next;
     *     ListNode(int x) : val(x), next(NULL) {}
     * };
     */
    class Solution {
    public:
        ListNode* addTwoNumbers(ListNode* l1, ListNode* l2) {
            auto carry = 0;
    
            ListNode* p1 = l1;
            ListNode* p2 = l2;
            ListNode* last = l1;
            while (p1 != nullptr && p2 != nullptr) {
                auto v = p1->val + p2->val + carry;
                carry = v/10;
                p1->val = v%10;
                last = p1;
                p1 = p1->next;
                p2 = p2->next;
            }
            ListNode* left = p1 != nullptr ? p1 : p2;
            last->next = left;
    
            while (left != nullptr) {
                auto v = left->val + carry;
                carry = v/10;
                left->val = v%10;
                last = left;
                left = left->next;
            }
            if (carry > 0) {
                last->next = l2;
                l2->val = carry;
                l2->next = nullptr;
            }
            
            return l1;
        }
    };
    

    为了跑快一点,我还重用了输入参数的内存,用来生产输出的链表。 我这在C++提交里面算是快的了。

    不是我对Java的运行速度有偏见,我只是想弄清楚,为什么大多数 Java 提交都几乎比所有的 C/C++ 快。

    到底快的原因是什么?

    26 replies  •  2016-07-08 07:00:50 +08:00
    dangbiao1991
    dangbiao1991
    Jul 7, 2016
    1
    你这只能表明本题提交的解法里, Java 代码性能大体比 C/C++ 好。
    我见到的其它题目并不是这样的。
    domty
    domty
    Jul 7, 2016
    2
    你是怎么比较的。
    以我的经验,其实和代码的质量还是有关系的。

    同一个问题,我用 c 写的和 python 写的,运行时间 python 大概是 c 的 10 分之一。
    大概是我写的 c 太烂了 /手动 doge
    3dwelcome
    3dwelcome
    Jul 7, 2016 via Android
    3
    Java 又不差的、都是 jit,cpp 没大优势。
    hard2reg
    hard2reg
    Jul 7, 2016
    4
    为什么总有人喜欢比较语言之间的速度
    felixzhu
    felixzhu
    Jul 7, 2016
    5
    发现讨论这个的还挺多的,估计是 leetcode 没太在意这个
    https://discuss.leetcode.com/topic/14927/why-are-c-java-so-slow-different-test-cases/2
    skydiver
    skydiver
    Jul 7, 2016
    6
    不同语言的统计口径都不一样,没法比较
    shyling
    shyling
    Jul 7, 2016
    7
    java 就是启动慢点内存占用多点,速度还行啊。。而且不容易写太差的代码。。不过 2L python 比 c 快 10 倍让我吃了一惊
    Marfal
    Marfal
    Jul 7, 2016
    8
    @hard2reg 为什么不?
    BlueMeow
    BlueMeow
    Jul 7, 2016
    9
    现在的 Java 本来就很快,而且有各种高度优化的库可以用
    YORYOR
    YORYOR
    Jul 7, 2016
    10
    @BlueMeow leetcode 上只能用一些基本的库吧
    Sorrow
    Sorrow
    Jul 7, 2016
    11
    这和 leetcode 的测试方法有关。
    你可以在本地测试同样的算法, Java 几乎不可能体现出图中这么明显的差距,特别是在 C++ 开了优化的情况下。
    wd85318
    wd85318
    Jul 7, 2016
    12
    Java 是香港记者?
    hpeng
    hpeng
    Jul 7, 2016
    13
    你需要控制变量法.
    BlueMeow
    BlueMeow
    Jul 7, 2016
    14
    @YORYOR Java 基本类库已经是多年针对 JVM 高度优化的,速度快很正常
    digitv
    digitv
    Jul 7, 2016
    15
    测试代码是啥都不知道,你要写个求 1+1=多少的代码,任何语言都有可能比 C/C++快啊
    wzxjohn
    wzxjohn
    Jul 7, 2016
    16
    吐槽算法的来看看这题:
    https://leetcode.com/problems/add-digits/
    wzxjohn
    wzxjohn
    Jul 7, 2016
    17
    @dynastysea 真的假的, JVM 启动时间不算?
    2225377fjs
    2225377fjs
    Jul 7, 2016
    18
    如果去掉 JVM 启动时间,而且纯做运算,不涉及大量的系统调用,带 JIT 的语言运行速度跟本地编译语言并不会多大差距,反而类似于 Java 这些,因为本身有质量非常高的类库,在实现一些算法,数据结构的时候可能还会有优势。
    hpeng
    hpeng
    Jul 7, 2016
    19
    你可以省下一个 while 哦
    Sorrow
    Sorrow
    Jul 7, 2016❤️2
    20
    作了一个简单的测试,你的代码在 leetcode 上运行时间大概是 40ms 左右,一份普通的 Java 代码运行时间大概是 4ms, 相差一个数量级。我在本地写了一些测试样例,用你的代码和 Java 比较, C++ 运行时间大概 20ms(不开优化), Java 大概在 35ms 左右, 是 Java 和 C++ 的正常差距。

    楼上的人完全没有意识到在这个问题下其实任何测试样例都不可能让 C++ 和 Java 产生数量级的差距(如图中分布的那样, Java 和 C++ 大概相差一个数量级),所以这必然是 Leetcode 测试方法的问题。
    Sorrow
    Sorrow
    Jul 7, 2016
    21
    至于 Java 为什么是最快的,和楼上几位说的 JVM 优化好之类的是没什么关系的。主要还是因为 Leetcode 对各种语言测试里, Java 最接近真实的速度。不太了解 Leetcode 具体测试方法,我猜测应该是其他语言的测试时间计算存在某些缺陷,而只有 Java 是纯粹的运行时间。
    wph95
    wph95
    Jul 7, 2016
    22
    作为一个天天写 sandbox 维护 oj 的蒟蒻
    支持楼上 sorrow 的猜测。
    因为 java 在多数 online judge 是特殊对待的。
    因为 JVM 启动时间相对来说太慢了。 所以有个补时。

    也有可能是 jvm 虚拟机一直运行。
    BlueMeow
    BlueMeow
    Jul 7, 2016
    23
    @Sorrow Java 是后来调整过的,本来(一年前多吧)就数它最慢了(当时好像还没有 JS )。既然经过调整,也许就是因为之前的统计方式不太合理。
    chiu
    chiu
    Jul 7, 2016
    24
    我目前写过的基本是 C 最快
    testlc
    testlc
    Jul 7, 2016
    25
    这个问题在知乎上面有吧
    billwsy
    billwsy
    Jul 8, 2016 via iPhone
    26
    看到除和取余…
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   2458 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 64ms · UTC 12:23 · PVG 20:23 · LAX 04:23 · JFK 07:23
    ♥ Do have faith in what you're doing.