草庐IT

Performance

全部标签

java - 即时编译——什么时候在 Java 中实际发生?

最近我参加了一个关于Java效率的讨论。正如我所听到的,许多反对Java的论点是解释“非常耗时”,正因为如此,即使是简单的Java程序运行起来也比直接编译为机器代码的类似程序慢得多。对此的回答是,Java代码通常直接编译为机器代码,如果只有JVM计算,它会使程序比以标准方式解释时更快。我的问题是:JVM什么时候真正“决定”执行即时编译?使JIT比标准字节码解释更有效的标准是什么?我的意思是,编译本身需要一些时间,据我所知,这一切都应该在程序已经运行时发生? 最佳答案 这根据您的JVM及其设置而有很大差异。维基百科:Forexampl

java - 模式匹配器与字符串拆分器,我应该使用哪个?

第一次发帖。首先,我知道如何同时使用模式匹配器和字符串拆分器。我的问题是哪个最适合我在示例中使用,为什么?或更好的替代方案的建议。任务:我需要在未知字符串中的两个已知正则表达式之间提取未知名词。我的解决方案:获取名词的开始和结束(来自正则表达式1和2)和用于提取名词的子字符串。Stringline="unknownXoooXNOUNXccccccXunknown";intgoal=12;Stringregexp1="Xo+X";Stringregexp2="Xc+X";我需要在第一个正则表达式之后找到索引位置。我需要在第二个正则表达式之前找到索引位置。A)我可以使用模式匹配器Patte

java - Java 应用程序中每个类的成本 - 更少的大类或几个更小的类

对于添加到Java应用程序的每个新类,内存成本是多少?是拥有5000多行的大型类还是几个500-1000行的类更好(如果它们都已加载)每次对象被实例化时,是否唯一额外的内存使用是用于实例变量引用对于一个没有实例变量的5000行类,加载类时的成本规模是多少?类文件的大小是粗略的近似值吗?jar文件的大小是否表明类将占用的内存通常大小或最大大小?在cruftex的回答后编辑:这是我对类split的理解:拆分成逻辑block可以很好地提高代码重用和减少行数它也更容易理解和维护代码这是我现在对类加载的理解:在第一次使用时将类加载到内存中(使用的内存大约是类文件的大小)如果使用JIT,一些额外的

java - 为什么 Java CPU 配置文件(使用 visualvm)在一个什么都不做的方法上显示如此多的命中?

这是我以前在其他环境中使用其他分析工具时见过的情况,但在这种情况下尤其引人注目。我正在获取一个运行了大约12分钟的任务的CPU配置文件,它显示几乎一半的时间花费在一个实际上什么都不做的方法上:它有一个空体。什么会导致这个?我不认为该方法被调用的次数多得离谱,当然不会占执行时间的一半。就其值(value)而言,所讨论的方法称为startContent(),它用于通知解析事件。事件沿着过滤器链(可能有十几个)传递,每个过滤器上的startContent()方法除了调用链中下一个过滤器上的startContent()之外几乎什么都不做。这是纯Java代码,我在Mac上运行它。附件是CPU采样

java - Map.containsKey() 在没有空值的 Map 中有用吗?

在下面的代码中:if(map.containsKey(key)){map.remove(key);}关于性能,在尝试从map中删除值之前先执行Map.containsKey()检查是否有用?同样的问题也适用于检索值,如果您知道map不包含null值,那么首先进行包含检查是否有用?if(map.containsKey(key)){Objectvalue=map.get(key);} 最佳答案 remove如果没有key的映射,则返回null不会抛出异常:publicVremove(Objectkey)我看不出有任何理由在尝试删除key

java - 为什么我的 for 循环执行时间没有改变?

publicclassTest{publicstaticvoidmain(String[]args){intx=150_000;longstart=System.currentTimeMillis();for(inti=0;i有人可以解释为什么将x设置为150_000或4_000_000甚至2_000_000_000不会改变此循环的执行时间吗? 最佳答案 在执行期间,JVM的即时(JIT)编译器将java字节码(类格式)编译为您机器的native指令集。JIT在编译期间执行多项优化。在这种情况下,JIT可能意识到以下内容(只是猜测)

java - 为什么 java 从具有大尺寸数字的第一个维度开始初始化二维数组需要很长时间?

我注意到像这样初始化二维数组案例1:-intar[][]=newint[10000001][10];比这样初始化要花更多的时间案例2:-intar[][]=newint[10][10000001];在情况1中,它花费了大约4000毫秒,但在情况2中,它不超过100毫秒为什么会有这么大的差距? 最佳答案 严格来说,Java没有二维数组:相反,它使用排列成数组的一维数组的一维数组。在您的第一种情况下,除了单个数组数组之外,Java还制作了10000001个包含10个元素的数组,而在第二种情况下,它制作了10个包含10000001个元素的

java - AppDynamics(性能监控工具)会降低我的生产应用程序的速度吗?

是否可以在生产环境中部署性能监控工具-AppDynamics?要监视的应用程序是标准的Java/J2EEWeb应用程序。我从未使用过AppDynamics,我担心它实际上可能会减慢我的应用程序。有人在生产中使用过AppDynamics吗?或者它应该只在测试环境中使用。 最佳答案 完全披露:我目前在AppDynamics工作。AppDynamics专为大批量生产环境而设计,但在生产环境和非生产环境中同样表现出色。它目前正在Netflix、ExactTarget、Edmunds和许多其他公司的一些世界上最大的任务关键型应用程序环境中运行

java - 提高 BigDecimal 到双转换的性能

这是BigDecimal.doubleValue()的Jdk7-b147版本publicdoubledoubleValue(){if(scale==0&&intCompact!=INFLATED)return(double)intCompact;//Somewhatinefficient,butguaranteedtowork.returnDouble.parseDouble(this.toString());}他们承认这种方式效率低下!有没有比使用这种方法更好/更快的方法? 最佳答案 没有更好的方法可以将BigDecimal转换为

java - 调用函数: two times or storing the result in a variable?哪个更好

这个疑惑我也遇到过很多次,但是一直没有找到正确的解决方案。这次我要清除它。我有这样的情况1.StringsNumber="ksadfl.jksadlf";if(sNumber.lastIndexOf('.')>0)//dosomething......if(sNumber.lastIndexOf('.')>1)//dosomething...2.intindex=sNumber.lastIndexOf('.');if(index>0)//dosomething......if(index>1)//dosomething...第一种方式和第二种方式之间的权衡是什么?将结果存储在变量中或调