如何在C ++中使用compute the memory of new BitSet(n)
。
Java中的memory takes the new BitSet(1024)
。
但似乎Java的公式不同。我想计算new BitSet(100000)
花费的内存,请你帮忙吗?
答案 0 :(得分:5)
BitSet被打包成“单词”数组。一句话就是(在当前的实施中)很长。内部的单个位将被检索/设置使用掩蔽;因此,它在一个单独的长值内部打包64位,并使用长数组来保存所需的所有位。
数组的维数为N(100000)/ 64字节,或1563长,或12504字节,加上BitSet为其内部结构/ bookeeping所需的固定开销。
请参阅http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet.java了解实施情况;计算字段并总结他们需要的空间(一个int:4个字节;一个长:8个字节,依此类推)你可以理解固定开销是多少。
答案 1 :(得分:2)
它略大于100000/8,与C ++基本相同,假设N是位数。要准确测量它,你可以测试它。
public static void main(String... ignored) {
BitSet warmup = new BitSet(10000); // load the class etc.
long before = memoryUsed();
BitSet bs = new BitSet(100000);
long size = memoryUsed() - before;
if (size == 0)
throw new AssertionError("You need to run this with -XX:-UseTLAB for accurate accounting");
System.out.printf("BitSet(100000) used %,d bytes%n", size);
}
public static long memoryUsed() {
return Runtime.getRuntime().totalMemory() - Runtime.getRuntime().freeMemory();
}
在命令行上使用-XX:-UseTLAB
进行打印
BitSet(100000) used 12,544 bytes
创建了两个对象(BitSet和long []),它们与预期的差异很小。