【问题标题】:What is the best size for a buffer in BlackBerry?BlackBerry 中缓冲区的最佳大小是多少?
【发布时间】:2013-08-27 06:37:01
【问题描述】:

在我的应用程序中,我需要从输入流中读取数据。我已将当前读取的缓冲区大小设置为 1024。但我在某些 Android 应用程序中看到缓冲区大小一直保持为 8192(8 KB)。如果我将应用程序中的缓冲区大小增加到 8KB,会有什么特别的好处吗?

任何专家意见将不胜感激。

编辑:(我使用的是 BB OS 6 和 7,我正在处理网络输入流。)

【问题讨论】:

  • 在这里查看一些答案。 stackoverflow.com/questions/12245399/…
  • 请提供更多信息。哪个InputStream?网络?设备上的数据库文件?另外,哪个 BlackBerry 平台(旧 Java 或新 BB 10)?哪些设备?
  • 我正在使用 BB OS 6 和 7,我正在处理网络输入流。
  • 这就是我所说的“不必要的优化”:-)

标签: blackberry java-me buffer


【解决方案1】:

我不能说我找到了普遍最佳的缓冲区大小,但在我看来,在大多数情况下,1KB 到 8KB 范围内的大小应该没问题(对于 BlackBerry Java应用程序)。

请记住,如果数据量很小(因此您可能只需要一个或两个 1KB-8KB 的缓冲区),最好只使用IOUtilities 方法:

byte[] result = IOUtilities.streamToBytes(inputStream);

您不需要实际选择缓冲区大小。但是,如果您知道 result 将是一大块数据,那么您可能希望一次读取一个缓冲区。

但是,我认为答案应该几乎总是通过构建应用程序来获得,并且测量性能与一些不同的字节缓冲区大小值。更改一个常数,再次构建、运行和测量很容易,然后您无需猜测,也无需听取不了解您应用所有细节的人的建议。

See here for information about BlackBerry Eclipse plugin memory analysis,和 here for BlackBerry Eclipse plugin profiling.

通过选择 Window 菜单,然后选择 Show View -> Other... -> 可以在 Eclipse 中找到这些工具BlackBerry -> BlackBerry Memory Statistics ViewBlackBerry Profiler View,同时调试。

这样,您可以查看网络代码在调用期间使用了多少内存或处理器来检索数据并填充您的缓冲区。

更多

BlackBerry InputStream to String conversion

【讨论】:

    【解决方案2】:

    这里的官方黑莓论坛也有人问过这个问题:

    http://supportforums.blackberry.com/t5/Java-Development/What-is-the-best-size-for-a-buffer-in-BlackBerry/td-p/2559417

    OP 对此进行了澄清:

    “我正在从网络读取。一旦我与服务器建立套接字连接,服务器将一个接一个地向我发送通知。我需要从套接字连接中可用的输入流中读取通知/数据。为此,我有一个后台线程检查输入流中是否有可用的东西,如果有可用的东西,它将在缓冲区的帮助下读取,然后将读取的数据传递给 StringBuffer。"

    鉴于此信息,我有不同的看法,因为我认为 BlackBerry 网络处理将 Java 应用程序从网络缓冲区处理中抽象出来,以至于应用程序缓冲区大小对性能几乎没有影响。

    但请注意,这只是我的意见。

    我对该主题的回复如下:

    首先要注意的是,根据我的经验,方法“isAvailable()”在 OS 5.0 及更早版本上无法正常工作。它在 OS 6 中已修复(至少根据我的测试)。

    因为 isAvailable() 被破坏,(以及其他应用程序原因)我为套接字连接实现的是每条消息前面都有一个长度。所以在套接字连接中,我读取了下一条消息的长度,然后是实际数据。这是在没有阻塞的情况下完成的 - 换句话说,我阅读了整个消息,无论大小。我建议你也这样做。消息必须完整地存在于某处,因此无论它是在由套接字连接管理的某个内存中,还是在您管理的某个内存中,都没有区别。

    另请注意,在 OS 6.0 之前,当您进行读取时,您将获取所有数据以填充您拥有的缓冲区 - 换句话说,它一直等到缓冲区已满。在 OS 6.0 及更高版本中,无需为您提供完整的缓冲区即可完成读取。

    在您的情况下,您可能仅在 OS 6.0 后工作,因此您可以使用 isAvailable() - 创建该大小的缓冲区并读取所有内容。我看不出您是否拥有由套接字管理的内存中的字节或由您管理的内存有什么区别。

    但事实上,我认为最好的方法是让您的处理变得最简单的方法。例如,如果您知道下一条消息是 200 字节,则读取 200 字节,然后处理该消息。然后阅读下一条消息。

    您可能会花费大量时间来尝试管理缓冲区以匹配底层套接字缓冲区。我不确切知道底层 BlackBerry 套接字处理代码是如何工作的,但它不会将数据直接放入缓冲区。所以让它管理它的缓冲区大小来优化网络,你管理你的缓冲区大小来优化你的处理。这对每个人都最有效。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-06
    • 1970-01-01
    • 2014-08-22
    • 1970-01-01
    • 2013-11-02
    • 2015-06-07
    相关资源
    最近更新 更多