以下代码似乎是我的程序中最热门的部分。
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
从这里开始,切片、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的想法。