哪个更快:数组列表还是遍历所有数据组合?
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
除非性能基准表明它是瓶颈。
迭代字节的最快方法是作为单个数组。一种更快的处理方法是 int
或 long
类型,因为一次处理 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) 编译器不会感到疲倦和出错。
我正在 Java 中编写一些程序,有关上下文,请参阅此问题:
我有两个选择:
byte[MAX][4] mypatterns;
或 ArrayList 我的模式
我可以使用 Java ArrayList 并在创建它们时附加一个新数组,或者通过计算所有可能的数据组合来使用静态数组,然后循环查看哪些索引是 'on or off' .
本质上,我想知道我是否应该分配一个可能包含未初始化值的大块,或者使用动态数组。
我的 fps 为 运行,因此每帧循环 200 个元素可能会非常慢,尤其是因为我将有多个此循环实例。
根据理论和我所听到的,动态数组非常低效
我的问题是:遍历一个包含 200 个元素的数组是否比将一个对象附加到动态数组更快?
编辑>>>
更多信息:
- 我会知道数组的最大长度,如果它是静态的。
- 数组中的项目会经常变化,但它们的大小是恒定的,因此我可以轻松地改变它们。
- 静态分配就像内存池一样
- 其他实例初始化的数据可能多于或少于其他实例
当您在 ArrayList
上设置 initialCapacity
时,将看不到任何性能差异。你说你的集合的大小永远不会改变,但是如果这个逻辑改变了怎么办?
使用 ArrayList
您可以访问许多方法,例如 contains
.
正如其他人已经说过的,使用 ArrayList
除非性能基准表明它是瓶颈。
迭代字节的最快方法是作为单个数组。一种更快的处理方法是 int
或 long
类型,因为一次处理 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) 编译器不会感到疲倦和出错。