C# Assign Variables Optimization

This C# example program explores assignment. It tests assignment performance.
Assign optimization. A variable stores the result of an expression. This is called assignment. The concept of assignment in languages introduces the complexity of time.Arithmetic OptimizationOptimization
Example. Instead of assigning locals to the results of computations, you can put the method invocations directly into the final expression. This reduces intermediate memory locations.

Info: A method that uses assignment to store the results of internal method calls can be rewritten as an expression-based method.

UseExpression: This method places the result of the Value1 and Value2 methods onto the evaluation stack for processing.

UseLocals: This places the results into local variable slots and then into the evaluation stack. It uses several local variable slots.

C# program that tests assignment and variables using System; class Program { static int _field = 5; static int Value1() { // This method just returns an integer. return _field * 2; } static int Value2() { // This method also returns an integer. return _field * 3; } static int UseExpression() { // This method uses an expression-based statement. // ... No temporary variables are needed here. return Value1() + Value2() + Value1() + Value2(); } static int UseLocals() { // This method uses four variables to store intermediate values. // ... These require storage locations. int value1 = Value1(); int value2 = Value2(); int value3 = Value1(); int value4 = Value2(); return value1 + value2 + value3 + value4; } static void Main() { // Test the methods. Console.WriteLine(UseExpression()); Console.WriteLine(UseLocals()); } } Output 50 50
Notes, IL generated. The UseLocals method generates more IL opcodes to perform its computation. It uses several stloc instructions to store the values into local variable slots.

Further: UseLocals then uses ldloc instructions to read the values from those local variable slots.

IL: ldloc

UseExpression: This places the result of the method calls onto the evaluation stack, and then adds the values from those locations.

Notes, IL. To verify the intermediate language your computer, please use the IL Disassembler tool. Instruction counts do not always directly indicate performance.IL Disassembler
Benchmark. The methods specified in the first program, UseExpression and UseLocals, were tested. This benchmark tells us whether avoiding local variables is a realistic optimization.Benchmark

Version 1: This code calls the UseExpression method. It avoids local variables, and computes a value.

Version 2: This version of the code uses the same logic as UseExpression, but uses several local variables to perform the computation.

Result: It is faster to avoid local variables. Even in these small methods, avoiding locals and assignments tends to be faster.

C# program that benchmarks assignment optimization using System; using System.Diagnostics; class Program { static int _field = 5; static int Value1() { return _field * 2; } static int Value2() { return _field * 3; } static int UseExpression() { return Value1() + Value2() + Value1() + Value2(); } static int UseLocals() { int value1 = Value1(); int value2 = Value2(); int value3 = Value1(); int value4 = Value2(); return value1 + value2 + value3 + value4; } const int _max = 10000000; static void Main() { // Version 1: use expression logic. var s1 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { if (UseExpression() == 0) { return; } } s1.Stop(); // Version 2: use local variable logic. var s2 = Stopwatch.StartNew(); for (int i = 0; i < _max; i++) { if (UseLocals() == 0) { return; } } s2.Stop(); Console.WriteLine(((double)(s1.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); Console.WriteLine(((double)(s2.Elapsed.TotalMilliseconds * 1000000) / _max).ToString("0.00 ns")); } } Output 2.01 ns UseExpression 2.47 ns UseLocals
Research, assignment. Let us research assignment and expressions. This idea is described in the programming textbook Structure and Interpretation of Computer Programs.

Info: Assignment introduces the complexity of time into programs. A program can only be understood at a certain point.

Summary. We explored the concept of assignment and expressions. A C# program can be optimized by reducing local variables. This can speed up certain programs.
© 2007-2019 Sam Allen. Every person is special and unique. Send bug reports to info@dotnetperls.com.
HomeSearch
Home
Dot Net Perls