【问题标题】:Reading from Properties file v/s HashMap lookup从属性文件中读取 v/s HashMap 查找
【发布时间】:2012-06-01 04:03:14
【问题描述】:

在内存和计算方面访问 (key,value) 对是一种更有效的方法:使用 properties.getProperty("key") 从属性文件中读取或将整个属性文件加载到程序开始,然后在HashMap中查找key?

另外,如果重复使用属性中的一个值,是否将值存储在成员变量中并访问它或每次使用 properties.getProperty("key") 查找它会更好吗?

【问题讨论】:

    标签: java performance hashmap


    【解决方案1】:

    properties.getProperty("key") 是从作为 Properties 对象的 Hashtable 中查找的。当您执行Properties.load() 时,您从文件中加载条目并将它们存储到扩展了Hashtable 的Properties 对象中。对属性的每次后续访问都会在 Hashtable 中进行查找。没有文件IO了。

    当然,访问成员变量比从 HashMap 中的键访问值要快一些,但我怀疑这会在性能方面获得任何显着的收益。 HashMap 查找是 O(1),而且非常快。在注意到差异之前,您可能需要数百万次查找。做最适合你的事情。

    【讨论】:

    • 我不同意数以百万计的查找。好的,如果查找随着时间的推移而分散,它们可能不会产生太大的影响,但如果在长时间运行的操作期间定期访问该属性,它应该会产生影响。请记住,哈希查找可能涉及遍历(短)链表,并且字符串哈希码(幸运的是已经缓存在字符串中)需要首先转换为存储桶索引。这些可能都是便宜的操作,但它们加起来。
    • 在一个微基准上,没有任何预热阶段来确保一切都是 jitted 从而更快,使用包含 100 个键的 Properties 对象,执行 100 万个 Properties 查找只需要 85 毫秒。跨度>
    【解决方案2】:

    实际上System.getProperty() 在内部使用了java.util.Properties 对象。 Properties 类扩展了 HashTable<Object,Object>,因此通过显式使用 HashMap 来代替,sou 不太可能获得太多性能。

    但是,如果您经常使用少数属性,那么将它们存储在变量中肯定会有所帮助。 HashTable/HashMap查找和变量访问可能都是O(1),但是HashTable查找肯定有更大的常数因子。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-10-16
      • 2020-11-11
      • 1970-01-01
      • 1970-01-01
      • 2023-03-20
      • 2015-05-11
      • 1970-01-01
      • 2011-10-31
      相关资源
      最近更新 更多