当前位置: 代码迷 >> J2SE >> java中常见的性能较差的步骤
  详细解决方案

java中常见的性能较差的步骤

热度:53   发布时间:2016-04-24 12:16:12.0
java中常见的性能较差的方法:
请列举你知道的java中性能较差的方法,并说明理由


说明白的加分!!!

------解决方案--------------------
Java 中的方法都是经过 N 多测试,经过完整的软件开发流程一步一步发布的,你很难找出其中性能很差的方法。
------解决方案--------------------
这个要具体项目中说可能才说得清楚。
------解决方案--------------------
像 BigInteger, BigDecimal 这些类在很早以前的 JDK 版本中性能是很差的,但是 JAVA 已经走过了 16 年,这两个大数类已经经过非常精心的优化了。

你不相信的话,你可以自己实现一个,然后再跟类库中的方法进行比较,看看有什么不足。

类库中一般只会存在设计不佳的类或者方法,比如:

1:Thread#stop, #resume, #suspend 等方法。JDK 的开发人员想当然地认为线程能够任意的被终止,而导致这个从 JDK 1.2 就废弃的方法

2:滥用了继承的 java.util.Stack 类。这个类由于继承自 Vector,因此导致这个类有很多方法不应该属于栈的)

3:java.util.Timer 由于采用的是绝对计时,如果执行期间抛出异常,或者更改系统时间会导致不可预料的结果。

等等诸如此,但是 JDK 在这些之后都有经过补救,提供更优秀的类库。
------解决方案--------------------
java.math.BigXXX 最先是 c+jni,后来才 pure java。据说性能提升了不少,
------解决方案--------------------
我知道String中间的一个Bug: String.contentEquals(CharSequence) calculates twice for AbstractStringBuilder
(http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6355654)
JDK 7中间已经修正(JDK7b03),据说JDK6及其他更低版本将不会修改

Java code
    public boolean contentEquals(CharSequence cs) {        if (count != cs.length())            return false;        // Argument is a StringBuffer, StringBuilder        if (cs instanceof AbstractStringBuilder) {            char v1[] = value;            char v2[] = ((AbstractStringBuilder)cs).getValue();            int i = offset;            int j = 0;            int n = count;            while (n-- != 0) {                if (v1[i++] != v2[j++])                    return false;            }///////////// SINCE ALL CHARACTERS ARE EQUAL, WHY NOT RETURN TRUE HERE?        }        // Argument is a String        if (cs.equals(this))            return true;        // Argument is a generic CharSequence        char v1[] = value;        int i = offset;        int j = 0;        int n = count;        while (n-- != 0) {            if (v1[i++] != cs.charAt(j++))                return false;        }        return true;    }
------解决方案--------------------
比如,"abc".contentEquals(new StringBuilder("abc"))将比较两次
------解决方案--------------------
String中间另外一个问题(也在7中修正),虽然谈不上性能影响,但是很傻:
Java code
    private static class CaseInsensitiveComparator                         implements Comparator<String>, java.io.Serializable {    // use serialVersionUID from JDK 1.2.2 for interoperability    private static final long serialVersionUID = 8575799808933029326L;        public int compare(String s1, String s2) {            int n1=s1.length(), n2=s2.length();            for (int i1=0, i2=0; i1<n1 && i2<n2; i1++, i2++) {                char c1 = s1.charAt(i1);                char c2 = s2.charAt(i2);                if (c1 != c2) {                    c1 = Character.toUpperCase(c1);                    c2 = Character.toUpperCase(c2);                    if (c1 != c2) {                        c1 = Character.toLowerCase(c1);                        c2 = Character.toLowerCase(c2);                        if (c1 != c2) {                            return c1 - c2;                        }                    }                }            }            return n1 - n2;        }    }
------解决方案--------------------
类a在sun的jvm可能很慢,但在ibm j9或者jrockit上可能很快,这个说不好的,再说有运行时优化,会编译成本地代码,不同的jvm优化算法也是大不相同,自然效率也就不一样
------解决方案--------------------
我知道有几个:
  相关解决方案