简介
素数运算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
" << millis << " milliscends
";
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 性能也不差太多。