gpt4 book ai didi

c# - 哪个是快速比较 : Convert. ToInt32(stringValue)==intValue 或 stringValue==intValue.ToString()

转载 作者:可可西里 更新时间:2023-11-01 08:14:32 25 4
gpt4 key购买 nike

在开发我的应用程序时,我遇到了一些比较的东西:

    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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com