我刚刚看到这个看似无害的评论,对ArrayList和原始String数组进行基准测试.它来自几年前,但OP写道
我注意到使用String s:stringsList比使用旧式for循环访问列表慢约50%.去搞清楚...
没有人在原帖中评论它,测试看起来有点可疑(太短不准确),但是当我读到它时,我差点从椅子上掉下来.我从来没有对一个"传统"的循环增强循环进行基准测试,但我目前正在开发一个项目,它使用增强循环对ArrayList实例进行数亿次迭代,所以这是我关注的问题.
我打算做一些基准测试并在此发表我的发现,但这显然是我的一个大问题.我可以在网上找到关于相对性能的宝贵的小信息,除了一些随便提到的ArrayLists的增强循环在Android下运行速度慢得多.
有没有人经历过这个?这种性能差距是否仍然存在?我会在这里发布我的发现,但读到它时非常惊讶.我怀疑如果这个性能差距确实存在,它已经在更现代的VM中得到修复,但我想我现在必须做一些测试并确认.
更新:我对我的代码进行了一些更改,但是已经怀疑其他人已经指出的内容:确保增强的for循环速度较慢,但是在非常简单的紧密循环之外,成本应该是成本的一小部分.循环的逻辑.就我而言,即使我使用增强型循环迭代非常大的字符串列表,我在循环中的逻辑也足够复杂,甚至在切换到基于索引的循环之后我甚至无法测量差异.
TL; DR:增强循环确实比传统的基于索引的循环慢于arraylist; 但对于大多数应用来说,差异应该可以忽略不计.
如何在JPA中映射双打数组.我有以下代码失败,因为hibernate无法初始化数组.
@Entity
public class YearlyTarget extends GenericModel {
@Id
public Integer year;
@ElementCollection
public Double[] values;
public YearlyTarget(int year) {
this.year = year;
this.values = new Double[12];
}
}
Run Code Online (Sandbox Code Playgroud) 我测试一个分子动力学算法,它具有,除其他外,一个类粒子组成由9阵列双打存储颗粒组分(速度,力和位置在3D环境中).
我使用5个输入大小测试算法:
Size (MB) Time (s)
0.06 0.36 (fits in cache L2)
0.14 1.79 (fits in cache L2)
0.60 36.86 (fits in cache L3)
1.35 182.24 (fits in cache L3)
17.38 566.55 (it only fits in RAM)
Run Code Online (Sandbox Code Playgroud)
比我改变Particles从布局array到ArrayList.为了有一个连续的内存块,我创建了arrayList,其大小将占用:
ArrayList <Double> px = new ArrayList <Double>(Input_Size);
Run Code Online (Sandbox Code Playgroud)
我在上述睾丸的相同条件下运行该版本,结果如下:
Size (MB) Time (s)
0.06 0.608
0.14 2.78
0.60 57.15
1.35 299.24
17.38 1436,42
Run Code Online (Sandbox Code Playgroud)
测试环境如下:
AMD Opteron处理器6174,800 MHz,12 MB高速缓存L3,具有24个内核;
我的速度降低了大约2倍.这是正常的吗?不应该期望在两个版本中几乎相同的时间,因为ArrayList在内存中像数组一样连续分配?
编辑:
Running with the …Run Code Online (Sandbox Code Playgroud) 在我看来ArrayList,几乎在每个场景中都会更容易使用,它非常通用.是否存在String[]用于存储输入数据的实例?如果出现这种情况,必然存在缺陷ArrayList,会是什么?
只有想到了我的头顶部的事情将是各种String类似的方法,substring()和split()等.
编辑:StackOverflow的新手.如果这是重新发布,我道歉.并感谢格式化.
我发现ArrayList通过在日常编码中使用数组而不是使用数组,我几乎可以轻松地完成任何操作并且可以进行更多控制.所以我问:
ArrayList?ArrayList吗?我正在接收XML并需要转换为原始数组或ArrayList.在内存和垃圾收集方面,性能方面有很大差异吗?我的应用程序将每秒创建数千个这些对象,我需要最小化GC,因为我需要实时性能.
Thxs
我正在使用Java 7,并且我正在 Guava API 中搜索一种将函数应用于数组的方法,而不必先将其转换为集合。我愿意为此目的创建自己的类,但我不想重新发明轮子呵呵。
所以作为一个总结(如果你不知道我在说什么),这是我迄今为止发现的,你可以用 Guava 来做,以便将一个函数应用于数组,正如我所说的:
Integer[] someNumbers = new Integer[]{1, 2, 3};
Integer[] returnedNumbers = Collections2.transform(Arrays.asList(someNumbers), squareNumberFunction).toArray(new Integer[0]);
assertThat(returnedNumbers).isEqualTo(new Integer[]{1, 4, 9});//Using AssertJ here
Run Code Online (Sandbox Code Playgroud)
但我希望能够做这样的事情:
Integer[] someNumbers = new Integer[]{1, 2, 3};
Integer[] returnedNumbers = Arrays.transform(someNumbers, squareNumberFunction);
assertThat(returnedNumbers).isEqualTo(new Integer[]{1, 4, 9});
Run Code Online (Sandbox Code Playgroud)
理想情况下,我正在谈论的功能是type-safe。
编辑
为了进一步澄清问题:
我有 150 行和 10 列的巨大表数据,每列都有字符串数据。存储数据后,我还必须遍历以找到特定值。因此,我正在寻找在这种情况下在性能、遍历灵活性方面的最佳数据结构的答案。
我想到了Array、ArrayList、Hashmap。
另外,我在 SO 上发现了类似的问题,但他们没有回答我的问题。
编辑:数据是字母和整数的混合。无法排序并且也包含重复项。
我手头有表现情况.
我有大量的数据要以二维表格式(12000 X 2000)保存在内存中.现在据我所知,我可以使用int[][]或List<List<Integer>>.当然,我使用int[i][j]或访问值list.get(i).get(j).我循环遍历整个数据至少五次.
您认为哪一个会更快地工作,如果您能回答,为什么?还有什么办法可以加快执行速度吗?
我java -version给出:
操作系统是Windows Vista.
java version "1.6.0_29"
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing)
我一直在阅读,ArrayList与其他一些数据结构相比,搜索更快,因为它是基于索引的LinkedList.我明白ArrayList内部使用的是Java array.这是来自Java的代码ArrayList,它将数据保存在array.
private transient Object[] elementData;
Run Code Online (Sandbox Code Playgroud)
什么是' 基于索引的数据结构 ',为什么它更快?
此外,什么是数组的内存模型(数组在堆栈/堆组合中的结构),以便我能理解为什么访问数组中的元素更快?
所以我的程序应该访问一个文本文档,然后做所有当前有效的爵士乐。我无法弄清楚的唯一问题是如何打乱数组的内容,而不会让它们最终彼此重叠。互联网和随机和 for 循环的多次尝试都没有结果。这是我的代码:
import java.io.*;
import java.util.*;
public class lab_6 {
public static void main(String[] args)throws FileNotFoundException {
Scanner input = new Scanner(System.in); //reads from keyboard
System.out.println("What is the name of your file. ");
String name = input.nextLine();
Scanner reader = new Scanner(new File(name));// Open text file
System.out.println("how many names are in your array");
int num = input.nextInt();
String[] names = new String[num];
for (int index = 0; index< names.length; index++)
{
names[index] = reader.nextLine();// Gets a line while there …Run Code Online (Sandbox Code Playgroud) 我正在读一本关于JS数据结构的书,它提到:
javascript中的数组被实现为对象,导致它们比使用其他语言(如C++和Java)构建的数组效率低.
为什么?
正如标题所述,我试图找出何时使用某些类型的列表.我刚刚意识到我不知道这些Object [] - 列表是如何实现的,因此它们比List更受欢迎.也许只有当我知道列表的大小不会改变时,它们才是首选?我希望我的问题清楚.
干杯,
java ×12
arrays ×6
arraylist ×4
performance ×4
function ×1
guava ×1
hibernate ×1
javascript ×1
jpa ×1
jvm ×1
nested-lists ×1
random ×1
shuffle ×1
transform ×1