首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Java 獲取程序運行時間而非編譯時間:System.currentTimeMillis() 正確用法

     編輯:程式設計綜合問答

概念澄清

  • 編譯時間:源碼 -> 字節碼 的過程耗時,屬於構建階段,運行時無法直接獲取。
  • 運行時間 / 執行時間:程序運行過程中某段代碼的耗時,這是開發者通常關心的「性能測量」。

測量代碼執行耗時 (毫秒級)


long start = System.currentTimeMillis();
// 待測試代碼
// ...
long end = System.currentTimeMillis();
long elapsedMs = end - start;
System.out.println("耗時: " + elapsedMs + " ms");

高精度測量 (納秒級,推薦)


long start = System.nanoTime();
// 待測試代碼
// ...
long end = System.nanoTime();
long elapsedNs = end - start;
double elapsedMs = elapsedNs / 1_000_000.0;
System.out.printf("耗時: %.3f ms%n", elapsedMs);

nanoTime() 返回 JVM 高精度時間源,**無關系統時鐘**,專為測量間隔設計,不受系統時間調整影響。

進階:JMH 基準測試 (生產級性能分析)

手動計時受 JIT 編譯、GC、CPU 頻率縮放等干擾大。標準做法使用 JMH (Java Microbenchmark Harness):


@BenchmarkMode(Mode.AverageTime)
@OutputTimeUnit(TimeUnit.NANOSECONDS)
@Warmup(iterations = 5, time = 1, timeUnit = TimeUnit.SECONDS)
@Measurement(iterations = 10, time = 1, timeUnit = TimeUnit.SECONDS)
@Fork(3)
@State(Scope.Benchmark)
public class MyBenchmark {
    @Benchmark
    public void testMethod() {
        // 待測代碼
    }
}

Maven 依賴:



    org.openjdk.jmh
    jmh-core
    1.37


    org.openjdk.jmh
    jmh-generator-annprocess
    1.37

獲取構建時間 (編譯/打包時間) 的替代方案

若確需在運行時知道「構建時間」,可在構建腳本中寫入資源文件:

  • Maven: maven-resources-plugin 過濾 build.properties 寫入 ${maven.build.timestamp}。
  • Gradle: processResources 任務中 expand(buildTime: new Date())。
  • 運行時讀取該屬性文件即可。

總結

  • 測量代碼執行耗時:**System.nanoTime()** (高精度) 或 currentTimeMillis() (粗略)。
  • 嚴謹性能分析:**使用 JMH**。
  • 獲取構建時間:**構建腳本注入屬性文件**,非運行時 API。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved