简介

素数运算C++和java速度比较

C++ code

/*
 * @Author: your name
 * @Date: 2020-10-28 09:06:43
 * @LastEditTime: 2020-10-28 09:11:03
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /java/Sieve.cpp
 */
#include <bitset>
#include <iostream>
#include <ctime>

using namespace std;

int main(){
    const int N = 2000000;
    clock_t cstart = clock();

    bitset<N + 1> b;
    int count = 0;
    int i;
    for(i = 2; i <= N; i++){
        b.set(i);
    }
    i = 2;
    while(i * i <= N){
        if(b.test(i)){
            count++;
            int k = 2 * i;
            while(k <= N){
                b.reset(k);
                k += i;
            }
        }
        i++;
    }
    while(i <= N){
        if(b.test(i)){
            count++;
        }
        i++;
    }
    clock_t cend = clock();
    double millis = 1000.0 * (cend - cstart) / CLOCKS_PER_SEC;
    cout << count << " primes\n" << millis << " milliscends\n";
    return 0;
}

java code

import java.util.BitSet;

/*
 * @Author: your name
 * @Date: 2020-10-28 08:49:21
 * @LastEditTime: 2020-10-28 08:53:51
 * @LastEditors: Please set LastEditors
 * @Description: In User Settings Edit
 * @FilePath: /java/Sieve.java
 */
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;
        int i;
        for (i = 2; i <= n; i++) {
            b.set(i);
        }
        i = 2;
        while (i * i <= n) { // 遍历素数只要遍历一半即可
            if (b.get(i)) {
                count++;
                int k = 2 * i;
                while (k <= n) { // 将内部比如 2 的倍数,3的倍数全部清空 只有第一个2 和 3 保留
                    b.clear(k);
                    k += i;
                }
            }
            i++;
        }
        while (i <= n) {
            if (b.get(i))
                count++;
            i++;
        }
        long end = System.currentTimeMillis();
        System.out.println(count + " primes");
        System.out.println((end - start) + " milliseconds");
    }
}

性能对比

java输出

148933 primes
41 milliseconds

g++ 在不开启优化的输出

148933 primes
148.037 milliscends

g++ 在开启极限优化 Os 的输出

148933 primes
14.428 milliscends

g++ 开启O1

148933 primes
14.043 milliscends 比Os 要快

g++ 开启O2

148933 primes
12.026 milliscends # 更快

g++ O3

148933 primes
13.152 milliscends # 反而慢了

TIPS

g++ 命令
g++ -std=c++17 Sieve.cpp -o a -O3

综上所述

g++ 一般开启O2 就比较快了,没有必要开启O3,基本可以吊打java
java 性能也不差太多。

参考链接

https://www.cnblogs.com/kid-kid/p/12616788.html

posted on 2020-10-28 09:24  HDU李少帅  阅读(151)  评论(0编辑  收藏  举报