简介

素数运算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

java bitset and C++ bitset的更多相关文章

  1. Java中BitSet使用(转)

    java.util.BitSet,采用位运算: 官方API:http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html 摘要: Bit ...

  2. 一道面试题与Java位操作 和 BitSet 库的使用

    前一段时间在网上看到这样一道面试题: 有个老的手机短信程序,由于当时的手机CPU,内存都很烂.所以这个短信程序只能记住256条短信,多了就删了. 每个短信有个唯一的ID,在0到255之间.当然用户可能 ...

  3. Java数据结构: java.util.BitSet源码学习

    接着上一篇Blog:一道面试题与Java位操作 和 BitSet 库的使用,分析下Java源码中BitSet类的源码. 位图(Bitmap),即位(Bit)的集合,是一种常用的数据结构,可用于记录大量 ...

  4. java.util.BitSet 详细分析 学习笔记

    1,BitSet类    大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志.   此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的 ...

  5. Java BitSet解决海量数据去重

    先提一个问题,怎么在40亿个整数中找到那个唯一重复的数字? 第一想法就是Set的不可重复性,依次把每个数字放入HashSet中,当放不去进去的时候说明这就是重复的数字,输出这个数字. if(hs.co ...

  6. Java Bitset

    Bitset创建一种特殊的数组来保存非负整数的值 取值为true和false,初始都是false.Bitset初始化是一个long,65位,增加位数的话只能是64的整数倍. 如果用一个Bitset存储 ...

  7. 位集合(BitSet)| Java数据结构

    Java Bitset类 BitSet使用示例: import java.util.BitSet; public class BitSetDemo { public static void main( ...

  8. java bitSet简单使用

    package Contain; import java.util.BitSet; public class MyBitset { public static void main(String[] a ...

  9. java中的BitSet

    (1)BitSet类     大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的 ...

  10. C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型

    一.string    #include <string>  using std::string    初始化函数:    string s1;        默认构造函数 s1 为空串 ...

随机推荐

  1. Docker光速入门

    1.docker是什么,能干什么 Docker 是一个开源的应用容器引擎,基于Go语言并遵从Apache2.0协议开源. Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级.可移植的容器中 ...

  2. 代码随想录第二十一天 | Leecode 669. 修剪二叉搜索树、108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树

    Leecode 669. 修剪二叉搜索树 题目描述 给你二叉搜索树的根节点 root ,同时给定最小边界low 和最大边界 high.通过修剪二叉搜索树,使得所有节点的值在[low, high]中.修 ...

  3. 代码随想录第二十天 | Leecode 235. 二叉搜索树的最近公共祖先 、 701.二叉搜索树中的插入操作 、450.删除二叉搜索树中的节点

    Leecode 235. 二叉搜索树的最近公共祖先 题目描述 给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:"对于有根树 T 的两个结点 p. ...

  4. js技术之获取当前元素的上一个/下一个兄弟级元素等元素的方法(获取上一个/下一个input)

    一.说明 jQuery获取: jQuery.parent(expr),找父亲节点,可以传入expr进行过滤,比如$("span").parent()或者$("span&q ...

  5. 后缀数组(SA)

    后缀数组 P3809 [模板]后缀排序 定义: 对给定字符串的所有后缀排序后得到的sa.rk数组 sa[i]->排名为i的后缀的位置 rk[i]->位置为i的后缀的排名 容易发现,sa与r ...

  6. openstack-Train部署文档

    部署参考资料:1,环境准备https://blog.csdn.net/m0_61777116/article/details/123702147阿里yum源https://blog.csdn.net/ ...

  7. JS 原型链查找

    我们都知道面向对象语言如 Java, C++ 等都基本实现了 封装, 继承, 多态 等特性, 用面向对象语言来编程的基本套路就是抽象出类, 然后实例化, 用实例调用方法来模拟进行程序间的通信. 但 J ...

  8. 进程间通信-POSIX 共享内存

    POSIX 共享内存 POSIX 共享内存是一种在 Linux 系统上使用的共享内存机制,它允许多个进程可以访问同一个内存区域,从而实现进程间的数据共享.共享内存是可用IPC机制中最快的,使用共享内存 ...

  9. 电脑tips #持续更新ing

    记录日常get 1. Esc+ Fn 打开与锁住F1到F12功能键们 2. 没有找到支持的视频格式和MIME类型 场景:发生在网页嵌入的视频中 原因及解决:--网速不好,重新刷新解决 3. 问题描述: ...

  10. 服务器接口附件限制【1M】解决办法

     一.业务场景:         在后端与手机小程序端接口传附件时,发现经过云服务器的接口交互,附件超过1M就会有如下提示: <html> <head><title> ...