ast*_*eri 6 java performance primitive downcast
我正在编写一个大型应用程序,我试图尽可能多地保存内存并提高性能.因此,当我有一个我知道的字段只有0 - 10或-100 - 100的值时,我尝试使用short
数据类型而不是int
.
但是,对于其余的代码来说,这意味着,当我调用这些函数时,我必须将简单的int
s 转发为short
s.例如:
方法签名
public void coordinates(short x, short y) ...
Run Code Online (Sandbox Code Playgroud)
方法调用
obj.coordinates((short) 1, (short) 2);
Run Code Online (Sandbox Code Playgroud)
这就像我的整个代码中的所有代码一样,因为文字被视为int
s并且不会根据函数参数自动向下转换或键入.
因此,一旦这种向下转发发生,任何性能或内存增益是否真的显着?或者转换过程如此高效,以至于我仍能获得一些收益?
Sec*_*att 10
在32位平台上使用short与int没有性能优势,除了short []与int []之外的所有情况 - 即使这样,缺点通常也超过了专业人士.
假设您在x64,x86或ARM-32上运行:
使用SHORT和INT 的唯一好处是在分配它们的数组的情况下.在这种情况下,N个短路的数组大约是N个 int 的数组的一半.
除了在大量短路中复杂但本地化数学的情况下将变量放在热循环中所带来的性能优势之外,您将永远不会看到使用SHORTS与INT相比的好处.
在所有其他情况下 - 例如短路用于字段,全局,参数和本地,除了它可以存储的位数之外,SHORT和INT之间没有区别.
我的建议一如既往地建议在使代码更难以阅读和更人为限制之前,尝试使用BENCHMARKING代码来查看内存和CPU瓶颈的位置,然后解决这些问题.
我强烈怀疑,如果你曾经遇到过你的应用程序使用整数而不是短路的情况,那么你就可以在很长一段时间内抛弃Java以获得更少的内存/ CPU饥饿运行时间,所以提前完成所有这些工作是浪费精力.
据我所知,演员本身应该没有运行时成本(是否使用short
而不是int
实际提高性能是有争议的,并取决于您的应用程序的细节).
考虑以下:
public class Main {
public static void f(short x, short y) {
}
public static void main(String args[]) {
final short x = 1;
final short y = 2;
f(x, y);
f((short)1, (short)2);
}
}
Run Code Online (Sandbox Code Playgroud)
最后两行main()
编译为:
// f(x, y)
4: iconst_1
5: iconst_2
6: invokestatic #21 // Method f:(SS)V
// f((short)1, (short)2);
9: iconst_1
10: iconst_2
11: invokestatic #21 // Method f:(SS)V
Run Code Online (Sandbox Code Playgroud)
如您所见,它们完全相同.演员阵容发生在编译时.