解惑

解己之惑,解人之惑

标签:代码覆盖

Google面试题解说性能之八:工欲善其事必先利其器

按照原先的计划,这个系列只应该有四篇,但是后来打算多写一些,把这个问题研究透彻,所以出现了总结篇先于其它篇的情况。
这次我们按照总结篇中提到的方法实际演示下代码覆盖工具如何帮助我们优化程序提高性能,先给出我们未经好好优化的程序:
package com.jiehoo.util;

public class GoogleFn {
private static final int MAX = 2600002;

private static long start = System.currentTimeMillis();

private static int[] bases = new int[15];

private static int[] values = new int[15];

static {
bases[0] = 0;
bases[1] = 10;
values[0] = 0;
values[1] = 1;
for (int i = 2; i < values.length; i++) {
bases[i] = (int) Math.pow(10, i);
values[i] = i * (int) Math.pow(10, i – 1);
}
}

阅读全文

代码覆盖要求类更大?

刚刚看了下代码覆盖的结果,发现如果一个类太小,那么覆盖率很容易达不到要求,一般而言,代码覆盖率要求85%左右,但是如果一个类只有十几行代码,特别是再包含一些try catch语句,那么代码覆盖率很容易只有70%以下,因为有时候很多try catch只是JAVA要求进行处理,程序实际运行不可能出那些异常。
虽然这样考虑有点舍本逐末的嫌疑,但是在有硬性指标的时候,这个也是一个需要考虑的因素。

代码覆盖帮助发现BUG

今天无意中又浏览了一下代码覆盖的结果,竟然让我无意中发现了一个用其它方法可能不会发觉的BUG。
代码片断如下:
    /**
     * This method is performance key point of this framework.
     * @see org.mockejb.interceptor.AspectSystem#findInterceptors(java.lang.reflect.Method, java.lang.reflect.Method)
     */
    public List findInterceptors(Method proxyMethod, Method targetMethod)
    {
        List resultList = new ArrayList();
        List otherResult = find(proxyMethod, targetMethod, otherAspectList);
        resultList.addAll(otherResult);
        if (proxyMethod != null)
        {
            String proxyMethodString = proxyMethod.toString();
            String targetMethodString = targetMethod.toString();
            List aspect = CacheUtil.getBeanAspects(proxyMethodString + "-" + targetMethodString);
            if (aspect != null)
            {
                resultList.addAll(aspect);//168
            }
            else
            {
                if (isARMethod(proxyMethodString, targetMethodString))
                {
                    String beanName = getBeanName(proxyMethodString, targetMethodString);
                    if (beanName != null)
                    {
                        List aspects = (List) beanAspectMap.get(beanName);
                        if (aspects != null)
                        {
                            aspect = find(proxyMethod, targetMethod, aspects);
                            CacheUtil.putBeanAspects(proxyMethodString, aspect);
                            resultList.addAll(aspect);
                        }
                    }
                }
            }
        }
        return resultList;
    }

注意标记为168的那一行,那个地方是Cache的功能,但是代码覆盖报告指出它没有被执行过,也就是那个Cache从来没有生效,因为原来的cache的key只是proxyMethod.toString(),后来为了在初始化的时候屏蔽ejbPostCreate的执行加了一些Aspect,但是ejbPostCreate和ejbCreate的proxyMethod是一样的,只是targetMethod不同。
这个BUG只影响性能,所以其它的方法是不可能发现问题的。

© 2024 解惑

本主题由Anders Noren提供向上 ↑