在我的应用程序中,我需要从输入流中读取数据。我已将当前缓冲区大小设置为1024.但我在一些Android应用程序中看到缓冲区大小一直保持为8192(8 KB)。如果我将应用程序中的缓冲区大小增加到8KB,是否会有任何特定的优势?
任何专家意见将不胜感激。
编辑:(我正在使用BB OS 6和7,我正在处理网络输入流。)
答案 0 :(得分:2)
我不能说我已经找到了普遍最好的缓冲区大小,但在我看来,在大多数情况下,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
这些工具可在Eclipse中找到,方法是选择窗口菜单,然后选择显示视图 - > 其他...... - > BlackBerry - >调试时 BlackBerry Memory Statistics View 或 BlackBerry Profiler View 。
这样,您可以看到网络代码在调用期间使用了多少内存或处理器来检索数据并填充缓冲区。
答案 1 :(得分:1)
此问题也在官方黑莓论坛中提出:
OP获得了这一澄清:“我正在从网络中读取。一旦我与服务器建立套接字连接,服务器就会一个接一个地向我发送通知。我需要从套接字连接中可用的输入流中读取通知/数据。为此我有一个后台线程,它检查输入流中是否有任何可用内容,如果有可用内容,它将在缓冲区的帮助下读取,然后将读取的数据传递给StringBuffer。“
鉴于此信息,我有不同的看法,因为我认为BlackBerry网络处理将Java应用程序从网络缓冲区处理抽象到应用程序缓冲区大小对性能影响很小的程度。
但请注意,这只是我的意见。
我对该主题的回应如下:
首先要注意的是,根据我的经验,方法“isAvailable()”在OS 5.0及更早版本上无法正常工作。它在OS 6中得到修复(至少在我的测试中)。
因为isAvailable()被破坏了(并且出于其他应用程序的原因)我为套接字连接实现的是每条消息前面都有一个长度。所以在套接字连接中,我读取下一条消息的长度,然后读取实际数据。这是在没有阻塞的情况下完成的 - 换句话说,无论大小如何,我都会读取整个消息。我建议你这样做。消息必须完全存在于某处,因此如果它位于由套接字连接管理的某个内存中,或者由您管理的某些内存中,则没有任何区别。
另请注意,在OS 6.0之前,当您执行读取操作时,您将获得所有数据以填充您拥有的缓冲区 - 换句话说,它等待缓冲区已满。在OS 6.0及更高版本中,读取可以在不提供完整缓冲区的情况下完成。
在您的情况下,您可能只在OS 6.0之后工作,因此您可以使用isAvailable() - 创建该大小的缓冲区,并读取所有内容。我不知道你是否拥有由套接字管理的内存中的字节或由你管理的内存都没有任何区别。
但实际上,我认为最好的方法是使您的处理最简单的方法。因此,例如,如果您知道下一条消息是200字节,则读取200字节,然后处理该消息。然后阅读下一条消息。
您可能会花费大量时间来尝试管理缓冲区以匹配底层套接字缓冲区。我不确切知道底层BlackBerry套接字处理代码是如何工作的,但它不会将数据直接放入缓冲区。因此,让它管理其缓冲区大小以优化网络,您可以管理缓冲区大小以优化处理。这对每个人都有效。