正如我在另一个问题中所读到的那样,int比一个字符串具有更好的性能,而且性能稍好一些.
假设我有一个大于int的数字,我想用它来与相似的数字进行比较:什么类型的变量对这种情况有更好的表现?长还是字符串?
例如,将111.222.333.444与555.666.777.888进行比较:
long x = 111222333444; long y = 555666777888; if(x == y){ /*code*/ }
VS
string x = "111222333444"; string y = "555666777888"; if(x.equals(y)){ /*code*/ }
哪种情况有最好的表现?差异很大?
正如我在另一个问题中读到的那样,int的性能比长期好得多......
你读过的内容可能是错的.或者更可能的是,你从所读的内容中理解的是错误的.
确实,在某些机器上,a上的算术运算long
可能需要比类似int
操作更长的时间.但是在现代机器上,可能没有差别(对于算术本身而言),即使存在差异,也只有1或2个时钟周期; 即纳秒.
所以"好多了"是夸大其词.
......比字符串表现更好一点.
那也是错的.实际上,对int
值的操作比String
对象上的操作要快得多.例如,考虑一下
String x = "111222333444"; String y = "555666777888"; if (x.equals(y)) { /*code*/ }
该equals
方法将执行以下操作:
测试是否x == y
返回true
.
测试if y
是否为String,false
如果不是则返回.
测试2个字符串的长度是否相同,false
如果不是则返回.
循环遍历字符串中的字符,比较同一位置的字符,false
如果它们不相等则返回.
返回true
如果循环结束,没有发现不相等的字符.
加上方法调用的开销(太大而不能内联).
我们正在讨论(我估计)20到30个机器指令,如果两个字符串相等或者在开始时相等则更多.
相比之下,x == y
使用int
或long
只是一条指令1.
但是,这里有一个更重要的观点.
你实际上是在浪费时间在这里.除非你为数百万的数字进行这些操作,否则性能的差异可能不会引人注意.
我的建议是:
除非必须,否则不要进行优化.
除非必须,否则甚至不要考虑这种事情.
如果你必须(即你有真实的硬性能数字来表示你的代码太慢),那么就要科学地做.写一些基准测试,包括在>> real << data上运行>> real << code,并使用一个配置文件来确定代码实际花费大部分时间的位置.然后只优化代码的那些部分.
1 - 我不是指令级性能的专家,但是本文档似乎说英特尔CMP
指令需要1个,2个或3个时钟周期.