Tag: 优化

从数组中删除所有零

我有一个数组: [0, 5, 6, 0, 0, 2, 5] 我想从中删除所有零,以便返回(保持相同的顺序): [5, 6, 2, 5] 是否有更简单的方法来删除全部为零而不是以下? int[] array = {0, 5, 6, 0, 0, 2, 5}; int len = 0; for (int i=0; i<array.length; i++){ if (array[i] != 0) len++; } int [] newArray = new int[len]; for (int i=0, j=0; i<array.length; i++){ if (array[i] != 0) […]

Java Runtime.maxMemory不正确?

我运行了以下方法Runtime.getRuntime()。maxMemory()并给出了85196800。 但是,然后我从命令行运行顶部,它显示 PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND 8672 root 20 0 1284m 156m 4296 S 0.3 60.9 0:33.35 java 这不显示使用156M的ram吗? 有什么想法发生了什么?

‘MergeSort算法’ – JAVA中更好的实现是什么?

我知道快速排序算法,但我只关心合并排序算法。 我在互联网上发现了两种类型的合并排序算法实现。 但是当我将它们与插入算法进行比较时,它们似乎效率较低,而且对于大量项目而言并不是这样。 Enter the number of elements you want to sort: 300000 Time spent to executing BubbleSort: 362123 milliseconds Time spent to executing Selection: 108285 milliseconds Time spent to executing Insertion: 18046 milliseconds Time spent to executing MergeSort: 35968 milliseconds Time spent to executing MergeSort2: 35823 milliseconds 是否有另一种方法来实现合并排序算法,使其比插入算法更有效? 看看我的代码…… package br.com.test.test1; import java.util.Random; import […]

内存重新排序如何帮助处理器和编译器?

我研究了Java内存模型并看到了重新排序的问题。 一个简单的例子: boolean first = false; boolean second = false; void setValues() { first = true; second = true; } void checkValues() { while(!second); assert first; } 重新排序是非常不可预测和奇怪的。 此外,它破坏了抽象。 我认为处理器架构必须有充分的理由去做一些对程序员来说太不方便的事情。 这些原因是什么? 关于如何处理重新排序有很多信息,但我找不到任何关于它为什么需要的信息。 在任何地方,人们只会说“这是因为一些性能优势”。 例如,在first存储之前存储second的性能优势是什么? 你能推荐一些关于此的文章,论文或书籍,或者自己解释一下吗?

在Java中访问最终局部变量比使用类变量更快吗?

我一直在研究一些java原始集合( trove , fastutil , hppc ),我注意到一个模式,类变量有时被声明为final局部变量。 例如: public void forEach(IntIntProcedure p) { final boolean[] used = this.used; final int[] key = this.key; final int[] value = this.value; for (int i = 0; i < used.length; i++) { if (used[i]) { p.apply(key[i],value[i]); } } } 我做了一些基准测试,看起来这样做的速度稍微快一点,但为什么会这样呢? 我试图理解如果函数的前三行被注释掉,Java将采取哪些不同的做法。 注意:这似乎与这个问题类似,但那是针对c ++的,并没有说明为什么它们被声明为final 。

优化冒泡排序(Java)

我想知道如何优化冒泡排序,以便它忽略已经排序的元素,即使在第一次传递之后。 Eg. [4, 2, 3, 1, 5, 6] –> [2, 3, 1, **4, 5, 6**] 我们观察到[4,5,6]已经按排序顺序,如何修改我的代码,以便在下一遍中忽略这3个元素? (这意味着排序会更有效?)你建议使用递归方法吗? public static void bubblesort(int[] a) { for(int i=1; i<a.length; i++) { boolean is_sorted = true; for(int j=0; j a[j+1]) { int temp = a[j]; a[j] = a[j+1]; a[j+1] = temp; is_sorted = false; } } if(is_sorted) return; } […]

如何确定Java程序使用哪些类?

是否有任何工具可以列出哪些应用程序有效地使用哪些类,或者甚至更好地自动修剪JAR库以仅提供引用和使用的类?

javac优化标志

我最近在C中编写了很多代码,现在正在转向Java。 我目前正在实现一个大型数据结构,并且想知道在调用Java编译器时是否有任何优化标志,以便提高gcc中的性能。 我习惯了: gcc -O3 -NDEBUG MyProgram.c javac有一个类似的命令吗? 我正在使用JDK并运行Ubuntu 10.04。

如何确保不会发生jvm和编译器优化

我有这个代码测试Calendar.getInstance().getTimeInMillis() vs System.currentTimeMilli() : long before = getTimeInMilli(); for (int i = 0; i < TIMES_TO_ITERATE; i++) { long before1 = getTimeInMilli(); doSomeReallyHardWork(); long after1 = getTimeInMilli(); } long after = getTimeInMilli(); System.out.println(getClass().getSimpleName() + " total is " + (after – before)); 我想确保没有JVM或编译器优化发生,因此测试将是有效的,并且实际上会显示差异。 怎么样? 编辑 :我改变了代码示例,以便更清楚。 我在这里检查的是在不同的实现中调用getTimeInMilli()需要多长时间 – Calendar vs System。

java优化nitpick:在投射之前调用instanceof进行检查是否更快投出一些东西并让它抛出exception?

在任何人说什么之前我只是出于好奇而问这个问题; 我不打算根据这个答案进行任何过早的优化。 我的问题是关于使用reflection和铸造的速度。 标准的说法是“反思很慢”。 我的问题是哪个部分确实很慢,为什么; 特别是在比较某事物是否是另一个实例的父母时。 我非常有信心只是将一个对象的类与另一个Class对象进行比较的速度与任何比较一样快,大概只是直接比较已经存储在Object状态中的单例对象; 但如果一个class级是另一个class级的父母呢? 我通常认为instanceof与普通类检查一样快,但今天我想到了它,似乎有些reflection必须在“幕后”发生才能工作。 我在网上查了一下,发现有人说instanceof很慢; 大概是因为比较物体的父母所需的reflection? 这导致了下一个问题,即仅仅是铸造。 如果我将某些东西作为对象投射,那么我不会得到ClassCastException 。 但是,如果将对象转换为自身的父对象,则不会发生这种情况。 基本上我正在做一个调用的instanceof ,或者当我在运行时进行演员时,我正在做这个效果的逻辑吗? 我从来没有听到过任何人暗示过投射物体之前可能会很慢。 不可否认,并非所有演员都是提供对象的父级,但很多演员都是父类。 然而,从来没有人暗示这可能会很慢。 那是哪个呢。 真的不是那么慢吗? instanceof和cast都是父类慢吗? 或者是否有某种原因可以比调用instanceof更快地完成演员表?