-7

在java数据类型(byte,short,int,float,double,boolean)中是编译和计算最快的数据类型,为什么?请清楚地列出原因以便理解

4

2 回答 2

7

为什么这有关系?您的速度问题不会归结为您使用的原始类型,过早优化是万恶之源。我几乎可以保证您使用的原始类型不会影响程序的速度。根据您的用途选择您的类型!

于 2013-10-03T09:05:19.497 回答
2

类型之间的唯一性能差异是浮点算术与整数算术计算,其中整数计算明显且可测量地更快。

经验法则 - 如果您的数据可以自然地表示为整数(例如商店中香蕉的数量),请选择一些整数类型(byte, short, int, long)。如果您的数据表示为实数(您购买的香蕉公斤数),请选择floatdouble

每种类型都有其细节,您需要了解它们的范围,如果您要分配数百万个类型,则需要了解它们的内存占用。


编辑处理 OP 的评论:

你能告诉我为什么整数计算更快吗?

首先,我不得不承认我所说的在理论上是不正确的。这完全取决于您将在其上运行代码的计算机的体系结构。

不过,一般来说,该声明适用于当前的现代 PC 兼容处理器。这一切都归结为数字的内部表示(搜索整数值的二进制补码和浮点数的尾数和指数)和处理器的内部机制,它们的计算单元和一些操作的快捷方式。这至少是几门课的主题。

过度简化表明使用整数进行计数更容易,因为它们的存储和处理方式比浮点数更容易。

也不要忘记这在不同的处理器和不同的架构上会有所不同。

我写了一个简单的测试来显示我的结果:

private final static int MAX = 1_000_000_000; 

public static void main(String[] args) {
    long time;  // no see

    time = System.currentTimeMillis();
    int intnum = 0;
    for (int i = 0; i < MAX; i++) {
        intnum += i;
    }
    System.out.println("int:\t" + (System.currentTimeMillis() - time));

    time = System.currentTimeMillis();
    long longnum = 0;
    for (int i = 0; i < MAX; i++) {
        longnum += i;
    }
    System.out.println("long:\t" + (System.currentTimeMillis() - time));

    time = System.currentTimeMillis();
    float floatnum = 0;
    for (int i = 0; i < MAX; i++) {
        floatnum += i;
    }
    System.out.println("float:\t" + (System.currentTimeMillis() - time));

    time = System.currentTimeMillis();
    double doublenum = 0;
    for (int i = 0; i < MAX; i++) {
        doublenum += i;
    }
    System.out.println("double:\t" + (System.currentTimeMillis() - time));

    // just to use the values, don't pay attention to the results
    System.out.println();
    System.out.println(intnum);
    System.out.println(longnum);
    System.out.println(floatnum);
    System.out.println(doublenum);
}

我的 32 位处理器上的结果:

int:    578 ms
long:   1578 ms
float:  3156 ms
double: 3172 ms

虽然像这样的基准很难正确(而且我什至没有尝试太多),但这个基准相当准确地描述了我的真实世界体验。

整数是最快的,然后是long浮点类型。

如果我有一个 64 位处理器、操作系统和 JVM,int并且long可能处于同一级别(就像我floatdoublePC 上一样)。

于 2013-10-03T09:10:56.347 回答