InetAddress.getByName()
对于小数量是可行的,但对于大数量来说速度太慢了(可能是因为它只发送一个请求到DNS服务器,并等待响应后再移动到下一个)。是否有更有效的方法(例如批量将它们发送到DNS服务器),以减少解析大量域名所需的时间?
根据fmucar的要求,我添加了用于尝试更多线程方法的代码:
Set<String> ips = Collections.synchronizedSet(new HashSet<String>());
int i = 0;
List<Set<String>> sets = new ArrayList<Set<String>>();
for (String host : domains) {
if (i++ % 5 == 0) {
sets.add(new HashSet<String>());
}
Set<String> ipset = sets.get(sets.size()-1);
ipset.add(host);
}
for (Set<String> ipset : sets) {
Thread t = new Thread(new DomainResolver(ips, ipset));
t.start();
}
每个线程的数量为250时,我们的峰值大约是每分钟700个结果。虽然比以前(<300)好了一些,但在需要解决数十万问题时仍然不太理想。将它降低到每个线程只有5个,可以大大加快速度,达到每分钟几千个。这显然会产生大量的线程,因此目前正在调查使用C进行解析,以利用 http://www.chiark.greenend.org.uk/~ian/adns/