【问题标题】:StringBuffer.append() vs ArrayList<String>.add()StringBuffer.append() 与 ArrayList<String>.add()
【发布时间】:2017-08-04 13:38:02
【问题描述】:

就性能和内存而言,哪个效率最高?

现在,我有一个 List&lt;ArrayList&lt;String&gt;&gt;,它包含近 200,000 条记录,由单独的业务逻辑生成。我正在尝试使用 Thymeleaf 在 HTML 页面中以表格格式打印它。 目前,我正在使用嵌套的th:each 循环来打印带有th:text 的数据。正如预期的那样,这需要很长时间。

我查看了this,发现th:utext可以用来打印Thymeleaf中的html内容。

我生成这 200,000 条记录的业务逻辑,目前给出了一个 List&lt;ArrayList&lt;String&gt;&gt; 对象,但我可以通过更改将其修改为 List&lt;String&gt; 对象。

不过,我的问题是,这样会更节省内存吗?很有可能它会提高性能效率,但我主要关心的是内存效率。 List&lt;ArrayList&lt;String&gt;&gt; 会占用与包含相同数据的List&lt;String&gt; 相同的内存量吗? (通过相同的数据,我的意思是,内容是相同的 - 而不是 ArrayList&lt;String&gt;,它将包含一个带有 HTML 元素的字符串)。还是会占用更多内存?

我对理解数据结构的空间复杂性相对较新;因此查询。

【问题讨论】:

  • 大声笑尝试创建一个包含 200K 数据的 html 表永远不会有效:D。可能您可能想要创建一个分页列表。 200K的ArrayList并不多,我认为你的问题是有一个包含200K行的字符串
  • @nafas 有一个很好的观点。使用您当前的结构,很容易实现分页功能。但是,如果您坚持发布这 20 万条记录,则将其更改为 List 不会提高或降低性能效率。更改可能会导致非常轻微的内存减少。
  • 正如@Kylon 所说,它不会有很大的不同。但是:在 200K 记录的单元格中,我希望有很多重复的条目,每个条目都不需要单独的 String 实例。尝试共享常见的 String 实例(可能使用 String.intern())可能会减少您的内存占用。使用 List 版本,常见的完整行的概率肯定会更低。但是,如果 Thymeleaf 首先创建一个带有完整页面的 StringBuilder 而不是即时输出元素(我不知道 Thymeleaf),那么这一切都无关紧要——那么你就迷路了。

标签: java list arraylist thymeleaf


【解决方案1】:

暂且不说 ;) 渲染一个包含 20 万条记录的 HTML 表格,这是对这种形式的问题的最常见答案...

就性能和内存而言,哪个效率最高?

...是:测量它!

您建议的方法(将List&lt;ArrayList&lt;String&gt;&gt; 替换为List&lt;String&gt;)意味着您希望获得以下结果:

  • List&lt;String&gt; 的占用空间比List&lt;ArrayList&lt;String&gt;&gt;
  • Thymeleaf 处理List&lt;String&gt; 的工作较少
  • 在服务器端将List&lt;ArrayList&lt;String&gt;&gt; ... generated by a separate business logic 转换为List&lt;String&gt; 的额外成本并不能抵消使用List&lt;String&gt; 带来的任何好处

我认为您确定这一点的唯一方法是比较两种方法产生的一些指标。例如:

一阶测量:

  • 测量创建响应服务器端所用的时间
  • 测量在浏览器中呈现响应所用的时间

二阶测量:

  • 在创建和发出响应时测量服务器端的内存和 CPU 使用率
  • 在呈现响应时测量客户端的内存和 CPU 使用率

我怀疑实施建议的更改可能非常简单,而且一阶测量值肯定很容易收集。因此,与其尝试评估第一原则的影响,不如去做,看看它是否对您有帮助。

【讨论】:

    猜你喜欢
    • 2016-02-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-20
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    相关资源
    最近更新 更多