在java数据类型(byte,short,int,float,double,boolean)中是编译和计算最快的数据类型,为什么?请清楚地列出原因以便理解
2 回答
为什么这有关系?您的速度问题不会归结为您使用的原始类型,过早优化是万恶之源。我几乎可以保证您使用的原始类型不会影响程序的速度。根据您的用途选择您的类型!
类型之间的唯一性能差异是浮点算术与整数算术计算,其中整数计算明显且可测量地更快。
经验法则 - 如果您的数据可以自然地表示为整数(例如商店中香蕉的数量),请选择一些整数类型(byte
, short
, int
, long
)。如果您的数据表示为实数(您购买的香蕉公斤数),请选择float
或double
。
每种类型都有其细节,您需要了解它们的范围,如果您要分配数百万个类型,则需要了解它们的内存占用。
编辑处理 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
可能处于同一级别(就像我float
的double
PC 上一样)。