1

我正在用 Java 编写一些东西,有关上下文,请参阅这个问题:Java 中的马尔可夫模型决策过程

我有两个选择:

byte[MAX][4] mypatterns;

或 ArrayList mypatterns

我可以在创建数组时使用 Java ArrayList 并附加一个新数组,或者通过计算所有可能的数据组合来使用静态数组,然后循环查看哪些索引是“打开或关闭”的。

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

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

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

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

编辑>>>

更多信息:

  • 我会知道数组的最大长度,如果它是静态的。
  • 数组中的项目会经常更改,但它们的大小是恒定的,因此我可以轻松更改它们。
  • 静态分配它就像一个内存池
  • 其他实例的初始化数据可能比其他实例多或少
4

3 回答 3

1

initialCapacity当您设置为 时,任何性能差异都将不可见ArrayList。你说你的收藏的大小永远不会改变,但如果这个逻辑改变了呢?使用ArrayList您可以访问很多方法,例如contains.

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

于 2015-12-21T01:44:50.547 回答
1

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

于 2015-12-21T01:52:40.207 回答
1

你说得对,我应该首先使用分析器,但我也只是对“理论上”的问题感到好奇。

“理论”太复杂了。有太多的替代方案(实现这一点的不同方法)需要分析。最重要的是,每种替代方案的实际性能将取决于硬件、JIT 编译器、数据结构的维度以及(真实)应用程序中(真实)输入的访问和更新模式。

而且很有可能这真的无关紧要

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

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

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

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


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

于 2015-12-21T02:20:42.167 回答