Java反序列化速度

Java反序列化速度,java,serialization,Java,Serialization,我正在编写一个Java应用程序,其中需要读取一个字典文本文件(每行是一个单词)并将其存储在哈希集中。每次启动应用程序时,都会再次读取同一个文件(6兆字节的unicode文件) 这似乎很昂贵,所以我决定序列化生成的哈希集并将其存储到二进制文件中。我希望我的应用程序在这之后运行得更快。相反,它变慢了:从序列化前约2,5秒到序列化后约5秒 这是预期的结果吗?我认为在类似的情况下,序列化应该提高速度。这不是一种或另一种序列化机制的问题,而是序列化的数据结构的问题 这些单词有一个非常高效、自然的表示法:文

我正在编写一个Java应用程序,其中需要读取一个字典文本文件(每行是一个单词)并将其存储在哈希集中。每次启动应用程序时,都会再次读取同一个文件(6兆字节的unicode文件)

这似乎很昂贵,所以我决定序列化生成的哈希集并将其存储到二进制文件中。我希望我的应用程序在这之后运行得更快。相反,它变慢了:从序列化前约2,5秒到序列化后约5秒


这是预期的结果吗?我认为在类似的情况下,序列化应该提高速度。

这不是一种或另一种序列化机制的问题,而是序列化的数据结构的问题

这些单词有一个非常高效、自然的表示法:文本文件中的一个简单列表。读起来很快

您已经创建了一个不同的数据结构来存储它们:一个哈希表。表示哈希表需要更多内存。然而,它的好处是,与简单的列表相比,查找单词的速度非常快

但这种折衷意味着序列化也会变慢,因为哈希表的原始序列化将序列化更多的数据,并且会变大,因此会变慢


我认为你应该坚持简单地阅读文本文件。

@Sean的答案是正确的。Java序列化/反序列化会带来很大的性能开销。如果需要使字典加载更快(或…),请考虑以下方法:

  • 使用
    java.nio.*
    类读取文件可能会加快速度
  • 如果应用程序不需要在启动时立即加载字典,请考虑使用单独的线程异步执行字典加载。字典加载并不快,但(例如)应用程序的GUI启动速度更快

序列化后的结果文件有多大?这也可能暗示了速度,大致相同。文本文件为6.536.068,序列化二进制文件为6.879.3322 1/2秒不是一整段时间,您可能希望预处理文件以消除空白,您也可以尝试压缩文件并进行基准测试,看看这是否会提高速度。这似乎是合乎逻辑的。除了序列化的二进制文件没有比原始文本文件6.536.068到6.879.332大多少之外。虽然它不长,但更复杂。这就是慢下来的原因。好的,谢谢。我会接受建议,坚持简单的阅读。使用单独的线程对我来说很有用。谢谢你的主意。