对于分析目的,我想对大量IP执行反向DNS查找。 "大量"是指每小时至少数万个IP。 我正在寻找提高处理速率的方法,即降低每批处理时间。
将Dns.GetHostEntry的异步版本包装成可等待任务已经有了很大的帮助(与顺序请求相比),导致吞吐量约为每秒100-200个IP:
将Dns.GetHostEntry的异步版本包装成可等待任务已经有了很大的帮助(与顺序请求相比),导致吞吐量约为每秒100-200个IP:
static async Task DoReverseDnsLookups()
{
// in reality, thousands of IPs
var ips = new[] { "173.194.121.9", "173.252.110.27", "98.138.253.109" };
var hosts = new Dictionary<string, string>();
var tasks =
ips.Select(
ip =>
Task.Factory.FromAsync(Dns.BeginGetHostEntry,
(Func<IAsyncResult, IPHostEntry>) Dns.EndGetHostEntry,
ip, null)
.ContinueWith(t =>
hosts[ip] = ((t.Exception == null) && (t.Result != null))
? t.Result.HostName : null));
var start = DateTime.UtcNow;
await Task.WhenAll(tasks);
var end = DateTime.UtcNow;
Console.WriteLine("Resolved {0} IPs in {1}, that's {2}/sec.",
ips.Count(), end - start,
ips.Count() / (end - start).TotalSeconds);
}
你有什么想法来进一步提高处理速度吗?
例如,是否有任何方法可以向DNS服务器发送一批IP地址?
顺便说一下,我假设在异步方法中使用I/O完成端口 - 如果我错了请纠正我。
FromAsync
而不是现有的Dns.GetHostEntryAsync? - noseratio - open to work