- 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/
在开发我的应用程序时,我遇到了一些比较的东西: string str = "12345"; int j = 12345; if (str == j.ToString())
func GetTheTime() { let calendar = NSCalendar.current let date = Date() _ = Calendar.cur
我有一个类,用于在数组中设置对象。在这个类中,我有一个自定义的“initWithDictionary”,我在其中解析 JSON 字典。但是,当我遇到 NSNull 时,这会使我的应用程序崩溃。为了解决
我有一个 XML 文档,其中包含长度超过 90,000 个字符的元素*。 NSXMLNode* node = ...; NSString* val = [node stringValue]; // t
你好, swift 苏丹! 虽然我经常使用 C、C++ 和 C#,但我还是 Swift 新手。我遇到了一个让我非常困惑的情况。我将在这里发布一个代码片段: @IBAction func myFunc(
我正在尝试迭代文本字段中的每个字符, 我是这样做的: @IBOutlet var needTranslate : NSTextField for i in needTranslate.stringVa
无法从其 StringValue 属性解析为枚举对象。 枚举: public enum StatusColor { [StringValue("#FFFFFF")] None,
所以我有以下代码在 XCode 中导致运行时错误 NSString* temp = [[param objectforkey@"firstParam"] stringValue]; int tempN
我有一个标准的表格 View ,其主 Nib 内有默认设置。我使用数组 Controller 和绑定(bind)来处理 TableView 应向用户显示的数据。我已经实现了“添加”按钮插入新行并将第一
我不明白为什么以下编译: StringValues sv = httpContext.Request.Query["param"]; string s = sv; 据我所知 a可分配给 b仅当 a类型
我创建了一个对话框窗口,其中包含 NSTextField 和 NSSecureTextField(用于用户名和密码),以及要提交的 NSButton。 socket 在 Interface Build
NSLog(@"Status: %@", [[[xmlElement elementsForName:@"status"] objectAtIndex:0] stringValue]);
我是 JS 的新手,我想在另一个函数中调用一个函数。当我尝试它时,我收到了 lint 错误。- stringValues 在数字之间插入逗号以显示正确的格式,对于 1000,它显示为 1,000,对于
我刚刚开始使用一个包含 NSTextField 的 NSWindow 的非常简单的应用程序(还没有真正进入 Objective-C )。 appdelegate.h 有这个: NSWindow *wi
本质上,这是我在 NSTextFieldCell 子类中的代码: - (void)setStringValue:(NSString *)aString { [super setStringVa
我有一个简单的 NSTableView,我已经从 NSMutableArray 加载了数据。当我在 tableView 中选择一行(条目)并修改它时,我可以找到行索引,但我无法得到的是编辑后的条目作为
[measureValue stringValue] 给了我这个异常: Terminating app due to uncaught exception 'NSInvalidArgumentExce
我有一个具有属性 myUsername 和 myPassword 的 User 类,我希望 UI 中的文本字段将字符串值传递给名为 的 AppDelegate 方法链接,它执行一些后台 NSTask
所以我从字段中获取用户名,将其保存在 NSString 变量中: loggedInUser = [usernameField stringValue]; [loginWindow cl
我有一个 NSSecureTextField 类型的密码字段,例如 passwordField 和一个 NSButton。我已将返回键指定为按钮操作触发的等效键。按下按钮后,我得到用户输入的文本作为
我是一名优秀的程序员,十分优秀!