如何在 C++中计算内存。new BitSet(n)
在 Java中需要什么内存。new BitSet(1024)
但似乎 Java 的公式不同。我想计算花费的内存new BitSet(100000)
,你能帮忙吗?
如何在 C++中计算内存。new BitSet(n)
在 Java中需要什么内存。new BitSet(1024)
但似乎 Java 的公式不同。我想计算花费的内存new BitSet(100000)
,你能帮忙吗?
BitSet 被打包成“单词”数组。一个词(在当前的实现中)很长。内部的单个位将被检索/设置使用掩码;因此,它在内部将 64 位打包在一个 long 值中,并使用一个 long 数组来保存您需要的所有位。
数组的维度将是 N (100000) / 64 字节,或 1563 个长整数,或 12504 字节,加上 BitSet 内部结构/记账所需的固定开销。
见http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6-b14/java/util/BitSet.java的实现;计算字段并总结它们需要的空间(一个 int:4 个字节;一个 long:8 个字节,依此类推),您可以了解固定开销是多少。
它比 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[]),这与预期的差异很小。