这是一个由两部分组成的问题,但对于单独的部分来说没有意义。字节码输出中的大量dup指令是否表示代码编写不当?其中large由所有字节码指令的一定百分比定义。此外,如何重写生成dup指令的代码? 最佳答案 我们是在谈论您正在分析的javac输出还是您自己的编译器/生成器?如果您从javac生成的内容的角度担心Java代码的质量-忘掉它吧。首先,javac生成次优字节码并依赖JVM/JIT进行所有优化(非常好的选择)。但是字节码仍然可能比任何人可以快速想出的东西都要好得多。这类似于询问C编译器生成的汇编代码的质量。如果您自己生成字节码,
考虑这样的方法:@OverridepublicStringtoString(){finalStringBuildersb=newStringBuilder();for(finalRoomroom:map){sb.append(room.toString());sb.append(System.getProperty("line.separator"));//THISISIMPORTANT}returnsb.toString();}System.getProperty("line.separator")可以多次调用。我应该用publicfinalstaticStringlineSeper
背景信息我有一个进行数据分析的分布式处理应用程序。它旨在对实时更新的多组数据进行并行处理。作为设计的一部分,分析已分解为分析节点。每个节点获取源数据并对其进行处理以创建其他数据,然后这些数据又可以被其他节点使用。要对一个数据集进行我们当前的全套分析,需要大约200个节点。在目前的设计中,每个节点都有自己的线程运行。现在,大部分时间这些线程都处于hibernate状态。每当数据更新时,它们都会像瀑布一样轮流醒来,然后又回到sleep状态。该应用程序目前正在生产中运行40组数据,每组需要200个节点,使用8000个线程。当没有数据进来时,服务器上就没有负载。当数据在最繁忙的时候进入时,服务
我在通常的地方(apachecommons、google)找过,但没能找到...它应该是开源的。几乎是在寻找一个基于链表的。用例是10'000的map,其中不一定有很多值。它不需要按比例放大,因为当它变得太大时我可以转换它。一些数字,大小使用一些计算的jvm值(8bytes/java.lang.Object,4bytes/ref)HashMap大约是100+32n字节,理论上最好是12+20*n。 最佳答案 可以看看commons-collectionsFlat3Map,它被优化为在3个字段中存储3个值,并在4处溢出到另一个映射。我
我一直在努力弄清楚有关Java优化的所有内容,并发现了一些有趣的东西。第一种情况:原始类型编译时优化publicclassClazz{publicstaticvoidmain(Stringargs[]){finalinti=300;newClazz(){voidfoo(){System.out.println(i);}}.foo();}}编译后(我正在使用jd-gui-0.3.5.windows反编译二进制文件)它看起来像:publicclassClazz{publicstaticvoidmain(String[]args){inti=300;newClazz(){voidfoo(){
我正在编写一个(简单!)线性代数库。在执行matrixmultiplication,一个VisualVM性能示例告诉我,在乘以大型矩阵(5kx120k)时,该算法在以下方法中花费了85%的时间(特别是“self时间”):publicdoublenext(){doubleresult;if(hasNext())result=vis[i++].next();elsethrownewIllegalStateException("Nonextvalue");returnresult;}无需赘述(抱歉,我无法分享更多代码),此方法是矩阵“迭代器”的next()方法。(您可以将此方法所在的类想象成
假设我有同一个类的2个实例,但它们的行为不同(遵循不同的代码路径)基于构造时设置的最终boolean字段。所以像这样:publicclassFoo{privatefinalbooleanflag;publicFoo(booleanflagValue){this.flag=flagValue;}publicvoidf(){if(flag){doSomething();}else{doSomethingElse();}}}具有不同flag值的Foo的2个实例在理论上可以由2个不同的程序集支持,从而消除了if的成本(对于人为的例子,抱歉,这是我能想出的最简单的一个)。所以我的问题是-有任何J
我有以下两个程序:longstartTime=System.currentTimeMillis();for(inti=0;i和longstartTime=System.currentTimeMillis();for(longi=0;i注意:唯一的区别是循环变量的类型(int和long)。当我运行它时,无论N的值如何,第一个程序始终在0到16毫秒之间打印。第二个需要更长的时间。对于N==Integer.MAX_VALUE,它在我的机器上运行大约1800毫秒。运行时间似乎在N中或多或少呈线性。这是为什么呢?我想JIT编译器将int循环优化到死。并且有充分的理由,因为显然它什么都不做。但为什
我的文件结构有一个指向目录/home/me/myDir->/some/other/dir的符号链接(symboliclink)。此链接由另一个进程更新,并通知我的进程。收到通知后,我尝试获取新的规范路径:publicstaticStringgetPath(){Filefile=newFile("/home/me/myDir");if(file.exists()){try{Stringcanonical=file.getCanonicalPath();returncanonical;}catch...}问题是在链接更改后(我已经验证它更改)它需要3-5次调用上述getPath()方法才能
令我惊讶的是,与原来的8毫秒相比,通过在数组中预生成结果来“优化”乘法时,我得到了更长的时间(10毫秒)。这只是Java的怪癖还是PC架构的普遍现象?我有一个带有Java7、Windows864位的Corei5760。publicclassTest{publicstaticvoidmain(String[]args){longstart=System.currentTimeMillis();longsum=0;int[]sqr=newint[1000];for(inta=1;a 最佳答案 康拉德·鲁道夫commentedonthei