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

时间:2017-07-24 15:06:43

标签: c# .net performance optimization

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

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

E.g。尽可能考虑三元运算符。

问题是:

  1. 值得努力吗?除了代码美化之外,通过所有项目和减少代码行可以改进一些东西吗?
  2. 是否有可以遵循的标准方法/标准步骤来改进代码库(性能/加载时间等)?
  3. 询问Visual Studio 2015& amp; .NET领域。

4 个答案:

答案 0 :(得分:2)

用等效的三元运算符替换if语句通常对生成的代码没有任何影响。无论你如何在高级别编写它们,编译器都非常擅长将这些内容优化为完全相同的指令序列。

通常,在没有对代码进行任何实际重组的情况下,代码行数量的减少不会对项目的大小产生任何影响。

重构代码可能会产生影响,但除非你有非常愚蠢的事情,比如完全未使用或完全无用的代码,否则你必须聪明地重构事情,这需要大量工作。

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

摆脱未使用的库,将库配置为在启动期间做得更少,只使用几个函数替换库,如果这是您使用的所有功能,通常是最低级的成果。

答案 1 :(得分:2)

就三元运算符而言,它可能比If / Else(Ternary ? operator vs the conventional If-else operator in c#

为了提高性能,请考虑查看您的热点,并查看他们正在做什么。看看你的O(n)表现。例如,您是否经常更新然后使用列表?如果是这样,也许您可​​以查看内置排序的其他List容器。

或许你可以将一些逻辑移到循环之外;无论是之前还是之后。因为嵌套循环很慢。

你可以使用“一见不醒”的模式而不用担心什么吗?像Task.Run(A);这样的东西。这不会返回结果,但它会启动一个新线程,可能会将您的热点移动到可接受的位置。

并且,了解在优化这些块时,会出现新的热点。

要确定热点的位置,请在VS2015中按照MSDN文章进行操作 https://msdn.microsoft.com/en-us/library/ms182372.aspx

答案 2 :(得分:1)

简短的回答是:这取决于。

有些事情可以让您的代码更高效,例如将计算存储在变量中(如果您计划将结果重新用于其他任务)或使用算法更好地导航数据,而不是逐个遍历每个项目。

但删除不必要的行?并不是的。使用未使用的方法或引用并没有真正增加实际性能方面的松弛。当然,把它放在那里很烦人,但它所做的就是增加编译时间并增加你的项目规模。如果您的程序没有使用它,那么它就不会在性能问题上添加任何其他内容。

你应该考虑的事情是保持DRY(不要重复自己)代码比仅仅"美化"你的代码。它有助于提高可维护性,可读性,并使团队工作变得更加容易。它是一个名为"重构"的过程的一部分。你可以找到更多信息here

答案 3 :(得分:1)

为了好玩,我想我会尝试一点测试。

我想:

  

我们知道C#会转换为MSIL,所以它才有意义   有更多的代码,MSIL会越多,因此   负载减慢。

但事实证明情况并非如此。

我尝试动态加载2个dll:

  • 一个几乎是空的,
  • 另一个有10万多行代码。

以下示例代码:

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:两个18ms

我不太了解结果。我想也许编译器更加聪明,我的100,000多行代码在某种程度上被编译为空。

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

下一次测试

仍然难以置信,我在100,000多行代码中添加了100,000种不同的public void方法,并重新进行了测试。

  • 运行1:两个11毫秒
  • 运行2:两个9毫秒
  • 运行3:两个10毫秒

ildasm.exe变得反应迟钝,所以我猜测IL非常大。

<强>结论

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