【问题标题】:Optimizing Java code优化 Java 代码
【发布时间】:2010-11-27 14:57:31
【问题描述】:

如何优化这段代码?我制作了 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;
        }
}

【问题讨论】:

  • “优化”是什么意思?你需要让它跑得更快吗?你需要让它使用更少的内存吗?或者你只是想让代码更短或更优雅?

标签: java optimization ip-address filtering micro-optimization


【解决方案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

    【讨论】:

      【解决方案3】:

      并非没有,但 IP 地址是一个 4 字节整数,因为它通常实现。为什么不对其进行编码,然后让:

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

      做你的比较。

      对于 IPv6,您可以使用 long。

      再说一次,我可能会使用 java.net.Inet4Address 并将它们存储在一个 Set 中。

      既然您已经在使用地图,为什么不尝试一种简单的方法呢? Inet4Address.equals() 的中途智能实现将进行整数比较,而不是字符串比较。

      如果你想做通配符,这个方法当然会失效... :-/

      【讨论】:

      • 我认为它不会因通配符而失效 - 至少 begin_with 和 ends_with 可以通过 hashCode 计算中的位掩码操作来处理。使用整数和/或长整数会比原始算法快得多。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多