【问题标题】:Is it more efficient to use an object data stream or a primitive data stream in Java?在 Java 中使用对象数据流还是原始数据流更有效?
【发布时间】:2011-01-15 20:53:23
【问题描述】:

在 Java 中执行 I/O 操作时,通常是使用像 ObjectInputStream 这样的对象数据流更有效(就计算资源而言)还是使用像 DataInputStream 这样的原始数据流更有效?

如果使用对象数据流更有效,那么当我们考虑到与创建对象相关的开销(尽可能少)时,对象数据流是否仍然更有效?

【问题讨论】:

    标签: java object io stream


    【解决方案1】:

    如果操作正确,自定义序列化可以节省空间/带宽和 CPU 时间。

    我建议你看看 google 的 Protocol Buffers - 非常高效且可移植的序列化库。

    【讨论】:

      【解决方案2】:

      您可以根据流中实际的数据类型来选择对象或数据输入流。如果是 Java 对象,则使用 Object 流,如果不是,则使用 DataInputStream(或其他适当的)。

      那么您的流中有哪些类型的数据?

      【讨论】:

      • 我有一个选择。我可以创建一个新类并将数据放入一个对象中,或者我将其作为原始数据发送。我正在尝试找出哪个更有效。
      • 然后编写一些基准并找出答案。效率是这里最后要考虑的事情。更重要的元素是其他语言可能需要与该系统交互的东西。它总是只有 Java,还是需要将它与 .NET、Perl 或 X 连接起来?因为这会对你做出的选择产生重大影响。如果只有 Java,我会推荐 OO 方法并使用 OOS。
      • ByteBuffer 或 ObjectOutput/InputStream(或半身像)。此外,如果一个人知道如何正确编写微基准测试永远不会问这个问题,微基准测试是 Java 中最难做的简单事情之一。
      • 您正在考虑错误的效率。如果您正在考虑开发人员的效率,那么您就不会问这个问题。你会问“为了让我的对象通过网络,我要做的最少的工作是什么”然后有人会说,xstream over tcp - 或类似的东西 - 你现在已经完成并测试了!跨度>
      【解决方案3】:

      ObjectInputStream 使用起来会更简单。在开始使用 DataInputStream 之前,我会检查这是否不够快。 DataInputStream 不如使用 NIO/ByteBuffer 高效,但相对较小的改进会增加工作量。

      【讨论】:

        【解决方案4】:

        对象序列化/反序列化是 java 中较重的东西之一。因此,如果这是程序的性能关键部分,那么避免对象序列化会有所帮助。尽管在许多情况下,瓶颈存在于其他地方,您最终可能会进行过早的优化。所以恕我直言,如果您不确定这将成为瓶颈,请使用 ObjectInputStream 并稍后进行优化。

        【讨论】:

        • 将序列化/对象传输业务与其余代码分开也是一个好主意,以防您以后确实需要切换到不同的方法。
        【解决方案5】:

        你为什么不写一些你想要的东西,围绕它进行一些测试,这样你就知道它是有效的。然后,如果它成为一个问题,您将能够用更快的东西替换实现,而无需大惊小怪。如果事实证明这不是问题,就像大多数这样的事情结果......那么你就不会花时间在不必要的事情上,也不会过早地进行优化。

        Xstream 是相当好用的火这种东西,而且非常好用。

        如果您的架构不是过于繁琐,您可能永远不需要优化这一点。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多