正如我在另一个问题中读到的,int 的性能比 long 好得多,比 string 的性能好一点。
假设我有一个大于 int 的数字,我想用它来与类似的数字进行比较:对于这种情况,哪种类型的变量具有更好的性能?长还是字符串?
例如比较 111.222.333.444 和 555.666.777.888:
long x = 111222333444;
long y = 555666777888;
if(x == y){ /*code*/ }
对比
string x = "111222333444";
string y = "555666777888";
if(x.equals(y)){ /*code*/ }
哪种情况下性能最好?差异显着?
最佳答案
As I read in another questions, int has a much better performance than a long ...
那么您所读到的可能是错误的。或者更有可能的是,您从阅读的内容中理解的内容是错误的。
的确,在某些机器上,long
的算术运算 可能 比类似的 int
运算花费更长的时间。但是在现代机器上,可能没有区别(对于算术本身),即使有区别也只有 1 或 2 个时钟周期;即纳秒。
所以“好多了”有点夸张。
... and a little better performance than a string.
这也是错误的。事实上,对 int
值的操作将比对 String
对象的操作快很多。例如,考虑
String x = "111222333444";
String y = "555666777888";
if (x.equals(y)) { /*code*/ }
equals
方法将执行以下操作:
- 测试是否
x == y
并返回true
。 - 测试
y
是否为字符串,如果不是则返回false
。 - 测试 2 个字符串的长度是否相同,如果不同则返回
false
。 - 遍历字符串中的字符,比较相同位置的字符,如果不相等则返回
false
。 - 如果循环结束但没有找到不相等的字符,则返回
true
。
加上方法调用的开销(太大而无法内联)。
我们正在谈论(我估计)至少 20 到 30 条机器指令,如果两个字符串相等,或者在开始时相等,则更多。
相比之下,x == y
使用 int
或 long
只是一条指令1。
然而,这里还有一个更重要的问题。
很可能您实际上是在浪费时间。除非您对数百万 个数字执行这些操作,否则性能差异很可能不会很明显。
我的建议是:
- 除非迫不得已,否则不要优化。
- 除非万不得已,否则不要想这种事情。
- 如果您确实必须这样做(即您有真实的、硬性的性能数据表明您的代码太慢),那么请科学地进行。编写一些涉及在 >>real<< 数据上运行 >>real<< 代码的基准测试,并使用配置文件找出代码实际花费大部分时间的地方。然后只优化那部分代码。
1 - 我不是指令级性能方面的专家,但是 this document似乎是说 Intel CMP
指令需要 1、2 或 3 个时钟周期。
关于java - 字符串与 Java 中的长性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34376955/