如果我在特定機器/作業系統上編譯代碼,該代碼在同一臺機器上運行會比在不同機器上運行得更好嗎?
在 Windows 上編譯的 java 應用程式是否可以在不同的作業系統上運行而沒有性能問題?如果是這樣,是否有一個作業系統更喜歡編譯并獲得最佳性能?
uj5u.com熱心網友回復:
Java 二進制檔案的性能取決于代碼本身和 JVM(Java 虛擬機)的實作。
想象一下 JVM 在你的計算機中是一臺計算機。所以不,它總是一樣的。這就是 Java 的優勢之一
uj5u.com熱心網友回復:
TL;DR:一般來說,沒有這樣的性能影響。使用你喜歡的編譯器在你喜歡的地方編譯。然后,在運行程式時,為這臺機器和作業系統選擇“最佳”JRE。
Java 編譯為位元組碼,這是一種抽象的高級機器語言。在許多情況下,很明顯必須發出哪些位元組碼指令來表示某行 Java 代碼。因此,不同 Java 編譯器的輸出通常非常相似,這就是為什么編譯器和編譯作業系統實際上并不重要。
如果有任何(微小)差異,它們適用于所使用的特定編譯器,并且不依賴于該編譯器運行的作業系統。
最大的性能影響來自 Java 運行時環境,因為該組件接受位元組碼輸入并(在與性能相關的情況下)將其轉換為機器指令(即時編譯)。這部分已經有了永久性的改進,因此與舊的 Java 1.5 相比,您可以期望在當前的 JRE 下,相同的編譯 Java 程式的性能要好得多。
運行代碼的作業系統幾乎與性能無關,因為它主要是執行的機器代碼,而不是作業系統庫呼叫。重要的是機器架構。因此,例如在基于 ARM 的機器上,您可能希望選擇與 x86 機器不同的 JRE 供應商。
uj5u.com熱心網友回復:
簡短的回答:不,位元組碼在你編譯代碼的作業系統上是相同的。但是,相同的位元組碼可能在不同的作業系統上執行得更快/更慢
長答案:

- 當您編譯 Java 源代碼時,您正在將其轉換為位元組碼。無論你在什么平臺上編譯,位元組碼都是一樣的。所以你的問題的答案是否定的,這并不是因為你在 Windows 上編譯你的 Java 代碼,它在 Windows 上的性能會更高。
- 在執行時,相同的位元組碼被饋送到特定于平臺的 JVM 實作。如果您在 Windows 上運行,JVM 會將位元組碼轉換為 Windows 可理解的指令并執行。其他作業系統也一樣
現在,您仍然需要考慮一些事情,即您的 Java 代碼在某些平臺上可能會變慢。
想象一下,您撰寫了一些代碼,應該從檔案系統中檢索一些檔案并讀取它。
我將使用一個關于在 Java 中讀取檔案的標準示例:
private String readFile(String fileName)
throws IOException {
StringBuilder builder = new StringBuilder();
try (BufferedReader bufferedReader = new BufferedReader(new FileReader(fileName))) {
builder.append(bufferedReader.readLine()).append(System.lineSeparator());
}
return builder.toString();
}
上面的代碼可以在任何平臺上運行。此外,無論您將其編譯到哪個平臺,生成的位元組碼都是相同的。
但是,當需要在特定平臺上運行它時,諸如在檔案系統中查找檔案、打開檔案以供讀取、流式傳輸位元組等操作嚴格取決于作業系統如何執行此操作。因此,相同的代碼片段可能在某些作業系統上執行得更快(因為在執行特定操作時,作業系統本身比另一個更快,或者因為 JVM 專門為此進行了優化,或者兩者兼而有之)。
具有諷刺意味的是,如果您的代碼在 Linux 上執行的操作比 Windows 更快,那么您可以在 Windows 上編譯您的代碼,并且在 Linux 上仍然比 Windows 本身更快。這應該讓您了解編譯和執行之間的不相關程度。
所以不,代碼不是更快/更慢,因為您在一個平臺而不是另一個平臺上編譯它。但是相同的代碼在特定作業系統上可能更快/更慢,因為它的作用以及低級操作是如何在目標 JVM 和目標作業系統中實作的
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/464452.html
