4 回答

TA貢獻1806條經驗 獲得超5個贊
添加一些分析/時間測量來確定。例如,在代碼中添加一個計時器,以測量 main 運行需要多長時間。并多次運行測試,因為進程的 CPU 時間在執行之間可能會有很大差異(因為操作系統正在執行其他操作等)
C 程序被編譯為本機機器代碼,與匯編密切相關。這意味著,程序(幾乎)被編譯為 CPU 已經知道如何執行的單獨指令。
Java 程序通常被編譯為中間字節碼,而不是本機機器代碼。CPU(很可能)不知道如何運行這些指令。運行Java程序需要啟動JVM,JVM會將這些字節碼指令翻譯為本機機器代碼,然后由CPU執行。加載 JVM 和翻譯代碼的這一步需要額外的時間,這超出了“主”函數運行的時間。
還需要考慮的是,Java 有一個垃圾收集器,除其他外,它可以防止資源泄漏。C 缺乏這一點,這意味著你必須自己管理資源。Java 垃圾收集器也需要時間來啟動,并且在執行期間可能會產生 CPU 時間開銷,具體取決于程序。
這里還有其他低級別和高級別的考慮因素,但這只是對于初學者來說......

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

TA貢獻1788條經驗 獲得超4個贊
另一個可能的原因是,當您啟動時,java
您需要將所有運行時加載到內存中。
也許嘗試檢測您的代碼來測量代碼的實際運行時間,而不是整個命令的執行時間,您可能會看到不同的結果。
C 可能仍然會更快,因為 Java 字節碼是在開始時解釋的。然而,對于很長的循環,有時,即時 (JIT) 編譯器可能會啟動,并且性能可能會變得與編譯語言相似。
Java 有時比 C 更快的其他原因是:在動態分配大量數據結構的程序中,Java 的垃圾收集器通常會將整批對象收集在一起,從而優化釋放內存所需的時間。另一方面,在 C 中,您必須free
手動調用,一次銷毀一個對象。這既是一件好事,因為你可以控制它何時發生,也是一件壞事,因為必須提出我提到的那種優化(自動垃圾收集也很好,因為無論如何它都會防止許多內存泄漏)。

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