- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我需要比较一个字符串(它是一个有效的整数)和一个 int 值。
对于String str
,int integer
,我的选择是:
Integer.parseInt(str) == integer
str.equals(Integer.toString(integer))
哪个更快,有没有更好的方法?
以下灵感来自atlaste的回答EqualsIntString
private static boolean checkEquality(final String string, final long value) {
if (string == null) {
return false;
}
final int length = string.length();
if (length == 0) {
return false;
}
long absValue;
final byte minIndex;
if (string.charAt(0) == '-') {
if (value > 0) {
return false;
}
absValue = -value;
minIndex = 1;
} else {
if (value < 0) {
return false;
}
absValue = value;
if (string.charAt(0) == '+') {
minIndex = 1;
} else {
minIndex = 0;
}
}
for (int idx = length - 1; idx >= minIndex; idx--) {
final byte rem = (byte) (absValue % 10);
absValue /= 10;
final int diff = string.charAt(idx) - rem - 48;
if (diff != 0) {
return false;
}
}
return absValue == 0;
}
最佳答案
只有一种方法可以知道:测量。
快速的 JMH 基准测试显示 Integer.parseInt
更快,无论整数的大小如何。但我们谈论的是 10 纳秒左右,它不太可能对您的应用程序级别产生太大影响。
如果您100%确定您的字符串是一个有效的整数,您也可以手动解析它,这样会更快(参见parseManual
和下面代码中的 equalsIntString
方法)。使用哪种方法还取决于您是否期望值经常相等或经常不同(如果它们经常相等,parseManual
效果更好,如果您期望它们平均不同, equalsIntString
更快)。
因此,数据集的特征在决策中也很重要。
完整结果(分数以每次操作的纳秒为单位:越小越好)- (n)
列是正在比较的整数。第一部分比较等值,第二部分比较不等值。
Benchmark (n) Mode Samples Score Error Units
c.a.p.SO30507506.manual 1 avgt 10 6.579 ± 0.131 ns/op
c.a.p.SO30507506.manual 12345 avgt 10 10.017 ± 0.401 ns/op
c.a.p.SO30507506.manual 123456789 avgt 10 12.490 ± 0.243 ns/op
c.a.p.SO30507506.manualAtlaste 1 avgt 10 7.914 ± 0.144 ns/op
c.a.p.SO30507506.manualAtlaste 12345 avgt 10 15.902 ± 0.593 ns/op
c.a.p.SO30507506.manualAtlaste 123456789 avgt 10 28.117 ± 0.463 ns/op
c.a.p.SO30507506.parse 1 avgt 10 8.495 ± 0.325 ns/op
c.a.p.SO30507506.parse 12345 avgt 10 21.614 ± 0.564 ns/op
c.a.p.SO30507506.parse 123456789 avgt 10 34.692 ± 0.572 ns/op
c.a.p.SO30507506.stringEquals 1 avgt 10 21.597 ± 0.594 ns/op
c.a.p.SO30507506.stringEquals 12345 avgt 10 36.948 ± 1.144 ns/op
c.a.p.SO30507506.stringEquals 123456789 avgt 10 44.444 ± 1.011 ns/op
c.a.p.SO30507506.manual_unequal 1 avgt 10 7.011 ± 0.149 ns/op
c.a.p.SO30507506.manual_unequal 12345 avgt 10 10.244 ± 0.350 ns/op
c.a.p.SO30507506.manual_unequal 123456789 avgt 10 13.135 ± 0.797 ns/op
c.a.p.SO30507506.manualAtlaste_unequal 1 avgt 10 4.328 ± 0.111 ns/op
c.a.p.SO30507506.manualAtlaste_unequal 12345 avgt 10 4.359 ± 0.115 ns/op
c.a.p.SO30507506.manualAtlaste_unequal 123456789 avgt 10 4.339 ± 0.103 ns/op
c.a.p.SO30507506.parse_unequal 1 avgt 10 8.304 ± 0.251 ns/op
c.a.p.SO30507506.parse_unequal 12345 avgt 10 21.514 ± 0.405 ns/op
c.a.p.SO30507506.parse_unequal 123456789 avgt 10 35.257 ± 1.043 ns/op
c.a.p.SO30507506.stringEquals_unequal 1 avgt 10 19.060 ± 0.162 ns/op
c.a.p.SO30507506.stringEquals_unequal 12345 avgt 10 31.829 ± 0.427 ns/op
c.a.p.SO30507506.stringEquals_unequal 123456789 avgt 10 41.870 ± 0.252 ns/op
代码:
@State(Scope.Benchmark)
@BenchmarkMode(Mode.AverageTime)
public class SO30507506 {
@Param({"1", "12345", "123456789"}) int n;
int i;
String s;
@Setup public void setup() {
i = n;
s = String.valueOf(n);
}
@Benchmark public boolean parse() {
return Integer.parseInt(s) == i;
}
@Benchmark public boolean stringEquals() {
return s.equals(Integer.toString(i));
}
@Benchmark public boolean manual() {
return parseManual(s) == i;
}
@Benchmark public boolean manualAtlaste() {
return equalsIntString(i, s);
}
@Benchmark public boolean parse_unequal() {
return Integer.parseInt(s) == i * 2;
}
@Benchmark public boolean stringEquals_unequal() {
return s.equals(Integer.toString(i * 2));
}
@Benchmark public boolean manual_unequal() {
return parseManual(s) == i * 2;
}
@Benchmark public boolean manualAtlaste_unequal() {
return equalsIntString(i * 2, s);
}
private static int parseManual(String s) {
int result = 0;
int sign = s.charAt(0) == '-' ? -1 : 1;
int startIndex = (s.charAt(0) >= '0' && s.charAt(0) <= '9') ? 0 : 1;
for (int i = startIndex; i < s.length(); i++) {
result *= 10;
result += s.charAt(i) - '0';
}
return result * sign;
}
private static boolean equalsIntString(int value, String s) {
if (s.isEmpty()) return false; // This is never good.
if ((s.charAt(0) == '-' && value >= 0) || (s.charAt(0) != '-' && value < 0)) return false; // positive/negative check
// Define the limit. This is basically the end of the string to check.
int limit = 0;
if (value < 0) {
limit = 1;
value = -value;
}
for (int i = s.length() - 1; i >= limit; --i) {
char expected = (char) ('0' + (value % 10)); // the modulo will be optimized by the JIT because 10 is a constant
value /= 10; // same story.
if (s.charAt(i) != expected) return false;
}
return true;
}
}
关于java - 字符串到 int 或 int 到字符串 : which is faster?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30507506/
Strassen 的算法在多项式上比 n 次方正则矩阵乘法快。 “多项式更快”是什么意思? 最佳答案 您的问题与“复杂性”的理论概念有关。例如,据说正则矩阵乘法的复杂度为 O(n^3)。这意味着随着维
就目前情况而言,这个问题不太适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、民意调查或扩展讨论。如果您觉得这个问题可以改进并可能重新开放,visit
假设我有两个 PHP 语句: echo "foo"."bar" echo "foo", "bar" 注意连接字符串的不同方式 - 使用 . 或 ,. 我意识到这两种方法之间的实际区别,使用 , 为关键
我有一个 RGB 图像,并尝试将 RGB 上的每个像素设置为黑色,其中相应的 alpha 像素也为黑色。所以基本上我试图将 Alpha“烘焙”到我的 RGB 中。我已经尝试使用 PIL 像素访问对象、
可能这个问题以前已经以许多不同的方式回答过很多次了。然而,我一直在寻找更具体的东西。通用词典,我相信比哈希表更快,因为它们不需要经历装箱/拆箱的过程。 但是,哈希表不是经过排序的,这意味着搜索可以更快
以这种方式加入给定的选择会更快吗 select ... join table1 on condition1 join table2 on condition2 然后这个 select ... join
我观看了演讲并阅读了博客文章,但我仍然不确定...这是为什么 template struct conditional { template using f = T; }; template<> str
我想知道用离散数据集编码的二维图形。对我来说,似乎由于计算机以离散集合运行,所以对图形做同样的事情也许更有意义。 例如,与其让一条线由两个 vector 表示,让计算机整理出像素配置,然后必须用代数方
我正在开发一个将大量数据写入磁盘的 C++ 程序。以下函数对数据进行 gzip 压缩并将其写入文件。压缩数据约为100GB。压缩并写出数据的函数如下: void constructSNVFastqD
我最近遇到了这段SQL: SELECT members.id FROM members, members_to_groups WHERE members.id = members_to_groups.
所以我一直在研究 pthreads,特别是尝试计算两个矩阵的乘积。我的代码非常困惑,因为它本应是我自己的一个快速有趣的小项目,但我使用的线程理论非常类似于: #include #include #
我看到了被选中的answer对此post . 我很惊讶 (x & 255) == (x % 256) 如果 x 是无符号整数,我想知道总是替换 % 是否有意义& in x % n for n = 2^
Anaconda是什么? Anaconda 是一个开源的 Python 发行版本,主要面向数据科学、机器学习和数据分析等领域。它不仅包含了 Python 解释器本身,更重要的是集成了大量的用于科学计
我正在使用Ubuntu 14.04操作系统的g2.8xlarge EC-2实例上启用cuDNN的情况下运行py-faster-rcnn。一切都已编译,似乎工作正常。我通过以下方式登录到远程实例: ss
要求用户输入的简单程序可以使用 datainputstream 或扫描仪。哪个会更快? Datainputstream 是二进制的,所以它可能更快?有意见吗?我只是很好奇,因为我正在构建一个程序,我希
我正在 INRIA Person 数据集上训练 Faster-RCNN(VGG-16 架构)。我接受了 180,000 个训练步骤的训练。但是当我评估网络时,它会用相同的图像给出不同的结果。以下是图片
我是 python 新手,我为 Hackerrank 问题提交了此代码 Arrays and Simple Queries ,但对于大量测试用例,程序“由于超时而终止”。我怎样才能提高效率? 我已将主
如果将程序分成头文件和源文件,如果提供给智能编译管理器,可能会受益于更快的编译,这就是我正在研究的内容。 理论工作的意愿:为每个源文件创建一个线程并一次将每个源文件编译成目标文件。然后将这些目标文件链
方法一: SELECT * FROM `wordpressusers` WHERE user_login='user10000001' PhpMyadmin 的结果: 方法2: SELECT user
据我所知set.add使用FastFloat的equals方法 对我来说重要的只是点后的前两位数(!!!),所以在 equals 方法中我使用 Math.abs() >= 0.001 来使 equal
我是一名优秀的程序员,十分优秀!