【问题标题】:Does lessening lines of code decrease load time of a project?减少代码行数会减少项目的加载时间吗?
【发布时间】:2026-01-04 10:30:02
【问题描述】:

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

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

例如尽可能考虑使用三元运算符。

问题是这样的:

  1. 这值得努力吗?浏览所有项目并减少代码行数除了代码美化之外还有什么改进?
  2. 是否可以遵循任何标准方法/标准步骤来改进代码库(性能/加载时间等)?

关于 Visual Studio 2015 和 .NET 领域的问题。

【问题讨论】:

  • 通过识别速度慢的原因并修复它们来提高性能。减少行数与它无关,通常的改进是更好的数据结构,缓存,更好的算法,..
  • 避免错误地认为您编写的代码行 (LOC) 等同于执行的 LOC。首先,将语言结构扩展为代码以支持它们各自的使用(自动代码生成)。其次,可以进行多层次的优化;语言编译器(语言编译器创建 IL)可以优化代码,其次 JIT 编译器(将 IL 编译为本机)可以优化代码。有关其中一些问题的良好讨论,请参阅:The 'premature optimization is evil' myth

标签: c# .net performance optimization


【解决方案1】:

就三元运算符而言,它可能比 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

【讨论】:

  • 好答案。但是有什么想法可以从哪里以及如何开始这些热点?
  • 我会避免说三元运算符很慢。该帖子和答案来自 2012 年,我无法复制结果。事实上,考虑到该答案中使用的测试,三元运算符对我来说是领先的。但是,我可以通过反转 if 语句来改变它的性能。所以实际上,性能差异与三元与 if 无关,而是实际上归结为处理器中的分支预测错误。这对我来说更有意义,因为三元和简单的 if 编译成几乎相同的 IL。
  • 您链接到的答案(以及它的副本)不支持您的理论,即三元运算符比if/else 慢。
【解决方案2】:

为了好玩,我想尝试一下。

我想:

我们知道 C# 会转换为 MSIL,因此将 代码越多,MSIL 就越多,因此 减慢负载。

但是,事实证明并非如此。

我尝试动态加载 2 个 dll:

  • 一个几乎是空的,
  • 另一个有 100,000+ 行代码。

示例代码如下:

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 毫秒

我不太明白结果。我想也许编译器特别聪明,我的 100,000 多行代码不知何故被编译成空。

所以,我按照post 查看了 MSIL,发现大文件的 MSIL 代码明显多于小文件。

下一次测试

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

  • 运行 1:均为 11 毫秒
  • 运行 2:均为 9 毫秒
  • 运行 3:均为 10 毫秒

ildasm.exe 变得无响应,所以我猜 IL 相当大。

结论

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

【讨论】:

    【解决方案3】:

    简短的回答是:视情况而定。

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

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

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

    【讨论】:

      【解决方案4】:

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

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

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

      通常,性能和加载时间的改进需要更多代码,而不是更少的代码。例如,如果您在启动期间经常访问某个存储库,这会减慢您的速度,那么使您的程序加载速度更快的是引入缓存机制来减少对存储库的访问次数。需要添加这个缓存机制,所以代码会更多。

      摆脱未使用的库,将库配置为在启动期间执行更少的操作,仅用几个函数替换库(如果这是您为它们使用的所有功能),通常是最容易实现的目标。

      【讨论】:

      • 很好的答案。但是,我从哪里开始分析这些?有内置工具吗?
      • 我使用过 Redgate 的 ANTS 和 JetBrains 的 dotProfile。两者都是很好的产品,虽然我个人更喜欢 JetBrains 的产品(但我是 Resharper 的忠实粉丝)。