StringReader 和 for 循环之间的速度比较。 (将字符串转换为 jaxb 对象时)
Posted
技术标签:
【中文标题】StringReader 和 for 循环之间的速度比较。 (将字符串转换为 jaxb 对象时)【英文标题】:Speed comparision between a StringReader and for loop. (when converting a string to a jaxb object) 【发布时间】:2014-09-19 23:56:37 【问题描述】:我一直在寻找StringReader
和简单的for loop
之间的速度比较,但找不到任何有用的东西。我感兴趣的是使用 jaxb 将字符串转换为jaxb Object
。我找到的答案(Use JAXB to create Object from XML String)表明我需要将我的string
包装在StringReader
中,这是有道理的,但是需要一些工作才能将它们正确组合在一起。 (我正在使用自定义类来编组和解组对象,我必须检查、修改、提交,然后重新导入到我的项目中。这是一个很大的时间槽。)我发现我可以做同样的事情只需将我的字符串转换为byte[]
,然后使用现有方法获取我需要的object
,就像这样:
String responseAsString = " <?xml ver....";
byte[] myResponse = new byte[responseAsString.length()];
for(int i = 0; i < responseAsString.length(); i++)
myResponse[i]=(byte)responseAsString.charAt(i);
所以我的问题是:如果我的responseAsString
的长度约为 200,000 个字符,那么这种方法会比使用StringReader
获取我的jaxb object
慢得多吗?
【问题讨论】:
您可以同时实现这两者并运行基准测试来自己找出答案。在此处发布结果以供将来参考。 您的代码只是创建了一个byte[]
(忽略字符编码),没有 JAXB 对象。
@isnot2bad 是的,但是我有一个类是为我创建编组/解组的,所以使用byte[]
我可以这样做:marshal.bytesToObject(myResponse)
并得到jaxb object
我需要。 @Al.Sal 如果我在这里没有得到任何回复,我可能会在今天晚些时候这样做。
您真的认为通过将StringWriter
替换为byte[]
可以显着加快您的应用程序吗?这就像你想通过调整打印页面的打印机来减少“指环王”的总阅读时间......
我并不是要粗鲁@isnot2bad,但您似乎没有真正阅读我的Q。我更担心使用我的编组方法会导致速度变慢,可能如果改为编写更多代码,则应避免使用StringReader
方式。
【参考方案1】:
虽然已经有一年了,但那些从谷歌搜索 StringReader 性能的人应该知道,在逐个字符读取时它非常糟糕,就像在解析 XML 或 Json 时一样。
对 read() 的每次调用都包含一个同步块,这在大多数情况下是不必要的,并且在您真正尝试挤压性能时非常昂贵。可以编写自己的替代 StringReader,它的功能相同,但仅在几行代码中不同步,可能会取得相当大的胜利。
【讨论】:
【参考方案2】:虽然如果字符具有的 8 个字节中有任何额外信息(一个字节没有),则您的实现将适用于某些字符串,但您通过将其转换为一个字节来有效地截断字符信息,此外直接转换为一个字节,您忽略了字符编码。因此,即使您的 for 循环可能更快,您也会丢失信息。不要这样做,试试:responseAsString.getBytes()
。这将确保您不会通过简单地转换为字节而丢失编码信息。如果您碰巧知道您使用的是特定编码(例如 UTF-8),那么您可以调用 getBytes
并将编码作为参数。
作为旁注,我编写了一个基本的时间测试,在一个 20,000 个字符长的字符串上使用这两种方法 1000 次。使用上述 for 循环实现的平均时间是 0.25 毫秒,而 getBytes()
需要 0.75 毫秒。仍然因为可能丢失信息,我仍然会选择getBytes()
【讨论】:
以上是关于StringReader 和 for 循环之间的速度比较。 (将字符串转换为 jaxb 对象时)的主要内容,如果未能解决你的问题,请参考以下文章