哪个更快:数组列表还是遍历所有数据组合?

Which is faster: Array list or looping through all data combinations?

我正在 Java 中编写一些程序,有关上下文,请参阅此问题:

我有两个选择:

byte[MAX][4] mypatterns;

或 ArrayList 我的模式

我可以使用 Java ArrayList 并在创建它们时附加一个新数组,或者通过计算所有可能的数据组合来使用静态数组,然后循环查看哪些索引是 'on or off' .

本质上,我想知道我是否应该分配一个可能包含未初始化值的大块,或者使用动态数组。

我的 fps 为 运行,因此每帧循环 200 个元素可能会非常慢,尤其是因为我将有多个此循环实例。

根据理论和我所听到的,动态数组非常低效

我的问题是:遍历一个包含 200 个元素的数组是否比将一个对象附加到动态数组更快?

编辑>>>

更多信息:

当您在 ArrayList 上设置 initialCapacity 时,将看不到任何性能差异。你说你的集合的大小永远不会改变,但是如果这个逻辑改变了怎么办? 使用 ArrayList 您可以访问许多方法,例如 contains.

正如其他人已经说过的,使用 ArrayList 除非性能基准表明它是瓶颈。

迭代字节的最快方法是作为单个数组。一种更快的处理方法是 intlong 类型,因为一次处理 4-8 个字节比一次处理一个字节更快,但这取决于您在做什么。注意:byte[4] 在 64 位 JVM 上实际上是 24 个字节,这意味着您没有有效地使用 CPU 缓存。如果您不知道您需要的确切大小,您最好创建一个比您需要的更大的缓冲区,即使您没有使用所有缓冲区。即在 byte[][] 的情况下,你使用的内存是你真正需要的内存的 6 倍。

You right really, I should use a profiler first, but I'm also just curious about the question 'in theory'.

"theory"太复杂了。有太多的选择(不同的实现方式)需要分析。最重要的是,每个替代方案的实际性能将取决于硬件、JIT 编译器、数据结构的维度,以及您的(实际)应用程序中对(实际)输入的访问和更新模式。

很有可能这真的不重要

简而言之,没有人能给你一个理论上有根据的答案。我们能给出的最好的建议是基于对性能的直觉和/或基于软件工程常识的建议:

  • 越简单的代码越容易编写和维护,

  • 编译器比人类更一致1优化器,

  • 花在优化不需要优化的代码上的时间是浪费时间。


1 - 当然是在大型代码库上。如果有足够的时间和耐心,人类可以在某些问题上做得更好,但这在大型代码库上是不可持续的,并且它没有考虑以下事实:1) 编译器总是在改进,2) 优化代码可以依赖于人类无法考虑的事情,并且 3) 编译器不会感到疲倦和出错。