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