在我的应用程序中,我需要从输入流中读取数据。我已将当前读取的缓冲区大小设置为 1024。但我在某些 Android 应用程序中看到缓冲区大小一直保持为 8192(8 KB)。如果我将应用程序中的缓冲区大小增加到 8KB,会有什么特别的好处吗?
任何专家意见将不胜感激。
编辑:(我使用的是 BB OS 6 和 7,我正在处理网络输入流。)
在我的应用程序中,我需要从输入流中读取数据。我已将当前读取的缓冲区大小设置为 1024。但我在某些 Android 应用程序中看到缓冲区大小一直保持为 8192(8 KB)。如果我将应用程序中的缓冲区大小增加到 8KB,会有什么特别的好处吗?
任何专家意见将不胜感激。
编辑:(我使用的是 BB OS 6 和 7,我正在处理网络输入流。)
我不能说我找到了普遍最佳的缓冲区大小,但在我看来,在大多数情况下(对于 BlackBerry Java 应用程序),1KB 到 8KB 范围内的大小应该没问题。
请记住,如果数据量很小(因此您可能只需要一个或两个 1KB-8KB 的缓冲区),最好只使用以下IOUtilities
方法:
byte[] result = IOUtilities.streamToBytes(inputStream);
您不需要实际选择缓冲区大小。但是,如果您知道这result
将是一大块数据,那么您可能希望一次读取一个缓冲区是正确的。
但是,我认为答案几乎总是应该通过构建应用程序来获得,并使用一些不同的字节缓冲区大小值来衡量性能。更改一个常数,再次构建、运行和测量很容易,然后您无需猜测,也无需听取不了解您应用程序所有细节的人的建议。
有关 BlackBerry Eclipse 插件内存分析的信息,请参阅此处,有关 BlackBerry Eclipse 插件分析的信息,请参阅 此处。
在 Eclipse 中通过选择Window菜单,然后在调试时选择Show View -> Other... -> BlackBerry -> BlackBerry Memory Statistics View或BlackBerry Profiler View可以找到这些工具。
这样,您可以看到网络代码在调用期间使用了多少内存或处理器来检索数据和填充缓冲区。
这个问题也在官方黑莓论坛中被问到:
OP给出了这个澄清:
“我正在从网络读取。一旦我与服务器建立套接字连接,服务器将一个接一个地向我发送通知。我需要从套接字连接中可用的输入流中读取通知/数据。为此,我有背景检查输入流中是否可用的线程,如果有可用的东西,它将在缓冲区的帮助下读取,然后将读取的数据传递给 StringBuffer。”
鉴于此信息,我有不同的看法,因为我认为 BlackBerry 网络处理将 Java 应用程序从网络缓冲区处理中抽象出来,以至于应用程序缓冲区大小对性能的影响很小(如果有的话)。
但请注意,这只是我的意见。
我对该线程的回复如下:
首先要注意的是,根据我的经验,方法“isAvailable()”在 OS 5.0 及更早版本上无法正常工作。它在 OS 6 中已修复(至少从我的测试中)。
因为 isAvailable() 被破坏了,(以及其他应用程序原因)我为套接字连接实现的是每条消息前面都有一个长度。所以在套接字连接中,我读取了下一条消息的长度,然后读取了实际数据。这是在没有阻塞的情况下完成的——换句话说,我阅读了整个消息,无论大小。我建议你也这样做。消息必须完整地存在于某处,因此无论它是在由套接字连接管理的某个内存中,还是在您管理的某个内存中,都没有区别。
另请注意,在 OS 6.0 之前,当您进行读取时,您将获得所有数据以填充您拥有的缓冲区 - 换句话说,它一直等到缓冲区已满。在 OS 6.0 和更高版本中,读取可以在不给您完整缓冲区的情况下完成。
在您的情况下,您可能仅在 OS 6.0 后工作,因此您可以使用 isAvailable() - 创建该大小的缓冲区并读取所有内容。我看不出您是否拥有由套接字管理的内存中的字节或由您管理的内存有什么区别。
但事实上,我认为最好的方法是使您的处理变得最简单的方法。例如,如果您知道下一条消息是 200 字节,则读取 200 字节,然后处理该消息。然后阅读下一条消息。
您可能会花费大量时间来尝试管理缓冲区以匹配底层套接字缓冲区。我不确切知道底层 BlackBerry 套接字处理代码是如何工作的,但它不会将数据直接放入缓冲区。所以让它管理它的缓冲区大小来优化网络,你管理你的缓冲区大小来优化你的处理。这对每个人都最有效。