Java 提高算法的效率

Java 提高算法的效率,java,performance,timing,Java,Performance,Timing,我已经用Java开发了一段时间了,一直在努力以最有效的方式做一些事情。到目前为止,我主要是试图压缩我拥有的代码行数。但当开始使用2d渲染时,更多的是计算某段代码所需的时间,因为它每秒被调用多次 我的问题: 有没有办法衡量在Eclipse、Java等中计算某段代码需要多长时间 一般来说,速度与代码行数之比并不是衡量性能的最有效指标,因为它在很大程度上取决于您的硬件和编译器。有一种叫做Big-Oh表示法的东西,它给出了一幅随着输入数量的增加算法运行速度的图 例如,如果您的算法速度是O(n),那么代码

我已经用Java开发了一段时间了,一直在努力以最有效的方式做一些事情。到目前为止,我主要是试图压缩我拥有的代码行数。但当开始使用2d渲染时,更多的是计算某段代码所需的时间,因为它每秒被调用多次

我的问题:


有没有办法衡量在Eclipse、Java等中计算某段代码需要多长时间

一般来说,速度与代码行数之比并不是衡量性能的最有效指标,因为它在很大程度上取决于您的硬件和编译器。有一种叫做Big-Oh表示法的东西,它给出了一幅随着输入数量的增加算法运行速度的图

例如,如果您的算法速度是O(n),那么代码运行所需的时间将与时间成线性比例。如果您的算法速度是O(1),那么代码运行所需的时间将是恒定的


我发现这种测量性能的特殊方法很有用,因为您了解到影响速度的并不是真正的代码行,而是您的代码设计。处理问题的效率更高的代码可能比处理1/10行代码的效率更低的代码要快。

行数与程序的执行速度几乎没有关系

经过编译器处理后,您的程序将看起来完全不同。一般来说,大型编译器会执行许多优化,例如循环展开、删除未使用的变量、删除死代码,等等

因此,不要试图通过使用
short
而不是
int
char[]
而不是
String
或任何你认为会“优化”(过早优化)你的程序的方法来“挤出”程序的最后一点性能/内存,只要使用对你有意义的对象或类型就行了,因此,它将更容易维护。您的编译器、解释器、VM应该负责其余部分。如果没有,只有到那时你才开始寻找瓶颈,开始玩黑客游戏

那么,是什么让程序变得快速呢?算法效率(如果算法/数据结构设计不当,至少会产生最大的差异)。这是计算机科学家研究的

假设你有两个数据结构。数组和单链表

数组将对象一个接一个地存储在块中

+-+-+-+-+-+-+-+
|1|3|2|7|4|6|1|
+-+-+-+-+-+-+-+
要检索索引3处的元素,只需转到第4个正方形并检索它。你知道它在哪里,因为你知道它在第一个方格后3点

单链接列表将在节点中存储内容,这些内容可能不会连续存储在内存中,但每个节点上都有一个标记(指针、引用),告诉您列表中的下一项在哪里

+-+    +-+    +-+    +-+    +-+    +-+    +-+
|1| -> |3| -> |2| -> |7| -> |4| -> |6| -> |1|
+-+    +-+    +-+    +-+    +-+    +-+    +-+
要检索索引为3的元素,必须从第一个节点开始,然后转到连接的节点,即1,然后转到2,最后到达3。所有这些都是因为你不知道它们在哪里,所以你就沿着一条通往它们的路走

现在假设您有一个数组和一个SLL,它们都包含相同的数据,长度为n,哪个更快?这取决于你如何使用它

假设您在列表的末尾进行了大量插入。算法(伪代码)将是:

Array:
array[list.length] = element to add
increment length field

如您所见,在数组算法中,数组的大小无关紧要。它总是需要不断的操作。比如说,
a[list.length]
需要1次操作。分配它是另一个操作,增加字段并将其写入内存是两个操作。每次需要4次手术。但是如果你看一下SLL算法,至少需要
list.length
操作数才能找到列表中的最后一个元素。换句话说,将元素添加到SLL末尾所需的时间随着SLL大小的增加而线性增加
t(n)=n
,而对于数组,它更像
t(n)=4


我建议读我的数据结构教授写的。甚至在C++和java

中有工作代码,有些挑剔。你把这个问题命名为

提高算法的效率

  • 对于一个算法来说,没有实用的、可量化的“效率”度量。效率(通常认为)是相对于理想/完美的“某物”的度量;e、 假设一台100%效率的蒸汽机将把燃烧的煤中的所有能量转化为有用的“功”。但对于软件来说,没有理想的衡量标准。(或者如果有,我们不能确定它是否是理想的。)因此,“效率”是一个错误的术语

    你真正的意思是衡量……的“表现”

  • 算法是一个抽象的概念,其性能无法衡量

    您实际需要的是对算法的特定实现的性能的度量;i、 一些实际的代码


那么,如何量化绩效呢? 好吧,最终只有一种可靠的方法来量化绩效。你用经验来衡量它。(你是如何做到这一点的……以及限制……是我将要讨论的问题。)

但是理论方法呢

一种常见的理论方法是分析该算法,以测量计算复杂性。经典的度量方法是Big-O复杂性。这是一个非常有用的度量,但不幸的是,Big-O复杂性根本不能度量性能。相反,随着问题规模的扩大,它是一种描述算法行为的方法

说明,考虑这些算法将B个数字加在一起:

    int sum(int[] input) {
        int sum = 0;
        for (int i = 0; i < input.size(); i++) {
            sum += input[i];
        }
        return i;
    }

    int sum(int[] input) {
        int tmp = p(1000);  // calculates the 1000th prime number
        int sum = 0;
        for (int i = 0; i < input.size(); i++) {
            sum += input[i];
        }
        return i;
    }
int和(int[]输入){
    int sum(int[] input) {
        int sum = 0;
        for (int i = 0; i < input.size(); i++) {
            sum += input[i];
        }
        return i;
    }

    int sum(int[] input) {
        int tmp = p(1000);  // calculates the 1000th prime number
        int sum = 0;
        for (int i = 0; i < input.size(); i++) {
            sum += input[i];
        }
        return i;
    }