亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么Java程序的執行時間比C語言中的相同程序要長?

為什么Java程序的執行時間比C語言中的相同程序要長?

holdtom 2023-11-01 16:45:12
所以我有兩個程序做同樣的事情,一個用 C 編寫,另一個用 Java 編寫。它們都創建 50 個線程并等待所有線程完成,然后終止。為了了解兩個程序之間的時間差,我在 Linux 中使用“time”命令來獲取執行時間。對于 C 程序,總執行時間為 0.020 秒,而 Java 版本則需要 0.663 秒才能完成。我嘗試尋找答案,但我發現的只是一些文章,例如(這 兩篇)說 Java 實際上比 C 更快,我認為這是無稽之談,所以如果有人能為我澄清這一點,我將非常感激。謝謝。這就是 C 代碼的樣子。#include<stdio.h>#include<pthread.h>#include<unistd.h>#define N 50void* tproc(void *arg) {    printf("Thread %d\n", *((int *) arg));    return NULL;}int main(int argc, char * argv[]) {    int i;    int targ[N];    pthread_t tid[N];    for(i = 0; i < N; i++) {    targ[i] = i;        if(pthread_create(&(tid[i]), NULL, &tproc, &targ[i]) != 0) {            printf("Can't create thread %d\n", i);            return 1;        }    }    for(i = 0; i < N; i++) {        if(pthread_join(tid[i], NULL) != 0) {            printf("Can't join thread %d\n", i);        }    }    return 0;}這就是 Java 代碼的樣子。import java.util.concurrent.*;class MyThread extends Thread {    static final int N = 50 ;    int arg;    public MyThread(int arg) {        this.arg = arg;    }    public void run() {       System.out.println("Thread " + arg);    }    public static void main(String [] args) {        MyThread[] tid = new MyThread [N] ;        for(int i = N-1; i >= 0; i--) {            tid[i] = new MyThread(i);            tid[i].start();        }        for(int i = 0; i < N; i++) {            try { tid[i].join(); }            catch(InterruptedException e) { }        }    }}
查看完整描述

4 回答

?
忽然笑

TA貢獻1806條經驗 獲得超5個贊

添加一些分析/時間測量來確定。例如,在代碼中添加一個計時器,以測量 main 運行需要多長時間。并多次運行測試,因為進程的 CPU 時間在執行之間可能會有很大差異(因為操作系統正在執行其他操作等)

C 程序被編譯為本機機器代碼,與匯編密切相關。這意味著,程序(幾乎)被編譯為 CPU 已經知道如何執行的單獨指令。

Java 程序通常被編譯為中間字節碼,而不是本機機器代碼。CPU(很可能)不知道如何運行這些指令。運行Java程序需要啟動JVM,JVM會將這些字節碼指令翻譯為本機機器代碼,然后由CPU執行。加載 JVM 和翻譯代碼的這一步需要額外的時間,這超出了“主”函數運行的時間。

還需要考慮的是,Java 有一個垃圾收集器,除其他外,它可以防止資源泄漏。C 缺乏這一點,這意味著你必須自己管理資源。Java 垃圾收集器也需要時間來啟動,并且在執行期間可能會產生 CPU 時間開銷,具體取決于程序。

這里還有其他低級別和高級別的考慮因素,但這只是對于初學者來說......


查看完整回答
反對 回復 2023-11-01
?
慕容708150

TA貢獻1831條經驗 獲得超4個贊

因為Java程序(實際上是編譯后的二進制文件,又名字節碼)運行在名為JVM的虛擬機之上,而本機二進制文件(例如,用你的措辭來說,C程序)運行在裸機上。JVM 將做相當多的工作來使虛擬“指令”能夠運行裸機,例如,解釋為原始且幼稚的實現,JIT 作為更復雜的措施。此外,當您的應用程序內存分配密集時,稱為垃圾收集(GC)的自動內存管理機制將顯著減慢虛擬機的速度。


查看完整回答
反對 回復 2023-11-01
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

另一個可能的原因是,當您啟動時,java您需要將所有運行時加載到內存中。

也許嘗試檢測您的代碼來測量代碼的實際運行時間,而不是整個命令的執行時間,您可能會看到不同的結果。

C 可能仍然會更快,因為 Java 字節碼是在開始時解釋的。然而,對于很長的循環,有時,即時 (JIT) 編譯器可能會啟動,并且性能可能會變得與編譯語言相似。

Java 有時比 C 更快的其他原因是:在動態分配大量數據結構的程序中,Java 的垃圾收集器通常會將整批對象收集在一起,從而優化釋放內存所需的時間。另一方面,在 C 中,您必須free手動調用,一次銷毀一個對象。這既是一件好事,因為你可以控制它何時發生,也是一件壞事,因為必須提出我提到的那種優化(自動垃圾收集也很好,因為無論如何它都會防止許多內存泄漏)。


查看完整回答
反對 回復 2023-11-01
?
PIPIONE

TA貢獻1829條經驗 獲得超9個贊

幾個原因:

  1. 編譯的 C 代碼(通常)在本機運行,而編譯的 Java 代碼(通常)在虛擬機(基本上是機器代碼級解釋器)中運行 - 在所有條件相同的情況下,本機代碼將比 VM 中的代碼運行得更快;

  2. 編譯的 Java 代碼執行許多編譯的 C 代碼不執行的運行時檢查(數組邊界檢查、空指針檢查等);

  3. Java 虛擬機對不再使用的堆分配對象執行定期垃圾收集 - C 根本不執行任何類型的自動內存管理;


查看完整回答
反對 回復 2023-11-01
  • 4 回答
  • 0 關注
  • 219 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號