Jun 17 2008

ip检索。。完成。。

Category: 技术ssmax @ 22:17:35

c、java、perl各一个版本。。。做到现在,晚上10点,终于搞定。。。

java版本,一开始是用TreeMap,默认的红黑树实现,但是jdk6之前没有LowerKey的方法,做得很麻烦,要生成一个submap,太慢,最后用二分法检索已排序数组,比较快,性能是100万次不超过2秒。

c版本,用红黑树实现,其实和二分法一样的,个人觉得,网上抄了一个实现,主要用树结构就不用再想怎么存储数据了,改了一下人家的源代码,加了LowerKey和HigherKey方法,其实也就是查找的时候多加一个变量就好了,性能是100万次不超过1秒。

最后就是perl版本了,不熟悉,做到晚上才做好,一开始不小心写了个数组copy,做1万次都要2秒多才做完,检查的时候检查出来了,

一开始是这样的

my @ipstart = @{$this->{“ipstart”}};

perl的类型太弱了,不是太清楚。。。结果就copy了数组,难怪慢了,后来直接用指针

my $ipstart = $this->{“ipstart”};

读取数组的时候用@$ipstart[] 就好了。。。

今天就是这种弱类型的指针转换搞了半天。。。汗啊汗。。

不过perl的最神奇函数pack、unpack真的好好用,果然是处理字符脚本首选啊。。

ip地址与long之间的转换就一行。。。
sub ip2long {
  return unpack(“N”, pack(“C4”,split(/\./,shift)));
}
 
sub long2ip {
  return join(“.”, unpack(“C4”, pack(‘N’,shift)));
}

perl也完成了,写了一个perl module,100万次大概是18秒,好像没什么地方可以再缩短了,就这样算了,困了,tnnd。。。。明天再修改一下c的结构就交货了,没有class真tmd不习惯。。。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.