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\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的更多相关文章
- Java中BitSet使用(转)
java.util.BitSet,采用位运算: 官方API:http://docs.oracle.com/javase/7/docs/api/java/util/BitSet.html 摘要: Bit ...
- 一道面试题与Java位操作 和 BitSet 库的使用
前一段时间在网上看到这样一道面试题: 有个老的手机短信程序,由于当时的手机CPU,内存都很烂.所以这个短信程序只能记住256条短信,多了就删了. 每个短信有个唯一的ID,在0到255之间.当然用户可能 ...
- Java数据结构: java.util.BitSet源码学习
接着上一篇Blog:一道面试题与Java位操作 和 BitSet 库的使用,分析下Java源码中BitSet类的源码. 位图(Bitmap),即位(Bit)的集合,是一种常用的数据结构,可用于记录大量 ...
- java.util.BitSet 详细分析 学习笔记
1,BitSet类 大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的 ...
- Java BitSet解决海量数据去重
先提一个问题,怎么在40亿个整数中找到那个唯一重复的数字? 第一想法就是Set的不可重复性,依次把每个数字放入HashSet中,当放不去进去的时候说明这就是重复的数字,输出这个数字. if(hs.co ...
- Java Bitset
Bitset创建一种特殊的数组来保存非负整数的值 取值为true和false,初始都是false.Bitset初始化是一个long,65位,增加位数的话只能是64的整数倍. 如果用一个Bitset存储 ...
- 位集合(BitSet)| Java数据结构
Java Bitset类 BitSet使用示例: import java.util.BitSet; public class BitSetDemo { public static void main( ...
- java bitSet简单使用
package Contain; import java.util.BitSet; public class MyBitset { public static void main(String[] a ...
- java中的BitSet
(1)BitSet类 大小可动态改变, 取值为true或false的位集合.用于表示一组布尔标志. 此类实现了一个按需增长的位向量.位 set 的每个组件都有一个 boolean 值.用非负的 ...
- C++ Primer学习笔记2--c++标准库中的 vector、string 和 bitset 类型
一.string #include <string> using std::string 初始化函数: string s1; 默认构造函数 s1 为空串 ...
随机推荐
- 从 MySQL 获取数据,是从磁盘读取的吗?(buffer pool)
从 MySQL 获取数据,是从磁盘读取的吗?(Buffer Pool) 在 MySQL 中,数据是否从磁盘读取取决于数据是否已经被加载到内存中.MySQL 使用 InnoDB 存储引擎 中的 Buff ...
- php 微信小程序转义403
function code 微信 iv 偶现 encryptedData 41003 encodeURIComponent 关于小程序微信授权登录提示41003 文章简介 原因一(iv和encrypt ...
- 拿来即用的下载Excel模板
模板导出 拿来即用 @PostMapping("/templateExport") @ApiOperation(value = "模板导出", notes = ...
- 关于μkeil v5.40(keil5) 如何使用STM32(ARM)虚拟下载器进行Proteus联调
最近我心血来潮,想用Proteus+keil5进行联调,但仔细在网上一找,全是某SDN扒下来的陈年老黑X,都快转出数字包浆了还在用,完完全全跟不上时代,也全是51单片机的版本,STM32(ARM)根本 ...
- [已解决] Compilation error ptxas fatal : Value ‘sm_30‘ is not defined for option ‘gpu-name‘
在用cmake编译cuda程序时,总是报Compilation error ptxas fatal : Value 'sm_30' is not defined for option 'gpu-nam ...
- windows系统安装redis教程
redis官方特地开发了个windows版本,不过不更新维护.适合在本地测试项目 下载地址:https://github.com/microsoftarchive/redis/releases/tag ...
- AtCoder Beginner Contest 370 补题记录
A - Raise Both Hands 题意: 给出Snuke举的左右手情况,如果只举左手,输出Yes,如果只举右手,输出No,否则输出Invalid 思路: 举左手:(l == 1 &&a ...
- 明明是同一条SQL,为什么有时候走索引a,有时候却走索引b ?
前言 想象你是一家餐厅的服务员,面前有两个菜单: 菜单A:按菜品分类排列(前菜.主菜.甜点) 菜单B:按价格从低到高排列 当顾客说:"我要最便宜的川菜". 你会: 先用菜单B找到所 ...
- 理解 .NET 结构体字段的内存布局
目录 前言 基本概念 结构体的默认字段布局 对齐 64 位系统与 32 位系统的对齐要求差异 默认字段布局中 对齐要求 与 偏移量 的关系 填充 包含引用类型字段的结构体的默认字段布局 用 Struc ...
- ATM1.0面条版test
[一]功能概要 [1]注册 [2]登陆 [3]取款 [4]存款 [5]查看流水 [6]查看银行信息(查看自己的卡号.余额) [7]初始化银行信息 [8]退出 [二]功能需求 [1]注册 (1)身份信息 ...