2016-04-09 4 views
-3

Es ist ein Problem von leetcode.Program ist einfach. Aber ich bin verwirrt, warum Java viel schneller als C++ mit der gleichen Logik läuft? Java-Codes:Warum läuft Java viel schneller als C++ in "Remove Duplicates from Sorted List"?

public ListNode deleteDuplicates(ListNode head) { 
    if (head == null || head.next == null) return head; 

    ListNode runner = head; 
    while (runner.next != null) { 
     if (runner.val == runner.next.val) { // duplicate values, make the next as next.next 
      runner.next = runner.next.next; 
     } else { // otherwise, advance runner to runner.next 
      runner = runner.next; 
     } 
    } 

    return head; 
} 

C++ Code:

ListNode* deleteDuplicates(ListNode* head) { 
    if(head == NULL || head->next == NULL){ 
     return head; 
    } 
    ListNode* index = head; 

    while(index->next != NULL){ 
     if(index->val == index->next->val){ 
      index->next = index->next->next; 
     }else{ 
      index = index->next; 
     } 
    } 
    return head; 
} 

Java Kosten 1ms: https://leetcode.com/discuss/95026/1ms-java-clean-solution

C++ Kosten 12ms: https://leetcode.com/submissions/detail/58563979/

+0

Was ist der Typ von "val"? In Java kopieren Sie einfach einen Verweis auf "val", während Sie in C++ das gesamte Objekt kopieren. Dies könnte der Schlüssel zum Laufzeitunterschied sein. –

+0

Wir haben keine Ahnung, welcher Compiler verwendet wurde, ob Optimierungen verwendet wurden, was der echte Code eigentlich ist (nur Schnipsel), keine Testdaten, nichts. Wir haben nur einen Link zu etwas, das "Leetcode" genannt wird, und ihre Ansprüche. – PaulMcKenzie

+0

Und sind Sie sicher, dass 'runner.val == runner.next.val' wirklich das leistet, was Sie von Java erwarten? Es vergleicht die Referenzen, nicht ihre Werte. –

Antwort

3

Ich würde keine Benchmark-Lauf für weniger vertrauen als ein paar Sekunden.

Hinweis: Javas dynamischer Compiler ist normalerweise besser als C++, wenn toter Code, d. H. Code, der nicht verwendet wird, entfernt wird. Ich würde sicherstellen, dass Ihr Test echte Arbeit leistet und nicht nur verworfen wird.

Kurz gesagt, Java ist oft schneller für Benchmarks, die nichts nützliches tun.

Verwandte Themen