Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 减少代码行是否会减少项目的加载时间?_C#_.net_Performance_Optimization - Fatal编程技术网

C# 减少代码行是否会减少项目的加载时间?

C# 减少代码行是否会减少项目的加载时间?,c#,.net,performance,optimization,C#,.net,Performance,Optimization,我有一个.NET解决方案,其中包含多个项目 已经确定了该项目的一些潜在热点,可以进行改进 例如,尽可能考虑三元运算符 问题是: 这值得付出努力吗?通过所有的项目,减少代码行,除了美化代码之外,还能改善其他东西吗 是否有任何标准方法/标准步骤可用于改进代码库(性能/加载时间等) 关于Visual studio 2015和.NET realms提出此问题。用等效的三元运算符替换if语句通常不会对生成的代码产生任何影响。编译器非常擅长将这些东西优化为完全相同的指令序列,而不管您如何在高级别编写它们 一

我有一个.NET解决方案,其中包含多个项目

已经确定了该项目的一些潜在热点,可以进行改进

例如,尽可能考虑三元运算符

问题是:

  • 这值得付出努力吗?通过所有的项目,减少代码行,除了美化代码之外,还能改善其他东西吗
  • 是否有任何标准方法/标准步骤可用于改进代码库(性能/加载时间等)

  • 关于Visual studio 2015和.NET realms提出此问题。

    用等效的三元运算符替换
    if
    语句通常不会对生成的代码产生任何影响。编译器非常擅长将这些东西优化为完全相同的指令序列,而不管您如何在高级别编写它们

    一般来说,在不进行任何实际代码重组的情况下减少代码行数不会对项目的规模产生任何影响

    重新构造代码可能会有效果,但除非你有真正愚蠢的事情在进行,比如完全未使用或完全无用的代码,否则你必须聪明地重新构造代码,这需要大量的工作

    通常,性能和加载时间的改进需要更多的代码,而不是更少的代码。例如,如果您在启动过程中经常访问某个存储库,这会降低您的速度,那么可以让您的程序加载更快的是引入一种缓存机制,以减少对存储库的访问次数。需要添加此缓存机制,以便生成更多代码


    摆脱未使用的库,在启动过程中配置库做得更少,用几个函数替换库(如果这是您为它们使用的全部功能的话),通常是最容易解决的问题。

    简单的回答是:这取决于

    您可以做一些事情来提高代码的效率,例如将计算存储在变量中(如果您计划将结果用于其他任务),或者使用算法更好地导航数据,而不是逐个迭代每个项

    但是删除不必要的行吗?不是真的。拥有未使用的方法或引用并不会真正增加实际性能方面的松弛。当然,它有点烦人,但它所做的只是增加编译时间和增加项目大小。如果你的程序没有使用它,那么它就不会给它的性能问题增加任何东西


    你应该考虑的是,保持干燥(不要重复自己)代码比“美化”代码有更多的好处。它有助于提高可维护性、可读性,并使小组工作更加容易。这是“重构”过程的一部分,您可以找到更多信息

    就三元运算符而言,它可能比If/Else()慢

    对于表现,考虑一下你的热点,看看他们在做什么。看看你的O(n)表现。例如,您是否经常更新列表,然后使用列表?如果是这样,也许您可以看看另一个内置排序功能的列表容器

    或者你可以把一些逻辑转移到循环之外;在之前或之后。因为嵌套循环很慢

    你能用一种“放火然后忘记”的模式而不担心一些事情吗?类似于
    Task.Run(A)。这不会返回结果,但会启动一个新线程,可能会将热点移动到可接受的位置

    而且,要知道,当您优化这些块时,新的热点将会出现

    要确定您的热点在VS2015中的位置,请参阅MSDN文章

    为了好玩,我想试试看

    我想:

    我们知道C#被转换为MSIL,因此 代码越多,MSIL就越多,因此 减缓负载

    但事实并非如此。

    我尝试动态加载2个dll:

    • 一个几乎是空的
    • 另一个有100000多行代码
    示例代码如下:

    private void LoadTest()
        {
            // Startup test just in case the loader needs priming....
            var dll0 = Assembly.LoadFile(@"C:\Users\me\Documents\visual studio 2015\Projects\DeleteMeApp\DeleteMe0\bin\Debug\DeleteMe0.dll");
    
            Stopwatch st = new Stopwatch();
            st.Start();
            // This dll is nearly empty
            var dll1 = Assembly.LoadFile(@"C:\Users\me\Documents\visual studio 2015\Projects\DeleteMeLib1\bin\Debug\DeleteMeLib1.dll");
            st.Stop();
            var time1 = st.ElapsedMilliseconds;
    
            Stopwatch st2 = new Stopwatch();
            st2.Start();
            // This dll has over 100,000 lines of code in
            var dll2 = Assembly.LoadFile(@"C:\Users\me\Documents\visual studio 2015\Projects\DeleteMeApp\DeleteMeLib2\bin\Debug\DeleteMeLib2.dll");
            st2.Stop();
            var time2 = st.ElapsedMilliseconds;
    
        }
    
    结果

    • 运行1:两个16毫秒
    • 运行2:均为25毫秒
    • 运行3:18毫秒
    我不太明白结果。我想也许编译器非常聪明,我的100000多行代码不知怎么被编译成了零

    所以,我按照这个来查看MSIL,大文件的MSIL代码比小文件多得多

    下一次测试

    我仍然不相信,我在100000多行代码中添加了100000种不同的
    public-void
    方法,并重新运行了测试

    • 运行1:11毫秒
    • 运行2:两个9毫秒
    • 运行3:两个10毫秒
    ildasm.exe没有响应,所以我猜IL相当大

    结论


    没有;代码行数似乎与加载时间无关。

    回答得好。但是对于这些热点,你知道从哪里开始,如何开始吗?我不想说三元运算符很慢。这篇文章和答案都是2012年的,我无法复制结果。事实上,考虑到答案中使用的测试,三元运算符在我前面出现。但是,我可以通过反转if语句来更改其性能。因此,实际上,性能差异与三值与中频无关,而是真正归结为处理器中的分支预测失误。这对我来说更有意义,因为一个三元运算符和一个简单的if编译成几乎相同的IL。你链接到的答案(以及它的副本)不支持你的理论,即三元运算符比
    if/else
    慢。回答得好。但是,我从哪里开始分析这些呢?里面有吗