zoukankan      html  css  js  c++  java
  • java bitset and C++ bitset

    简介

    素数运算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 性能也不差太多。

    参考链接

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

    Hope is a good thing,maybe the best of things,and no good thing ever dies.----------- Andy Dufresne
  • 相关阅读:
    斜率优化dp学习
    拓扑排序
    P2486 [SDOI2011]染色 区间合并+树链剖分(加深对线段树的理解)
    网络流24题!!!!
    费用流板子
    网络流dinic板子
    小花梨的数组
    C. 小花梨判连通
    splay树
    hdu4467 graph
  • 原文地址:https://www.cnblogs.com/eat-too-much/p/13889158.html
Copyright © 2011-2022 走看看