以下哪项是java中最快的数据类型?

时间:2013-10-03 09:02:06

标签: java

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

2 个答案:

答案 0 :(得分:6)

为什么重要?你的速度问题不会归结为你正在使用的原始类型,过早优化是所有邪恶的根源。我几乎可以保证您使用的原始类型不会影响程序的速度。根据您需要使用的类型选择您的类型!

答案 1 :(得分:1)

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

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

每一种类型都有其特定性,你需要了解它们的范围,如果你要分配数百万种,那就是它们的内存占用。


编辑解决OP的评论:

  

请告诉我为什么整数计算更快?

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

一般来说,该声明适用于当前的现代PC兼容处理器。这一切都归结为数字的内部表示(搜索Two's complement表示整数值,Mantissa and exponent表示浮点数)和处理器的内部机制,它们的计算单位和某些操作的快捷方式。这至少是几个课程的主题。

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

另外请不要忘记,这在不同的处理器和不同的架构上会有所不同。

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

double

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

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);
}

虽然benchmarks like this are hard to get right(我甚至没有尝试太多),但这个相当精确地描述了我的真实世界经历。

整数是最快的,然后是int: 578 ms long: 1578 ms float: 3156 ms double: 3172 ms ,然后是浮点类型。

如果我有一个64位处理器,操作系统和JVM,longint可能会处于同一级别(就像longfloat一样我的电脑)。