我需要将很多整数值与等式进行比较。
哪种方法最快?
A)
int a1 = 12345;
int a2 = 54321;
if(a1 == a2)
{
//do something.
}
B)
int a1 = 12345;
int a2 = 54321;
if( (a1 ^ a2) == 0 )
{
//do something.
}
答案 0 :(得分:8)
我怀疑无论如何首先实际上更快。这并不是比较两个整数的相等是一种不常见的操作,所以我认为它得到了很好的支持:)但是,更重要的是它更多,更具可读性。
对我来说似乎不太可能比较整数是否是你的瓶颈。如果你真的觉得它是,那么无论如何都要将你所拥有的东西作为现实情况进行基准测试,然后尝试各种变化(可能是异或,也许是减法等)并重新测量。但是,确保在花时间摆脱最明显,简单易读的代码之前,确实已经得到了一些你需要修复的东西。
答案 1 :(得分:5)
回答这样的问题的唯一方法是在特定的应用程序和环境中测量它。
但是先做,不要担心。在C#中你没有什么可能做的,这将成为一个问题。
如果你处于一个奇怪的角色表现,你真的比MS工具团队更了解如何比较整数,那么你应该用汇编语言写作。
就个人而言,我无法想象一个场景,即紧密循环中两个整数的比较会占据你的时间 - 循环和分支开销将与比较成本相似或更高,即便如此,这也是假设数据块神奇地出现在CPU缓存中,没有任何分页或内存I / O成本。
像比较(以及设置为零和乘以2的乘法)这样的操作的洛可可替换不适合于适当的商业工具链(craptastic嵌入式C编译器可能仍然需要它们)以获得最佳部分20年。现在是时候停止思考它们了。
答案 2 :(得分:1)
第一个。因为它们都执行比较操作(==),但第二个操作使用额外的XOR操作。
答案 3 :(得分:1)
我已经编写了一些代码来验证这一点。
static void Main( string[] args )
{
int a1 = 123456;
int a2 = 654321;
int a3;
var t = new System.Diagnostics.Stopwatch();
t.Start();
for ( int i = 0; i < int.MaxValue; i++ )
{
if ( a1 == a2 )
{
a3 = a1 + a2;
}
}
t.Stop();
Console.WriteLine( t.ElapsedMilliseconds );
t.Reset();
t.Start();
for ( int i = 0; i < int.MaxValue; i++ )
{
if ( ( a1 ^ a2 ) == 0 )
{
a3 = a1 + a2;
}
}
t.Stop();
Console.WriteLine( t.ElapsedMilliseconds );
Console.ReadKey();
}
结果是下一个:
对于第一个 6275 毫秒
对于第二个 6277 毫秒
看起来这些方法的工作原理相同。
感谢您的回答。