Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 哪个更快:数组列表还是遍历所有数据组合?_Java_Performance_Dynamic Memory Allocation_Dynamic Arrays_Memory Pool - Fatal编程技术网

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

Java 哪个更快:数组列表还是遍历所有数据组合?,java,performance,dynamic-memory-allocation,dynamic-arrays,memory-pool,Java,Performance,Dynamic Memory Allocation,Dynamic Arrays,Memory Pool,我正在用Java编程,请参见以下问题: 我有两个选择: byte[MAX][4] mypatterns; 或 阵列列表模式 我可以使用Java ArrayList并在创建新数组时附加新数组,或者通过计算所有可能的数据组合使用静态数组,然后循环查看哪些索引是“开”还是“关” 本质上,我想知道是应该分配一个可能包含未初始化值的大块,还是使用动态数组 我在fps中运行,所以每帧循环200个元素可能非常慢,特别是因为我将有多个循环实例 根据理论和我所听到的,动态阵列效率非常低 我的问题是:在一个包含2

我正在用Java编程,请参见以下问题:

我有两个选择:

byte[MAX][4] mypatterns;
或 阵列列表模式

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

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

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

根据理论和我所听到的,动态阵列效率非常低

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

编辑>>>

更多信息:

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

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


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

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

你说得对,我应该先用一个剖析器,但我也对“理论上”这个问题很好奇

“理论”太复杂了。有太多的备选方案(不同的实施方式)需要分析。除此之外,每个备选方案的实际性能将取决于硬件、JIT编译器、数据结构的维度以及(实际)应用程序中对(实际)输入的访问和更新模式

很有可能,这真的不重要

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

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

  • 编译器是比人类更稳定的优化器

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



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

通过动态数组,您是指
列表
,例如
数组列表
?与普通数组相比,
ArrayList
效率非常低,这是什么理论?您从哪里听说的?不是。是的,我只是在编辑它。我想ArrayList可能效率不高,但我听说静态数组的速度要快很多倍。不确定这是不是真的,但这是我所理解的。虽然通常情况下ArrayList是不可避免的,但在这种情况下,我实际上可以选择,这就是我提出这个问题的原因。您可能遇到的任何性能问题都不太可能是使用
ArrayList而不是普通数组造成的。不要为此使代码复杂化,除非探查器显示
ArrayList
导致性能下降。您是指字节大小还是字节数?我以为在Java?@bigcodeszzer中内存对齐是8的倍数。对象的默认内存对齐是8字节。然而,如果你想要一个紧凑而高效的数据结构,你需要一个字节[]或类似的所有数据,这样每个字节只使用字节。哦,我明白了,我想我可以这样做,然后循环使用I+=4或其他什么。