如何优化此代码?我制作了IPFilter,我需要优化它。
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 :(得分:9)
通过一些典型用例对其进行概述,并使用该数据找出性能瓶颈所在。 然后,优化该代码。
如果不知道性能问题在哪里,您可能会花费大量时间和精力来节省微秒。
答案 1 :(得分: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 :(得分:2)
不是没有,但IP地址是4字节整数,因为它通常是实现的。为什么不编码,只是让:
int ipSrc = convertIpToInt(String ip);
if ( ipSrc == ipDest ) {
///
}
是你的比较。
对于IPv6,你可以使用很长时间。
然后,我可能会做的是使用java.net.Inet4Address并将它们存储在Set中。
由于您已经在使用地图,为什么不尝试一种简单的方法? Inet4Address.equals()的中途智能实现将进行整数比较,而不是字符串比较。
当然,如果你想做通配符,这个方法就会崩溃......: - /