我正在阅读Sedgewick的“算法”中有关排序的章节。在此过程中,我编写了3个基本的排序算法:选择、插入和shell排序。书中说,尽管这三者都具有二次最坏情况的复杂性,但shell排序应该比随机数据的插入排序快得多。在书中,他们获得了600倍的性能提升。但我在笔记本电脑上得到以下乘法器(几乎不随阵列大小的增加而改变):选择:5.5倍插入:1x外壳:1.8倍!困扰我的问题是-为什么shell排序比插入排序慢将近两倍?!我想,我的shellsort实现有问题。但我几乎是从书上抄来的:classShellSortextendsSort{//precalculatesequence:1,4,
我正在寻找在运行时更改对象(或变量)的具体类的(开源)程序(或算法)的真实示例。Java中此类行为的示例可能类似于下面的代码片段。这里,一个在频繁插入和/或删除上下文中表现良好的LinkedList被更改为一个在随机访问和迭代上下文中表现良好的ArrayList.ListmyList=newLinkedList();/*Lotsofinserts*/...myList=newArrayList(myList);//'change'intodifferentclass/*Lotsofiteration*/...上面的Java示例在LinkedList和ArrayList之间变化为了性能。
如果我想从数组列表中删除一个集合,使用什么更好?我认为ArrayList中的removeAll方法是为此任务而编写的,但在我编写的测试中,仅遍历对象并将它们单独删除要快几秒钟。您为此目的使用什么?编辑:我在grepcode上找到的removeAll调用batchRemove(c,false)的代码:privatebooleanMore...batchRemove(Collectionc,booleancomplement){700finalObject[]elementData=this.elementData;701intr=0,w=0;702booleanmodified=fals
在我的java程序中,我有一个大致如下所示的for循环:ArrayListmyList=newArrayList();putThingsInList(myList);for(inti=0;i由于列表的大小没有改变,我尝试通过用变量替换循环的终止表达式来加速循环。Myideawas:SincethesizeofanArrayListcanpossiblychangewhileiteratingit,theterminationexpressionhastobeexecutedeachloopcycle.IfIknow(buttheJVMdoesn't),thatitssizewillst
两个问题。当我们声明文字字符串时,我们会在堆的字符串池中搜索是否有相同的字符串。这也是实习(String类的methodintern)吗?在我看来,每个文字字符串声明都需要二进制搜索或其他东西,因此当n是现有字符串的数量时,它至少需要log(n)在游泳池。而且如果池中的字符串很多,可能成本会很高。(也许是搜索成本和内存的权衡?)从这个角度来看,声明mant文字字符串可能是危险的。这种搜索成本有多重要,为什么java要这样设计(声明文字字符串时搜索池)。以下是我所说的理解背景。JavaDocforthejava.lang.Stringclass状态:Stringsareconstant;
我知道jmap是用来创建堆转储的,同样可以用Jhat来分析。jVisualVM也可用于分析堆转储(并且可以执行更多任务,例如分析等)。但是使用jHat和visualVM分析堆转储之间有什么区别(如果使用Web则除外,其次是桌面)。Sun提供了哪些不同的工具,哪一个更好?PS:我对这些工具的了解有限,因为我使用的分析/分析工具有限,例如JProbe、Java堆转储分析器等。如果我的理解有误,请指正。 最佳答案 jmap和jhat是具有命令行界面的核心工具。VisualVM是一个可视化工作台,集成了命令行工具,无需通过命令行选项即可更轻
我正在开发一款具有ScrollView的2D游戏(想想红色警戒或塞尔达传说),但我在绘图方面遇到困难。基本上有两种类型的对象绘制在map上。有些位置固定(如树木和建筑物),有些位置移动(玩家、敌人、飞箭)。为了让事物以正确的方式出现在彼此面前,它们需要以特定的顺序绘制(首先是远处的物体,然后朝向“相机”)。现在,每次游戏更新(每秒100次)时,我都会对所有对象(两种类型)的列表进行排序,这感觉就像是对CPU时间的巨大浪费。对象的顺序很少发生变化,即使发生变化,它们通常也只会在列表中向上或向下移动一个位置。另一个问题是只需要考虑实际在屏幕上的对象。由于包含1000个对象的map可能会变得
在著名的JavaConcurrencyinPractice的2.4节中,它说内在锁定方法与显式锁定相比是一个糟糕的设计决策,因为它令人困惑并且“......它迫使JVM实现者在对象大小和锁定性能。”有人可以解释对象大小如何影响锁定性能吗? 最佳答案 既然每个对象都可以被锁定,这意味着每个对象都必须有足够的空间来存储我们在锁定时需要的所有信息。这很不吸引人,因为绝大多数对象永远不会被锁定,所以我们浪费了大量空间。所以在实践中,Hotspot通过使用2bits来记录对象的状态并根据这两位重新使用对象头的其余部分来解决这个问题。然后是整个
有没有像Jenkins这样与CI服务器集成的Java分析工具?我不知道这样的事情是否存在,但如果有某种测试框架能够产生像YourKitProfiler的快照这样的结果,那就太棒了。这些将由CI服务器调用,并将结果与构建一起存储。结果是人们可以看到代码单元的性能变化历史,以帮助在系统集成级别进行更全面的性能调查。 最佳答案 看看spf4j,我将它用于连续分析(分析始终打开)。它使用采样进行分析,可以将分析数据保存到ssdump文件,也可以生成html报告。(Spf4j有一个UI来可视化ssdump配置文件)
我需要在索引i处的ArrayList中插入一个Person类型的元素(我自己定义的类)我知道我可以使用add(intindex,Eelement).但是是否有任何有效的方法可以做到这一点,因为在我的列表中它平均需要大约1.5毫秒(收集超过1000次插入的数据,然后取平均值)。 最佳答案 如果你的任务是插入/删除密集型的,你总是可以使用java.util.LinkedList.ArrayList的大小有限。每次添加一个元素时,Java都会确保它适合-因此它会增长ArrayList。如果ArrayList增长得更快,就会发生大量的数组复