Int数组作为Dictionary中的键VS一个字符串

时间:2017-02-28 15:52:19

标签: c# string dictionary unity3d int

我现在有一个词典,它使用string作为键,GameObject作为值。

字符串都是IP地址,所以它们不是很长。这是一个例子:

string ip = "192.68.137.1"

我知道数字比较比字符串快得多,而且我能够解析数据库服务器中的IP地址。

使用整数数组作为字典的KEY会更快吗?像这样:

int[] ip = { 192, 168, 137, 1 }

我正在检查字典是否定期包含某些值,并且还定期添加到字典中(通常至少每秒一次)。

我对此感到困惑的原因是因为我使用的字符串(IP地址' s)总是在那个长度附近,所以使用整数数组会有什么好处吗?如果字典每次必须循环4个数字,我不知道比字符串比较快多少。

3 个答案:

答案 0 :(得分:6)

与以往一样,你应该测试表现,而不是猜测它或者让别人猜测。但是,有两件事要考虑:

  • 你已经展示了一个IPv4地址......那么IPv6呢?这肯定会使事情复杂化
  • IPv4地址实际上是4 字节 ...那么为什么不将其转换为单个uintIPAddress作为密钥?这样您就不需要编写自己的EqualityComparer<int[]>了。遗憾的是IPAddress未实现IEquatable<IPAddress>,但它似乎 正确覆盖Equals / GetHashCode

我会考虑第一点,编写详细的基准测试,确定这是多么重要 - 如果你真的只是每秒查看一次,那么它很可能不重要所有 - 然后尝试各种选项。我只会放弃最简单的代码(如果你已经接收到IP地址那将是一个字符串),如果你能证明有明显的改进。

答案 1 :(得分:4)

我可能会使用IPAddress作为密钥。我假设(虽然你可以测试)它会对它的哈希值进行有效搜索,并且整个v4 / v6事件将由数据类型为你处理。

答案 2 :(得分:3)

您可以在词典中使用IPAdress类作为键。 从字符串创建的示例:
var ipAddressString = "192.68.137.1" IPAddress address = IPAddress.Parse(ipAddressString)
这是一种更正确的方式。
资料来源:https://msdn.microsoft.com/en-us/library/system.net.ipaddress.parse(v=vs.110).aspx