【问题标题】:do recopy a string to a new string have more performance impact that recopy an array?将字符串重新复制到新字符串对重新复制数组的性能影响更大吗?
【发布时间】:2020-05-16 03:25:04
【问题描述】:

我是 Java 新手,不知道哪个更好
所以我收到了一个非常奇怪的作业问题,要求我们将 csv 拆分为二维数组,但它们是 2 条规则
1.你不能使用 ArrayList
2.你不能导入file.io以外的其他java类

所以这使得它非常具有挑战性,因为我们还不能确定数组的大小。所以当我readline时,我决定先把它存储在一个字符串中
完成所有readline后,才处理“,”

所以我想知道,是否将字符串重新复制到字符串以添加文本会对性能产生更大影响,或者将先前的数组重新复制到新数组效率低下?
这只是 csv 的外观示例
1、2、3
4、5、6

stringRecopy &= reader.readLine()

int[][] arrayRecopy = (copy previous array with new reader.readLine().split(",") here)

【问题讨论】:

  • "do recopy a string to a string to add text have more performance impact",你可以自己尝试,如果差异可以忽略不计,在1000次左右迭代
  • @Martheen - 对了一半。问题是,如果你手工编写一个微基准,很容易得到误导性的结果。 OP 也需要阅读此内容:How do I write a correct benchmark in Java?
  • 如果非要瞎猜的话,我说copy previous array to a new array,因为有新数据会更慢,你怎么看?
  • 我认为它比这更复杂。 (想一想。这大致就是ArrayList 所做的!)
  • file.io 是什么意思?没有该名称的包或类。除此之外,它看起来像是一个很容易躲避的规则。您始终可以通过完全限定名称使用类,而无需 import 语句。

标签: java arrays performance


【解决方案1】:

我认为你问错了问题。

除非你的家庭作业要求明确说表现是最重要的标准,否则表现是一个红鲱鱼。

在现实世界中,大多数程序1的重要之处在于:

  1. 他们做他们应该做的事;即功能完整,没有错误。
  2. 它们是可维护的;即其他人可以阅读和理解代码,并修复或修改它。
  3. 它们的实现效率很高……就程序员的时间而言。
  4. 它们足够快达到预期目的。

“尽可能快”很少是标准。尤其是因为实现“尽可能快” 通常涉及忽略上述标准 1 到 3。


那么这在此处如何应用?

嗯,你正在做的是担心一个不需要高效的程序的效率。确实,如果我要标记这个作业2,我会更关注 1 和 2,而不是表现。以牺牲可维护性为代价而编写的快速程序将被贬低!


那我该如何实现呢?

好吧,专业的方法是使用ArrayList。但这不是一个选项3

所以剩下两种方法:

  • 读取(或处理)输入两次。在第一遍中,计算出二维数组需要多大(通过计算行数和一行中的最大逗号数)。然后创建数组并执行第二次传递以填充数组。

  • 实现代码以根据需要增长数组。

您决定选择哪种方法的标准应该基于您认为哪种方法更容易>>为您


最后,如果没有看到实现您的方法两种的完整版本,我认为我们无法回答您的实际问题。这在很大程度上取决于您如何对它们进行编码。

但是,一旦您对它们进行了编码并对其进行了测试和调试,测量它们应该不难。请参阅How do I write a correct micro-benchmark in Java? 以获取有关如何以能够为您提供有效答案的方式执行此操作的建议。


1 - 有明显的例外。

2 - 请注意,我不会给你的作业打分,所以建议你想想你的老师真正在寻找什么。如果你有疑问,你可以问他们。

3 - 这不是对作业的批评。我完全理解他们为什么做出这个限制。这个练习是关于学习编程,而不是(所谓的)现实世界中的“最佳实践”编程。

【讨论】:

  • 我知道,无法使用 ArrayList 很难。字符串和数组是最常用的东西不是吗?所以我认为 smone 之前一定做过基准测试,这就是我问的原因。我知道性能并不重要,但我只是想知道哪种方法更好
  • “所以我认为 smone 之前一定做过基准测试,这就是我问的原因。” - 我不知道是否有人做过基准测试。您是否尝试过在谷歌上搜索相关的基准?只有与您实现代码的方式相关时,基准才是相关的。我们看不到您的代码...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-03-23
  • 1970-01-01
  • 2015-03-23
  • 1970-01-01
  • 2021-08-27
  • 2011-10-10
相关资源
最近更新 更多