2009-09-11 195 views
0

如何优化此代码?我做了IPFilter,我需要优化它。优化Java代码

package com.ipfilter; 

import java.util.HashMap; 
import java.util.Map; 

/** 
*  IPFilter 
* 
*  Loads given IP addresses to memory, so you can easily check if ip addres has been blocked 
*/ 

public class IPFilter { 
     private Map<Integer, IPFilter> filter = new HashMap<Integer, IPFilter>(); 

     /** 
     * Convert String ip address to Integer array and then calls add ip method 
     * @param ip 
     * @return 
     */ 
     public void addIP(String ip) 
     { 
       int[] numbers = convert(ip); 
       addIP(numbers, 0); 
     } 

     /** 
     * Convert String ip address to Integer array 
     * @param ip 
     * @return 
     */ 
     private int[] convert(String ip) { 
       String[] strings = ip.split("\\."); 
       int[] numbers = new int[strings.length]; 
       for(int i = 0; i < strings.length; i++) 
       { 
         numbers[i] = Integer.parseInt(strings[i]); 
       } 
       return numbers; 
     } 

     /** 
     * Add ip address to memory 
     * @param ip 
     * @param level 
     */ 
     private void addIP(int[] ip, int level) { 
       if(level < ip.length) 
       { 
         if (filter.containsKey(ip[level])) { 
           filter.get(ip[level]).addIP(ip, level + 1); 
         } else { 
           filter.put(ip[level], new IPFilter()); 
           filter.get(ip[level]).addIP(ip, level + 1); 
         } 
       } 
     } 

     /** 
     * Checks if ip address is in filter 
     * @param ip 
     * @return 
     */ 
     public boolean isBlocked(String ip) 
     { 
       return isBlocked(filter, convert(ip), 0); 
     } 

     /** 
     * Check if ip address is blocked 
     * @param list 
     * @param ip 
     * @param level 
     * @return 
     */ 
     private boolean isBlocked(Map<Integer, IPFilter> list, int[] ip, int level) 
     { 
       if(list.containsKey(ip[level])) 
       { 
         if(level < ip.length - 1) 
         { 
           return isBlocked(list.get(ip[level]).getList(), ip, level + 1); 
         } 
         else 
         { 
           return true; 
         } 
       } 
       else 
       { 
         return false; 
       } 
     }  

     /** 
     * Getter for list 
     * @return 
     */ 
     protected Map<Integer, IPFilter> getList() { 
       return filter; 
     } 
} 
+0

你是什么意思的“优化”?你需要让它跑得更快吗?你需要让它使用更少的内存吗?或者你只是想让代码更短或更优雅? – Jesper 2009-09-12 12:27:08

回答

9

通过一些典型的使用案例来剖析它,并使用该数据找出性能瓶颈所在。 THEN,优化该代码。

实际上,如果不知道性能问题的位置,则可以花费大量时间和精力节省微秒。

2

我不确定你到底想要优化什么。但是,您有几个containsKey,然后是get。可能的优化是使用get并与null比较。例如,而不是:

if (filter.containsKey(ip[level])) { 
     filter.get(ip[level]) 
} 

执行以下操作:

IPFilter value = filter.get(ip[level]); 
if (value != null) { 
     value.addIp(...); 
} 

但我认为最好的提示,我可以给你的是:使用一个分析器。如果您使用Eclipse,请检查TPTP

2

不是空话,但IP地址是一个4字节的整数,因为它通常实现。为什么不编码到,只是让:

int ipSrc = convertIpToInt(String ip); 
if (ipSrc == ipDest) { 
    /// 
} 

是你的比较。

而对于IPv6,您可以使用long。

然后,我可能要做的就是使用java.net.Inet4Address并将它们存储在Set中。

既然你已经在使用Map,为什么不尝试一个简单的方法呢? Inet4Address.equals()的半智能实现将执行整数比较,而不是字符串比较。

当然,如果你想做通配符,这种方法会出现问题...: -/

+0

我不认为它通配符崩溃 - 至少begin_with和ends_with可以通过hashCode计算中的位掩码操作来处理。使用整数和/或long将比原始算法快得多。 – 2009-09-12 04:02:26