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 对象时)的主要内容,如果未能解决你的问题,请参考以下文章

用for循环,求1~100之间所有整数的和

对于Python和Java之间的循环差异

++和--从for循环中的资源开销来理解之间的差异

使用for循环获取2个字符串之间的汉明距离

如何找到三个(for循环)之间的最小值?

在for循环中嵌套for循环