第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

為什么Java程序的執(zhí)行時(shí)間比C語(yǔ)言中的相同程序要長(zhǎng)?

為什么Java程序的執(zhí)行時(shí)間比C語(yǔ)言中的相同程序要長(zhǎng)?

holdtom 2023-11-01 16:45:12
所以我有兩個(gè)程序做同樣的事情,一個(gè)用 C 編寫(xiě),另一個(gè)用 Java 編寫(xiě)。它們都創(chuàng)建 50 個(gè)線(xiàn)程并等待所有線(xiàn)程完成,然后終止。為了了解兩個(gè)程序之間的時(shí)間差,我在 Linux 中使用“time”命令來(lái)獲取執(zhí)行時(shí)間。對(duì)于 C 程序,總執(zhí)行時(shí)間為 0.020 秒,而 Java 版本則需要 0.663 秒才能完成。我嘗試尋找答案,但我發(fā)現(xiàn)的只是一些文章,例如(這 兩篇)說(shuō) Java 實(shí)際上比 C 更快,我認(rèn)為這是無(wú)稽之談,所以如果有人能為我澄清這一點(diǎn),我將非常感激。謝謝。這就是 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貢獻(xiàn)1806條經(jīng)驗(yàn) 獲得超5個(gè)贊

添加一些分析/時(shí)間測(cè)量來(lái)確定。例如,在代碼中添加一個(gè)計(jì)時(shí)器,以測(cè)量 main 運(yùn)行需要多長(zhǎng)時(shí)間。并多次運(yùn)行測(cè)試,因?yàn)檫M(jìn)程的 CPU 時(shí)間在執(zhí)行之間可能會(huì)有很大差異(因?yàn)椴僮飨到y(tǒng)正在執(zhí)行其他操作等)

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

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

還需要考慮的是,Java 有一個(gè)垃圾收集器,除其他外,它可以防止資源泄漏。C 缺乏這一點(diǎn),這意味著你必須自己管理資源。Java 垃圾收集器也需要時(shí)間來(lái)啟動(dòng),并且在執(zhí)行期間可能會(huì)產(chǎn)生 CPU 時(shí)間開(kāi)銷(xiāo),具體取決于程序。

這里還有其他低級(jí)別和高級(jí)別的考慮因素,但這只是對(duì)于初學(xué)者來(lái)說(shuō)......


查看完整回答
反對(duì) 回復(fù) 2023-11-01
?
慕容708150

TA貢獻(xiàn)1831條經(jīng)驗(yàn) 獲得超4個(gè)贊

因?yàn)镴ava程序(實(shí)際上是編譯后的二進(jìn)制文件,又名字節(jié)碼)運(yùn)行在名為JVM的虛擬機(jī)之上,而本機(jī)二進(jìn)制文件(例如,用你的措辭來(lái)說(shuō),C程序)運(yùn)行在裸機(jī)上。JVM 將做相當(dāng)多的工作來(lái)使虛擬“指令”能夠運(yùn)行裸機(jī),例如,解釋為原始且幼稚的實(shí)現(xiàn),JIT 作為更復(fù)雜的措施。此外,當(dāng)您的應(yīng)用程序內(nèi)存分配密集時(shí),稱(chēng)為垃圾收集(GC)的自動(dòng)內(nèi)存管理機(jī)制將顯著減慢虛擬機(jī)的速度。


查看完整回答
反對(duì) 回復(fù) 2023-11-01
?
尚方寶劍之說(shuō)

TA貢獻(xiàn)1788條經(jīng)驗(yàn) 獲得超4個(gè)贊

另一個(gè)可能的原因是,當(dāng)您啟動(dòng)時(shí),java您需要將所有運(yùn)行時(shí)加載到內(nèi)存中。

也許嘗試檢測(cè)您的代碼來(lái)測(cè)量代碼的實(shí)際運(yùn)行時(shí)間,而不是整個(gè)命令的執(zhí)行時(shí)間,您可能會(huì)看到不同的結(jié)果。

C 可能仍然會(huì)更快,因?yàn)?Java 字節(jié)碼是在開(kāi)始時(shí)解釋的。然而,對(duì)于很長(zhǎng)的循環(huán),有時(shí),即時(shí) (JIT) 編譯器可能會(huì)啟動(dòng),并且性能可能會(huì)變得與編譯語(yǔ)言相似。

Java 有時(shí)比 C 更快的其他原因是:在動(dòng)態(tài)分配大量數(shù)據(jù)結(jié)構(gòu)的程序中,Java 的垃圾收集器通常會(huì)將整批對(duì)象收集在一起,從而優(yōu)化釋放內(nèi)存所需的時(shí)間。另一方面,在 C 中,您必須free手動(dòng)調(diào)用,一次銷(xiāo)毀一個(gè)對(duì)象。這既是一件好事,因?yàn)槟憧梢钥刂扑螘r(shí)發(fā)生,也是一件壞事,因?yàn)楸仨毺岢鑫姨岬降哪欠N優(yōu)化(自動(dòng)垃圾收集也很好,因?yàn)闊o(wú)論如何它都會(huì)防止許多內(nèi)存泄漏)。


查看完整回答
反對(duì) 回復(fù) 2023-11-01
?
PIPIONE

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊

幾個(gè)原因:

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

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

  3. Java 虛擬機(jī)對(duì)不再使用的堆分配對(duì)象執(zhí)行定期垃圾收集 - C 根本不執(zhí)行任何類(lèi)型的自動(dòng)內(nèi)存管理;


查看完整回答
反對(duì) 回復(fù) 2023-11-01
  • 4 回答
  • 0 關(guān)注
  • 213 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)