免责声明:我意识到我可以在
Java的运行时生成这个,在性能测试一些代码时,需要一个非常特殊的情况.我发现了一种不同的方法,所以现在这只是一个比任何实际的好奇心.
我已经尝试过将以下内容作为一个静态字段,作为一个实例字段,并直接在构造函数中初始化.每次eclipse通知我“构造函数TestData()的代码超过65535字节限制”或“静态初始化程序的代码超过65535字节限制”.
有10000个整数.如果每个int是4个字节(32bits),那么那不会是40,000个字节?除了仅仅构建阵列的数据之外,还有更多的这个25,0000字节的开销吗?
这个数据是用这个小的python生成的:
#!/usr/bin/python import random; print "public final int[] RANDOM_INTEGERS = new int[] {"; for i in range(1,10000): print str(int(random.uniform(0,0x7fffffff))) + ","; print "};";
这是一个小样本:
public final int[] RANDOM_INTEGERS = new int[] { 963056418,460816633,1426956928,1836901854,334443802,721185237,488810483,1734703787,1858674527,112552804,1467830977,1533524842,1140643114,1452361499,716999590,652029167,1448309605,1111915190,1032718128,1194366355,112834025,419247979,944166634,205228045,1920916263,1102820742,1504720637,757008315,67604636,1686232265,597601176,1090143513,205960256,1611222388,1997832237,1429883982,1693885243,1987916675,159802771,1092244159,1224816153,1675311441,1873372604,1787757434,1347615328,1868311855,1401477617,508641277,1352501377,1442984254,1468392589,1059757519,1898445041,1368044543,513517087,99625132,1291863875,654253390,169170318,2117466849,1711924068,564675178,208741732,1095240821,1993892374,87422510,1651783681,1536657700,1039420228,674134447,1083424612,2137469237,1294104182,964677542,1506442822,1521039575,64073383,929517073,206993014,466196357,1139633501,1692533218,1934476545,2066226407,550646675,624977767,1494512072,1230119126,1956454185,1321128794,2099617717,//.... to 10,0000 instances
解决方法
以下是使用{1000001,1000002,1000003}初始化数组的字节码:
5 iconst_3 6 newarray int [10] 8 dup 9 iconst_0 10 ldc <Integer 1000001> [12] 12 iastore 13 dup 14 iconst_1 15 ldc <Integer 1000002> [13] 17 iastore 18 dup 19 iconst_2 20 ldc <Integer 1000003> [14] 22 iastore 23 putfield net.jstuber.test.TestArrayInitializingConstructor.data : int[] [15]
所以对于这个小数组,每个元素需要5个字节的Java字节码.对于更大的数组,数组索引和常量池中的索引将为大多数元素使用3个字节,这导致每个数组元素8个字节.因此,对于10000个元素,您不得不期望约80kB的字节码.
用16位索引初始化大数组的代码如下所示:
2016 dup 2017 sipush 298 2020 ldc_w <Integer 100298> [310] 2023 iastore 2024 dup 2025 sipush 299 2028 ldc_w <Integer 100299> [311]