以下代码似乎是我的程序中最热门的地方。
JAVA_OPTS=-Xprof 输出:
Compiled + native Method
5.7% 173 + 0 scala.collection.IndexedSeqOptimized$class.slice
5.1% 156 + 0 scala.collection.IndexedSeqOptimized$class.foreach
2.9% 87 + 0 java.util.regex.Pattern$BmpCharProperty.match
2.5% 76 + 0 scala.collection.IndexedSeqOptimized$class.sameElements
2.4% 73 + 0 trafacct.SubNet.contains
Slice、sameElements 甚至 foreach 调用似乎也是从这里最常用的。有人可以就如何优化contains()
方法给出一两个建议吗?也许一些技术允许字节分析而不将它们转换为整数?还是没有切片的可靠全序列方法?
函数 SubNet.contains() 将 IP 地址与子网匹配。
object SubNet {
def toInts(bytes: Seq[Byte]): Seq[Int] = bytes.map(_.toInt & 0xFF)
}
case class SubNet(ip:InetAddress, maskLength:Int) extends HostCategory {
import SubNet.toInts
private val bytes: Int = maskLength / 8
private val subnet = toInts(ip.getAddress)
private val bits = bytes * 8 - maskLength
def contains(host: Host) = {
if (host.ip == null && ip == null) {
true
} else if (this.ip == null) {
false
} else {
val address = toInts(host.ip.getAddress)
if (address.length != subnet.length) {
false
} else {
if (address.slice(0, bytes) != subnet.slice(0, bytes)) {
false
} else {
((address(bytes) >> (8-bits) ^ subnet(bytes) >> (8-bits)) & 0xFF) == 0
}
}
}
}
}
我明白,这种优化不会给我带来更好的吞吐量,我只是觉得我在这个简单的函数中花费了这么多时间做错了。
这段代码应该与 IPv6(16 字节)兼容,我不喜欢单独处理 IPv4 大小写的想法。