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ō)......

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ī)的速度。

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)存泄漏)。

TA貢獻(xiàn)1829條經(jīng)驗(yàn) 獲得超9個(gè)贊
幾個(gè)原因:
編譯的 C 代碼(通常)在本機(jī)運(yùn)行,而編譯的 Java 代碼(通常)在虛擬機(jī)(基本上是機(jī)器代碼級(jí)解釋器)中運(yùn)行 - 在所有條件相同的情況下,本機(jī)代碼將比 VM 中的代碼運(yùn)行得更快;
編譯的 Java 代碼執(zhí)行許多編譯的 C 代碼不執(zhí)行的運(yùn)行時(shí)檢查(數(shù)組邊界檢查、空指針檢查等);
Java 虛擬機(jī)對(duì)不再使用的堆分配對(duì)象執(zhí)行定期垃圾收集 - C 根本不執(zhí)行任何類(lèi)型的自動(dòng)內(nèi)存管理;
添加回答
舉報(bào)