当前位置:  开发笔记 > 编程语言 > 正文

boolean []与BitSet:哪个更有效?

如何解决《boolean[]与BitSet:哪个更有效?》经验,为你挑选了3个好方法。

什么在内存和CPU使用方面更有效 - 一个booleans或BitSet 数组?不使用特定的BitSet方法,只对数组进行get/set/clear(==,=,Arrays.fill).



1> Peter Lawrey..:

Boolean[] 每个布尔值使用大约4-20个字节.

boolean[] 每个布尔值使用大约1个字节.

BitSet 每个布尔值使用大约1位.

内存大小可能不是一个问题,在这种情况下boolean []可能更容易编码.


请注意,BitSet中每个布尔值1位是渐近值.封面下使用了一个long [],因此它被颗粒化为64位块.
值得一提的是,通常每个值只需要4个字节的指针.因为它是缓存的.除非你明确使用new Boolean(); 但当然它不仅仅是布尔[]

2> starblue..:

从带有筛子的Sun JDK 1.6计算素数的一些基准测试(最好的10次迭代预热,给JIT编译器一个机会,并排除随机调度延迟,Core 2 Duo T5600 1.83GHz):

除了非常小的尺寸外,BitSet比boolean []更有效.数组中的每个布尔值都需要一个字节.来自runtime.freeMemory()的数字对BitSet来说有点混乱,但更少.

boolean []的CPU效率更高,除了非常大的大小,它们大约是偶数.例如,对于大小为1百万的布尔[]大约快四倍(例如6毫秒对27毫秒),十亿和一亿大约是偶数.


你可以发表你的考试吗?
这是一个误导性的答案,没有测试代码和特定的上下文.我鼓励任何读这篇文章的人在这里阅读其他答案并自己思考一下他们​​的具体情况.
我怀疑一些BitSet样式操作(和,或者不是)比BitSet更快,而不是数组.值得注意哪些操作更好.标题会误导所有人再也不会使用BitSet
@Utku可能是缓存的一种效果,因此要访问主内存,您还需要在写入字节时执行read-update-write。请注意,“ boolean []”更快的最大字节数为100万字节,这大概是可以放入高速缓存的大小。

3> 小智..:

在这里,您可以看到将boolean [] []三角矩阵与BitSet []三角矩阵进行比较的内存/时间基准。

我创建,设置和读取(size *(size-1)/ 2)值并比较内存使用情况和时间...

希望能有所帮助...

这里的代码...(只是一个很脏的测试代码,对不起;)

import java.util.BitSet;
import java.util.Date;

public class BooleanBitSetProfiler {

    Runtime runtime;
    int sum = 0;
    public void doIt() {

        runtime = Runtime.getRuntime();
        long[][] bitsetMatrix = new long[30][2];
        long[][] booleanMatrix = new long[30][2];
        int size = 1000;
        for (int i = 0; i < booleanMatrix.length; i++) {
            booleanMatrix[i] = testBooleanMatrix(size);
            bitsetMatrix[i] = testBitSet(size);
            size += 2000;
        }
        int debug = 1;
        for (int j = 0; j < booleanMatrix.length; j++){
            System.out.print(booleanMatrix[j][0] + ";");
        }
        System.out.println();
        for (int j = 0; j < booleanMatrix.length; j++){
            System.out.print(booleanMatrix[j][1] + ";");
        }
        System.out.println();
        for (int j = 0; j < bitsetMatrix.length; j++){
            System.out.print(bitsetMatrix[j][0] + ";");
        }
        System.out.println();
        for (int j = 0; j < bitsetMatrix.length; j++){
            System.out.print(bitsetMatrix[j][1] + ";");
        }
        System.out.println();
    }

    private long memory () {
        return runtime.totalMemory() - runtime.freeMemory();
    }
    private long[] testBooleanMatrix(int size) {
        runtime.gc();
        long startTime = new Date().getTime();
        long startMemory = memory();
        boolean[][] matrix = new boolean[size][];
        for (int i = 0; i < size; i++) {
            matrix[i] = new boolean[size - i - 1];
        }
        long creationMemory = memory();
        long creationTime = new Date().getTime();
        for (int i = 0; i < size; i++)  {
            for (int j = 0; j < matrix[i].length; j++) {
                matrix[i][j] = i % 2 == 0;
            }
        }
        long setMemory = memory();
        long setTime = new Date().getTime();
        for (int i = 0; i < size; i++)  {
            for (int j = 0; j < matrix[i].length; j++) {
                if (matrix[i][j]) sum++;
            }
        }
        long readTime = new Date().getTime();
        System.out.println("Boolean[][] (size " + size + ")");
        System.out.println("Creation memory " + printMem(creationMemory-startMemory) + ", set memory " + printMem(setMemory-startMemory));
        System.out.println("Creation time " + printTime(creationTime-startTime) + ", set time " + printTime(setTime - creationTime) + " read time " + printTime(readTime - setTime) + "\n");
        runtime.gc();
        return new long[]{(setMemory-startMemory)/(1024*1024), (readTime-startTime)};
    }
    private long[] testBitSet(int size) {
        runtime.gc();
        long startTime = new Date().getTime();
        long startMemory = memory();
        BitSet[] matrix = new BitSet[size];
        for (int i = 0; i < size; i++) {
            matrix[i] = new BitSet(size - i - 1);
        }
        long creationMemory = memory();
        long creationTime = new Date().getTime();
        for (int i = 0; i < size; i++)  {
            for (int j = 0; j < matrix[i].size(); j++) {
                matrix[i].set(j, (i % 2 == 0));
            }
        }
        long setMemory = memory();
        long setTime = new Date().getTime();
        for (int i = 0; i < size; i++)  {
            for (int j = 0; j < matrix[i].size(); j++) {
                if (matrix[i].get(j)) sum++;
            }
        }
        long readTime = new Date().getTime();
        System.out.println("BitSet[] (size " + size + ")");
        System.out.println("Creation memory " + printMem(creationMemory-startMemory) + ", set memory " + printMem(setMemory-startMemory));
        System.out.println("Creation time " + printTime(creationTime-startTime) + ", set time " + printTime(setTime - creationTime) + " read time " + printTime(readTime - setTime) + "\n");
        runtime.gc();
        return new long[]{(setMemory-startMemory)/(1024*1024), (readTime-startTime)};
    }

    private String printMem(long mem) {
        mem = mem / (1024*1024);
        return mem + "MB";
    }
    private String printTime(long milis) {
        int seconds = (int) (milis / 1000);
        milis = milis % 1000;
        return seconds > 0 ? seconds + "s " + milis + "ms" : milis + "ms";
    }
}

推荐阅读
刘美娥94662
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有