java - 字符串与 Java 中的长性能

标签 java string performance comparison long-integer

正如我在另一个问题中读到的,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 方法将执行以下操作:

  1. 测试是否 x == y 并返回 true
  2. 测试 y 是否为字符串,如果不是则返回 false
  3. 测试 2 个字符串的长度是否相同,如果不同则返回 false
  4. 遍历字符串中的字符,比较相同位置的字符,如果不相等则返回false
  5. 如果循环结束但没有找到不相等的字符,则返回 true

加上方法调用的开销(太大而无法内联)。

我们正在谈论(我估计)至少 20 到 30 条机器指令,如果两个字符串相等,或者在开始时相等,则更多。

相比之下,x == y 使用 intlong 只是一条指令1


然而,这里还有一个更重要的问题。

很可能您实际上是在浪费时间。除非您对数百万 个数字执行这些操作,否则性能差异很可能不会很明显。

我的建议是:

  • 除非迫不得已,否则不要优化。
  • 除非万不得已,否则不要这种事情。
  • 如果您确实必须这样做(即您有真实的、硬性的性能数据表明您的代码太慢),那么请科学地进行。编写一些涉及在 >>real<< 数据上运行 >>real<< 代码的基准测试,并使用配置文件找出代码实际花费大部分时间的地方。然后只优化那部分代码。

1 - 我不是指令级性能方面的专家,但是 this document似乎是说 Intel CMP 指令需要 1、2 或 3 个时钟周期。

关于java - 字符串与 Java 中的长性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34376955/

相关文章:

java - Collection接口(interface)Java教程中的错误

java - 从命令行注入(inject) map

javascript - 检查字符串的某个部分是否包含子字符串

java - 无法将 String 转换为 int,但两者都是字符串?

c++ - 结构和类之间的区别?

c++ - 是四舍五入进行float-double比较的正确方法

mysql - php排序比mysql "order by"好吗?

Java:覆盖子类中的抽象方法

java - 从文本文件中读取

php - 增加实时观看次数的最快方法是什么?