【发布时间】:2013-12-04 08:57:08
【问题描述】:
当我们知道循环的确切数量时,使用 byte/short 作为计数器变量是一种好习惯吗? 例如
for (byte i = 1; i <= 26; i++)
对
for (short i = 1; i <= 26; i++)
对
for (int i = 1; i <=26; i++)
【问题讨论】:
当我们知道循环的确切数量时,使用 byte/short 作为计数器变量是一种好习惯吗? 例如
for (byte i = 1; i <= 26; i++)
对
for (short i = 1; i <= 26; i++)
对
for (int i = 1; i <=26; i++)
【问题讨论】:
它更容易令人困惑而不是有用。大多数开发人员希望看到 int 值,而您的 CPU 中只有 32 位或 64 位寄存器,因此它不会改变您的程序的工作或执行方式。
有许多可行的方法对您的程序无害,但您需要考虑可怜的开发人员,他们必须在以后阅读并理解它,这可能是 6 个月后的您。 ;)
即使性能更快,也不值得做出这样的改变,除非它明显更快。考虑一下这种变化。
for (byte i = 1; i <= 120; i++)
或
for (byte i = 1; i <= x; i++)
你可能认为这很好,因为 200
你必须提出问题;如果您增加以后引入错误的风险,它必须要快多少?
通常的答案是它必须以我测量的方式(不仅仅是你改变的一点)使我的整个程序显着更快,而且我必须需要它显着更快。
【讨论】:
简答:不。
长答案:不,因为 CPU 已针对整数运算进行了优化。如果您使用字节或短字节,CPU 必须经常将其转换为整数并返回,通常是通过应用位掩码。
【讨论】:
当您对短变量或字节变量执行某些操作时,您必须将其显式类型转换回 java 中所需的类型。所以最好用int代替byte和short。 示例:
short s = 0;
s= (short) (s+10);
如果不将其类型转换为 int,则会引发编译时错误:Type mismatch: cannot convert from int to short 所以最好使用 int。
【讨论】:
不,不是。
byte 和 short 变量此时为 32bit/64bit 大小,VM 针对 int 进行了优化。
“过早的优化是万恶之源”
【讨论】:
如果数据类型的范围不超过您的方案。两种情况都没有问题。
但int 是首选。
【讨论】:
它还需要一行内存,通常为 4 或 8 个字节。 这意味着也不会优化内存使用。
此外,如果您的系统使用碎片算法将内存行划分为这些值的部分寻址,则其寻址算法将花费很多!
【讨论】:
作为一个起点,使用int,这可能是架构的本机,在将i 与其他零碎进行比较时,您将避免可能的隐式转换。所以我敢打赌byte 和short 最终都会变慢。
更可爱的优化是使用++i 而不是i++,因为前者永远不会比后者慢。 (概念上i++ 必须返回一个副本,即使它会被一个好的 java 编译器优化出来)。
【讨论】: