Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

C# IL code optimization: conditional operator (?:) and re-assignment of same variable

I was reading C# 7.0 changelog and ran into an example that shows new tuples syntax.

private static (int Max, int Min) Range(IEnumerable<int> numbers)
{
    int min = int.MaxValue;
    int max = int.MinValue;
    foreach(var n in numbers)
    {
        min = (n < min) ? n : min;
        max = (n > max) ? n : max;
    }
    return (max, min);
}

And I got curious if the compiler optimizes lines like min = (n < min) ? n : min; cause min = min operation seems a bit useless. I compiled the code (in release mode) and opened it in ILDASM and saw that min = min assignment was still there.

Is it a tough question for the compiler to skip the assignment? Or maybe it's because of some multi-threading issue?

like image 493
Sergеу Isupov Avatar asked Jul 12 '18 05:07

Sergеу Isupov


People also ask

What C is used for?

C programming language is a machine-independent programming language that is mainly used to create many types of applications and operating systems such as Windows, and other complicated programs such as the Oracle database, Git, Python interpreter, and games and is considered a programming foundation in the process of ...

What is the full name of C?

In the real sense it has no meaning or full form. It was developed by Dennis Ritchie and Ken Thompson at AT&T bell Lab. First, they used to call it as B language then later they made some improvement into it and renamed it as C and its superscript as C++ which was invented by Dr.

What is C in C language?

What is C? C is a general-purpose programming language created by Dennis Ritchie at the Bell Laboratories in 1972. It is a very popular language, despite being old. C is strongly associated with UNIX, as it was developed to write the UNIX operating system.

Is C language easy?

C is a general-purpose language that most programmers learn before moving on to more complex languages. From Unix and Windows to Tic Tac Toe and Photoshop, several of the most commonly used applications today have been built on C. It is easy to learn because: A simple syntax with only 32 keywords.


1 Answers

The way that the conditional operator works is that you always get a value assigned, since the compiler will always expect a value after the '='. Of course the compiler could be written to check whether the left and right hand side is the same, rewriting the variable (right to left) is faster most of the times than using a check to compare the two variables, when taking into account that in most cases a min = min scenario is unlikely and this would only result in an extra check and slow down execution 99.9% of the time.

It's the job of the programmer to determine when to use a conditional operator or a simple if

int min = int.MaxValue;
int max = int.MinValue;
foreach(var n in numbers)
{

    if(n < min) min = n;
    if(n > max) max = n;
}

This way the min = min assignment can be avoided for such circumstances.

like image 73
Johan Avatar answered Oct 11 '22 05:10

Johan