Tag: 性能

了解jvm中的循环性能

我正在玩jmh ,在关于循环的部分,他们说 您可能会注意到重复计数越大,所测量操作的“感知”成本就越低。 到目前为止,我们每增加1/20 ns,远远超出硬件实际可行的范围。 发生这种情况是因为循环被大量展开/流水线化 ,并且要从循环中提升要测量的操作。 士气:不要过度使用循环,依靠JMH来正确测量。 我亲自尝试过 @Benchmark @OperationsPerInvocation(1) public int measurewrong_1() { return reps(1); } @Benchmark @OperationsPerInvocation(1000) public int measurewrong_1000() { return reps(1000); } 得到以下结果: Benchmark Mode Cnt Score Error Units MyBenchmark.measurewrong_1 avgt 15 2.425 ± 0.137 ns/op MyBenchmark.measurewrong_1000 avgt 15 0.036 ± 0.001 ns/op 它确实表明MyBenchmark.measurewrong_1000比MyBenchmark.measurewrong_1 。 但我无法真正理解JVM的优化,以提高性能。 他们的意思是循环展开/流水线 ?

检查布尔值比在java中设置布尔值更快?

这个: if (var) { var = false; } 对此: var = false; 有速度差吗?

返回arraylist的const引用

我真的很佩服javafunction,我不想放弃使用它来解决下一个问题: 我有一个可能被inheritance的类,并且它内部是一个private ArrayList arr; 所以setter函数没问题,但是getter函数return arr; 返回对该变量的引用,任何人都能够编辑我不想要的整个数组,私有没有任何意义! 在C ++中,我只return const arr; 它会返回对变量的常量引用。 我非常需要变量不被克隆或手动复制,因为有太多的计算需要(只读变量)为什么在java中没有返回const? 有什么方法可以逃避复制吗? ps (final ArrayList arr;)不是一个选项,因为该数组总是更改大小或元素值。 如果我找不到解决方法,我威胁要回到C ++或公开一切,你永远不应该得到我的软件:D 编辑:一个更重要的问题:我是否要求一些不好的东西(软件工程明智)我的意思是如果JAVA创建者认为没有const引用(返回只读引用)那么我必须要求可以在其他地方处理的东西办法。 或者我的程序设计错了我很困惑。

为什么linkedhashmap维护迭代的双向链表

因为在任何线程中都没有内部和合理的解释。 请给我确切的理由。 对于插入顺序,它足以维持单链表,但为什么不呢? 双重链表如何在这种情况下提高性能? 所有方法都inheritance自hashmap xpt 4方法,然后hashmap的迭代器不维护顺序,而linkedhashmap维护顺序?

在Java 8中使用Java 7 HashMap

我已将Java应用程序更新为Java 8.应用程序严重依赖于HashMaps。 当我运行基准测试时,我看到了不可预测的行为。 对于某些输入,应用程序运行速度比以前更快,但对于较大的输入,它会一直较慢。 我检查过探查器,最耗时的操作是HashMap.get。 我怀疑这些更改是由于Java 8中的HashMap修改,但可能不是这样,因为我已经更改了其他一些部分。 有没有一种简单的方法可以将原始Java 7 HashMap挂钩到我的Java 8应用程序中,这样我就只能更改hashmap实现,看看我是否仍然观察到性能的变化。 以下是一个试图模拟我的应用程序正在做什么的最小程序。 基本思想是我需要在应用程序中共享节点。 在某个运行时点,如果某个节点已根据某些整数属性而不存在,则应该检索或创建该节点。 以下仅使用两个整数,但在实际应用程序中我有一个,两个和三个整数键。 import java.util.HashMap; import java.util.Map; import java.util.Random; public class Test1 { static int max_k1 = 500; static int max_k2 = 500; static Map map; static Random random = new Random(); public static void main(String[] args) { for (int i = 0; […]

FindBugs警告:使用keySet迭代器而不是entrySet迭代器效率低下

请参考以下方法: public Set getCellsInColumn(String columnIndex){ Map cellsMap = getCellsMap(); Set cells = new HashSet(); Set keySet = cellsMap.keySet(); for(String key: keySet){ if(key.startsWith(columnIndex)){ cells.add(cellsMap.get(key)); } } return cells; } FindBugs给出了这个警告信息: “ 低效使用keySet迭代器而不是entrySet迭代器此方法使用从keySet迭代器检索的键访问Map条目的值。在map的entrySet上使用迭代器更有效,以避免Map .get(key)lookup。“

为什么System.out :: println比Java 8中的匿名类实现慢?

我正在使用一些Java 8 Stream API。 我很困惑地看到以下两个解决方案之间的性能差异,即只打印Stream的内容。 解决方案1: int[] array = new int[] { 0, 1, 2, 3, 4, 5 }; start = System.nanoTime(); Arrays.stream(array).forEach(System.out::println); System.out.println((System.nanoTime() – start) / 1000000.0f); 解决方案2: int[] array = new int[] { 0, 1, 2, 3, 4, 5 }; start = System.nanoTime(); Arrays.stream(array).forEach(new IntConsumer() { @Override public void accept(int value) { System.out.println(value); […]

Lombok在大型项目中减慢了构建过程

如果我在一个项目中使用Lombok(大约15个独立的项目 – EJB,Web,……),Lombok会使构建过程减慢2-3倍。 有没有解决方案,或龙目岛的缺点? 只是为了看项目的大小,它约为400 @Getter ,120 @Setter ,250 @Setter和100 @EqualsAndHashCode 。 环境:IBM Rational Application Developer 8.0.4及最新版本的Lombok(0.11.6) 有什么想法让它更快?

分配1亿个具有较小物理内存的整数

想要输出1亿个整数,我的系统只有1 GB的RAM。什么是最快速有效的排序方式? 假设我们在文本文件中有一个输入,每行一个整数。 我们正在使用java程序进行排序。 我已经指定了RAM,因为我们无法保存RAM中的所有输入整数。 更新:整数是7位数字。

Java:哪个更快? 局部变量或访问封装?

我最近读了一个StackOverflow问题 ,表明在访问变量时,使用堆栈比堆更快: void f() { int x = 123; // <- located in stack } int x; // <- located in heap void f() { x = 123 } 但是,我无法通过我的头脑工作,这在我的例子中更快(因为我假设他们都在使用堆栈)。 我正在研究hitbox计算等,它在函数中使用了很多XY,宽度,高度变量(每个最多10-20次)。 每次使用对象的get()方法或在函数开头将其设置为局部变量是否更快? 在代码中,它更快(或更高效): void f() { doSomething(foo.getValue() + bar.getValue()); doSomethingElse(foo.getValue(), bar.getValue()); doAnotherThing(foo.getValue(), bar.getValue()); // … <- lot's of accessing (something.getValue()); } 要么 void g() { […]