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

Java 與 C++ 計算性能深度對比:以素數篩選為例

     編輯:程式設計綜合問答

測試場景

使用相同的埃拉托斯特尼篩法計算 1-2,000,000 之間的素數個數,對比 Java SE 8 與 TDM-GCC 4.9.2 的執行效率。

測試代碼

C++ 版本 (TDM-GCC 4.9.2)

#include <iostream>
#include <bitset>
#include <ctime>
using namespace std;

int main() {
    const int N = 2000000;
    clock_t cstart = clock();
    bitset<N + 1> b;
    int count = 0;
    
    // 初始化
    for(int i = 2; i <= N; i++) b.set(i);
    
    // 篩選
    for(int i = 2; i * i <= N; i++) {
        if(b.test(i)) {
            count++;
            for(int k = 2 * i; k <= N; k += i) b.reset(k);
        }
    }
    
    // 統計剩餘
    for(int i = (int)sqrt(N) + 1; i <= N; i++) 
        if(b.test(i)) count++;
    
    clock_t cend = clock();
    double millis = 1000.0 * (cend - cstart) / CLOCKS_PER_SEC;
    cout << count << " primes\n" << millis << " milliseconds\n";
    return 0;
}

Java 版本 (Java SE 8)

import java.util.BitSet;

public class Sieve {
    public static void main(String[] args) {
        int n = 2000000;
        long start = System.currentTimeMillis();
        BitSet b = new BitSet(n + 1);
        int count = 0;
        
        for(int i = 2; i <= n; i++) b.set(i);
        
        for(int i = 2; i * i <= n; i++) {
            if(b.get(i)) {
                count++;
                for(int k = 2 * i; k <= n; k += i) b.clear(k);
            }
        }
        
        for(int i = (int)Math.sqrt(n) + 1; i <= n; i++)
            if(b.get(i)) count++;
        
        long end = System.currentTimeMillis();
        System.out.println(count + " primes");
        System.out.println((end - start) + " milliseconds");
    }
}

測試結果分析

語言/編譯器執行時間相對性能
Java SE 8~40 ms基準 (1.0x)
TDM-GCC 4.9.2 (C++)~180 ms4.5x 慢

核心原因解析

  1. JIT 編譯優化: JVM 運行時根據熱點代碼動態優化,生成高效機器碼
  2. 位操作優化: Java BitSet 內部使用長整型數組,JVM 可優化為 SIMD 指令
  3. 邊界檢查消除: JIT 編譯器能證明循環邊界安全,移除數組越界檢查
  4. GCC 優化局限: 靜態編譯無法根據運行數據進行專門化優化

結論

在這類計算密集型、數據結構固定的場景中,現代 JVM 的動態優化能力可超越傳統靜態編譯器。但這不代表 Java 在所有場景都優於 C++,C++ 在內存佈局控制、確定性延遲、系統級開發仍有不可替代優勢。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved