- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
在开发我的应用程序时,我遇到了一些比较的东西:
string str = "12345";
int j = 12345;
if (str == j.ToString())
{
//do my logic
}
我在想上面的东西也可以用:
string str = "12345";
int j = 12345;
if (Convert.ToInt32(str) == j)
{
//do my logic
}
所以我开发了一个示例代码来测试哪个性能更好
var iterationCount = 1000000;
var watch = new Stopwatch();
watch.Start();
string str = "12345";
int j = 12345;
for (var i = 0; i < iterationCount; i++)
{
if (str == j.ToString())
{
//do my logic
}
}
watch.Stop();
第二个:
var iterationCount = 1000000;
var watch = new Stopwatch();
watch.Start();
string str = "12345";
int j = 12345;
for (var i = 0; i < iterationCount; i++)
{
if (Convert.ToInt32(str) == j)
{
//do my logic
}
}
watch.Stop();
在运行上述两个测试时,我发现上述测试给出的时间几乎相同。我想讨论哪种方法更好?还有比上面两个更好的其他方法吗?
最佳答案
您的测试存在根本性缺陷。编译器和运行时真的很聪明,会在编译时和运行时(JIT-ing)优化代码。在这种情况下,您每次都在做同样的事情,这将被编译器发现并优化掉,因此每种方法的时间安排都是相似的。
试试这个版本(我只有 .Net 2.0,因此有细微的变化):
using System;
using System.Collections.Generic;
using System.Text;
using System.Diagnostics;
namespace ToStringTest
{
class Program
{
const int
iterationCount = 1000000;
static TimeSpan Test1()
{
Stopwatch watch = new Stopwatch();
watch.Start();
string str = "12345";
int j = 12345;
for (int i = 0; i < iterationCount; i++)
{
if (str == i.ToString())
{
//do my logic
}
}
watch.Stop();
return watch.Elapsed;
}
static TimeSpan Test2()
{
Stopwatch watch = new Stopwatch();
watch.Start();
string str = "12345";
int j = 12345;
for (int i = 0; i < iterationCount; i++)
{
if (Convert.ToInt32(i) == j)
{
//do my logic
}
}
watch.Stop();
return watch.Elapsed;
}
static void Main(string[] args)
{
Console.WriteLine("ToString = " + Test1().TotalMilliseconds);
Console.WriteLine("Convert = " + Test2().TotalMilliseconds);
}
}
}
你会看到巨大的不同。一个比另一个快两个数量级。很明显是哪一个。
您需要知道各种操作在做什么,以便从根本上了解哪个操作更快。
将字符串转换为 int 需要以下条件:
total = 0
for each character in string
total = total * 10 + value of charater
并且 ToString 需要:
string = ""
while value != 0
string.AddToFront value % 10
value /= 10
对于 CPU 而言,乘法比除法更容易、更快。如果要选择具有大量乘法的算法与具有大量除法的算法,请始终选择前者,因为它总是更快。
然后是比较,int - int 比较很简单,将每个值加载到寄存器中并进行比较 - 几条机器指令就完成了。两个字符串之间的比较需要一次测试字符串中的每个字符——在您给出的示例中,它是 5 个字节(一个 int 可能是 4 个字节),这是更多的内存访问。
关于c# - 哪个是快速比较 : Convert. ToInt32(stringValue)==intValue 或 stringValue==intValue.ToString(),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1917427/
在 int 列上,做...之间有区别吗? SELECT .. int = '1' 和 SELECT .. int = 1,哪个更好? 最佳答案 使用int = 1,因为int = '1'在内部转换为i
在开发我的应用程序时,我遇到了一些比较的东西: string str = "12345"; int j = 12345; if (str == j.ToString())
嘿,我有一个数字数组列表,当我尝试转换为 int 时,我得到 The method intValue() is undefined for the type Object 错误。这是代码片段。 whi
我有一个用 Java 计算 Lisp 表达式的程序,但我遇到了一个奇怪的错误。 首先,这是程序: import java.util.Queue; import java.util.LinkedList
我在大学的一项任务中确实面临着一个问题: public class Num { Integer x; Integer y; public Num(Integer x, Inte
这个问题不太可能对任何 future 的访客有帮助;它只与一个较小的地理区域、一个特定的时间点或一个非常狭窄的情况相关,通常不适用于全世界的互联网受众。如需帮助使此问题更广泛适用,visit the
我正在解决一个问题,我不明白为什么它不起作用。如何通过 double obj 传递变量并转换为 int? 为什么它在顶部代码片段中不起作用,但在该行下方的底部代码片段中起作用? 唯一的区别似乎是添加了
我正在尝试为私有(private)双变量创建一个 get 方法。 当我写作时 public class { private double x = 4.12; public int get(){
我有一个 Number 对象并调用“intValue()”,它将返回一个 Integer 值。但是,如果该值大于 Integer.MAX_VALUE,则该方法将进行舍入。没关系,但我想知道函数是否轮换
如果 UIText 字段中输入的值低于 200,则会生成警报。 如果用户在字段中添加 > 以表示其大于 200,则仍会触发警报。显然我不想要这个,所以我需要某种方法来忽略这个标点符号,甚至更好地忽略所
考虑下面的代码 id j = @"123"; NSUInteger a = [j unsignedIntValue]; // not working NSUInteger b = [j intValu
我使用以下代码获取最大值: NSArray *allValues = @[ [NSNumber numberWithInt:20], [NSNumbe
我在使用 BigDecimal 类的 intValue() 时遇到了一个奇怪的 java 错误。 我的起始值为 3300028000。 当我调用下面的代码时: int i = d.intValue()
我有一个 swift 3 的问题,它不会出现在 swift 2 上。我读取一个 json 值,并调用函数 intValue (integerValue of swift 2 ) 和 xcode 我得到
这段代码 Double dbl = 254.9999999999999; Integer integ = dbl.intValue(); System.out.println(integ); 显示 2
显式编码拆箱已包装的原始数值。在Java5及以上的版本,拆箱是不必要的,可以安全地删除。那么 JDK5 到底做了啥? 自动装箱(auto-boxing)与自动拆箱(auto-unboxing) Jav
我创建了一个如下所示的 IBAction: - (IBAction)okButton:(id)sender { NSLog(@"%d",[sender intValue]); } 当我重复单击
import java.util.ArrayList; public class Averager { private ArrayList list; public Averager()
NSString 的文档没有提到调用 intValue 方法时引发的任何异常。如果没有其他具有 Objective-C 专业知识的人确认即使字符串是字母数字也不会引发异常,我觉得有点难以置信。 (ps
- (void)touchesEnded:(NSSet *)touches withEvent:(UIEvent *)event { int num = 5; [viewControl
我是一名优秀的程序员,十分优秀!