C#关于代码行数与程序运行性能的关系

C#中,代码行越多,程序执行性能就越差吗?

在项目开发中,我曾经遇到一个 补焊选择焊接点选中的逻辑,

假设有N个焊接,使用 32的uint(DWORD)来标记焊接点 是否被选中。

一个uint就代表32个焊点是否被选中。

下面测试代码行数越多 会不会降低性能。同时测试嵌套循环中

(n×m)循环与(m×n)循环的性能比较,其中n<m。

代码行数 与 性能(执行)速度没有直接关系。

代码行数少,方便维护升级。

代码行数多,维护很不方便。

综合考虑下 代码行数越少,在不考虑非常大的性能提升情况下,整体效果会更佳些。

测试程序如下:

using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace CodeLinesAndPerformanceDemo
{
    class Program
    {
        static void Main(string[] args)
        {
            uint[] reweldSelectedArray = new uint[32];
            reweldSelectedArray[0] = 100;
            reweldSelectedArray[1] = 5;
            reweldSelectedArray[2] = 7;
            reweldSelectedArray[3] = 10;
            reweldSelectedArray[8] = 1234;
            reweldSelectedArray[13] = 6;
            reweldSelectedArray[14] = 34;
            reweldSelectedArray[15] = 666;
            reweldSelectedArray[22] = 77;
            reweldSelectedArray[25] = 34;
            reweldSelectedArray[29] = 45;
            reweldSelectedArray[30] = 10;
            reweldSelectedArray[31] = 25;
            int totalPoleCount = 120000;
            Task taskA = Task.Run(() =>
            {
                AlgorithmTimespan(GetSelectedReweldPointA, reweldSelectedArray, totalPoleCount, nameof(GetSelectedReweldPointA));
            });
            Task taskB = Task.Run(() => 
            {
                AlgorithmTimespan(GetSelectedReweldPointB, reweldSelectedArray, totalPoleCount, nameof(GetSelectedReweldPointB));
            });
            Task taskC = Task.Run(() =>
            {
                AlgorithmTimespan(GetSelectedReweldPointC, reweldSelectedArray, totalPoleCount, nameof(GetSelectedReweldPointC));
            });
            Task.WaitAll(taskA, taskB, taskC);
            Console.ReadLine();
        }

        /// <summary>
        /// 外层循环1000次,内层循环32次 【使用32个if-else进行判定】
        /// </summary>
        /// <param name="reweldSelectedArray"></param>
        /// <param name="totalPoleCount"></param>
        static void GetSelectedReweldPointA(uint[] reweldSelectedArray, int totalPoleCount) 
        {
            List<int> listSelected = new List<int>();
            for (int i = 0; i < totalPoleCount; i++)
            {
                if (i < 32 * 1 && (reweldSelectedArray[0] & (1 << i)) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 1 && i < 32 * 2 && (reweldSelectedArray[1] & (1 << (i - 32 * 1))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 2 && i < 32 * 3 && (reweldSelectedArray[2] & (1 << (i - 32 * 2))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 3 && i < 32 * 4 && (reweldSelectedArray[3] & (1 << (i - 32 * 3))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 4 && i < 32 * 5 && (reweldSelectedArray[4] & (1 << (i - 32 * 4))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 5 && i < 32 * 6 && (reweldSelectedArray[5] & (1 << (i - 32 * 5))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 6 && i < 32 * 7 && (reweldSelectedArray[6] & (1 << (i - 32 * 6))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 7 && i < 32 * 8 && (reweldSelectedArray[7] & (1 << (i - 32 * 7))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 8 && i < 32 * 9 && (reweldSelectedArray[8] & (1 << (i - 32 * 8))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 9 && i < 32 * 10 && (reweldSelectedArray[9] & (1 << (i - 32 * 9))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 10 && i < 32 * 11 && (reweldSelectedArray[10] & (1 << (i - 32 * 10))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 11 && i < 32 * 12 && (reweldSelectedArray[11] & (1 << (i - 32 * 11))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 12 && i < 32 * 13 && (reweldSelectedArray[12] & (1 << (i - 32 * 12))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 13 && i < 32 * 14 && (reweldSelectedArray[13] & (1 << (i - 32 * 13))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 14 && i < 32 * 15 && (reweldSelectedArray[14] & (1 << (i - 32 * 14))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 15 && i < 32 * 16 && (reweldSelectedArray[15] & (1 << (i - 32 * 15))) != 0)
                {
                    listSelected.Add(i + 1);
                }

                else if (i >= 32 * 16 && i < 32 * 17 && (reweldSelectedArray[16] & (1 << (i - 32 * 16))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 17 && i < 32 * 18 && (reweldSelectedArray[17] & (1 << (i - 32 * 17))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 18 && i < 32 * 19 && (reweldSelectedArray[18] & (1 << (i - 32 * 18))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 19 && i < 32 * 20 && (reweldSelectedArray[19] & (1 << (i - 32 * 19))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 20 && i < 32 * 21 && (reweldSelectedArray[20] & (1 << (i - 32 * 20))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 21 && i < 32 * 22 && (reweldSelectedArray[21] & (1 << (i - 32 * 21))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 22 && i < 32 * 23 && (reweldSelectedArray[22] & (1 << (i - 32 * 22))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 23 && i < 32 * 24 && (reweldSelectedArray[23] & (1 << (i - 32 * 23))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 24 && i < 32 * 25 && (reweldSelectedArray[24] & (1 << (i - 32 * 24))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 25 && i < 32 * 26 && (reweldSelectedArray[25] & (1 << (i - 32 * 25))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 26 && i < 32 * 27 && (reweldSelectedArray[26] & (1 << (i - 32 * 26))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 27 && i < 32 * 28 && (reweldSelectedArray[27] & (1 << (i - 32 * 27))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 28 && i < 32 * 29 && (reweldSelectedArray[28] & (1 << (i - 32 * 28))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 29 && i < 32 * 30 && (reweldSelectedArray[29] & (1 << (i - 32 * 29))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 30 && i < 32 * 31 && (reweldSelectedArray[30] & (1 << (i - 32 * 30))) != 0)
                {
                    listSelected.Add(i + 1);
                }
                else if (i >= 32 * 31 && i < 32 * 32 && (reweldSelectedArray[31] & (1 << (i - 32 * 31))) != 0)
                {
                    listSelected.Add(i + 1);
                }
            }
            Console.WriteLine($"【GetSelectedReweldPointA】已选择的补焊焊接点为【{string.Join(",", listSelected)}】");
        }

        /// <summary>
        /// 外层循环1000次,内层循环32次
        /// </summary>
        /// <param name="reweldSelectedArray"></param>
        /// <param name="totalPoleCount"></param>
        static void GetSelectedReweldPointB(uint[] reweldSelectedArray, int totalPoleCount)
        {
            List<int> listSelected = new List<int>();
            for (int i = 0; i < totalPoleCount; i++)
            {
                for (int j = 0; j < reweldSelectedArray.Length; j++)
                {
                    if (i >= 32 * j && i < 32 * (j + 1) && (reweldSelectedArray[j] & (1 << (i - 32 * j))) != 0) 
                    {
                        listSelected.Add(i + 1);
                        break;
                    }
                }
            }
            Console.WriteLine($"【GetSelectedReweldPointB】已选择的补焊焊接点为【{string.Join(",", listSelected)}】");
        }

        /// <summary>
        /// 外层循环32次,内层循环1000次
        /// </summary>
        /// <param name="reweldSelectedArray"></param>
        /// <param name="totalPoleCount"></param>
        static void GetSelectedReweldPointC(uint[] reweldSelectedArray, int totalPoleCount)
        {
            List<int> listSelected = new List<int>();
            for (int j = 0; j < reweldSelectedArray.Length; j++)
            {
                for (int i = 0; i < totalPoleCount; i++)
                {
                    if (i >= 32 * j && i < 32 * (j + 1) && (reweldSelectedArray[j] & (1 << (i - 32 * j))) != 0)
                    {
                        listSelected.Add(i + 1);
                        //break;
                    }
                }
            }
            Console.WriteLine($"【GetSelectedReweldPointC】已选择的补焊焊接点为【{string.Join(",", listSelected)}】");
        }

        static void AlgorithmTimespan(Action<uint[], int> SelectedMethod, uint[] reweldSelectedArray, int totalPoleCount, string methodName)
        {
            Stopwatch stopwatch = Stopwatch.StartNew();
            SelectedMethod(reweldSelectedArray, totalPoleCount);
            stopwatch.Stop();
            Console.WriteLine($"【{methodName}】,获取补焊焊接点的方法,用时【{stopwatch.Elapsed.TotalMilliseconds}】ms");
        }

    }
}

运行效果:

 嵌套循环中,循环次数较少的放到外层大循环中,循环次数较多的放在内层循环中,可适当提升性能

Guess you like

Origin blog.csdn.net/ylq1045/article/details/121066084