【问题标题】:How much space taken when using System.Linq?使用 System.Linq 时占用了多少空间?
【发布时间】:2014-05-05 08:10:01
【问题描述】:

List<T> 上的 Linq 函数很棒,但是,在我正在处理的这个特定文件中,只有 1 行使用它。所以我想知道这个库在导入使用时占用了多少空间? (我正在使用First 函数。)

如果它占用了太多空间,那么创建一个自定义的for 循环来迭代是有意义的。但是使用 Linq 时我的代码更干净。

对于内存使用,我认为使用 Linq 和使用 for 并没有太大的区别,所以我想知道磁盘空间使用情况是否会在移动设备上的 Unity3D 中使用。如果有人可以提供一种方法来确定任何系统库的磁盘大小,那将非常有用!

【问题讨论】:

  • 你为什么在乎?您对磁盘空间使用有什么要求吗?如果你这样做了,使用整个 .net 框架似乎并不是最好的选择......
  • 创建一个有 LinQ 的版本和一个没有的版本并测试它?
  • 如果它占用的磁盘空间比我想象的要多,是的,我在乎。我不知道它是否需要很多,因为 Linq 似乎是一个非常大的东西。使用 .NET 是必须的,因为我正在使用 Unity (C#) 开发手机游戏,我想尽可能减少下载时间。
  • @Sargon:将 Unity/Android 添加到您的问题中非常重要,因为这似乎与您获得的答案有很大不同。

标签: c# performance linq unity3d


【解决方案1】:

using 指令并没有真正将任何内容导入应用程序。它只是使用命名空间的语言结构。如果程序集实际上包含在构建中,那么真正重要的是什么。 Look here:

命名空间:System.Linq

程序集:System.Core(在 System.Core.dll 中)

所以真正重要的是是否包含此程序集。是的,它默认包含在系统中安装的常用程序集中,因此仅使用 Linq 不会使文件变大。

编辑: 问题似乎与单声道和 Unity 相关。从理论上讲,如果您不使用外部库(和一些 .net 的),您可以在不使用 System.Core.dll 的情况下构建 .net 应用程序。但是您必须使用的其他库很可能依赖于它。现在关于 mono,看起来 mono 将 System.Core 视为特殊程序集,不需要引用它,它显然是自动完成的:

using System;
using System.Linq;

namespace t1
{
    class MainClass
    {
        public static void Main (string[] args)
        {
            Console.WriteLine (typeof(Enumerable).Assembly.Location);
        }
    }
}

就像dmcs Program.cs 那样构建。此外,如果您在 Xamarin 工作室中创建空解决方案,它也可以工作,并且只有 System.dll 在引用中。

【讨论】:

    【解决方案2】:

    .NET 框架已安装在您的计算机上。它没有链接到您的 .exe 二进制文件中。它只是引用,这是一个很大的不同。

    编辑:

    跟进 Baldricks 的问题,在使用 Unity 的移动设备上,应特别注意额外的依赖项。它们将捆绑到“播放器”中并增加下载大小。

    删除不必要的代码依赖。

    http://docs.unity3d.com/Documentation/Manual/iphone-playerSizeOptimization.html

    另一方面,LINQ 需要System.Core.dll,这对于 .NET 应用程序来说是必不可少的。因此,您的赌注很高,因为它已经包含并且 LINQ 不会增加现有的下载大小。

    【讨论】:

    • 总是这样吗?在带有 MS 框架的 Windows 上,也许。但我不太确定 Unity 是否相同。如果您将 Unity 游戏下载到您的 Android 设备上,并且它使用 C#,则很可能它只会传输 Mono 框架的一个子集,具体取决于所使用的内容。在这种情况下,引用更多的程序集是否可能会增加使用的磁盘空间?
    • 它仍未绑定到您的二进制文件中。如果存在依赖项并且该依赖项尚未安装在您的设备上,我想它将被下载并安装。但在这方面我不太了解Android。不会改变它只使用安装在您系统上的库这一事实。
    • 据我了解 Unity,它将您的游戏与所有需要的依赖项打包在一起,因此您拥有一个游戏“安装包”(每个发布的平台)。所以我假设 Unity 知道 Android 没有本地 .Net 库并添加所需的 DLL。但由于 LINQ 是 System.Core DLL 的一部分,我认为无论如何都会包含它,因为一般的 .Net 操作需要 Core。
    • @Flater:所以结论是使用 LINQ 应该没有任何区别,但使用 .NET 中更晦涩的部分可能
    • @Baldrick:除非 Unity 有一个非常不同的发布游戏的想法;是的。
    【解决方案3】:

    using 指令将仅引用计算机中现有的 .Net Framework。它不会总是导致在您的构建中直接链接或拉取程序集。 引用的组件确实会导致尺寸增长。 但是,using 指令并没有告诉编译器包含引用的程序集。 但是,通过在项目中引用它们,您是在告诉 csc 编译器在哪里可以找到编译时要链接的程序集。 因此,除非我通过项目引用它们或除非它们在代码中实际引用,否则不会引用程序集。

    【讨论】:

      【解决方案4】:

      刚刚在 unity 的 2020.1 版本上尝试过,在 linq 中使用函数后构建大小没有改变。

      所以没有影响。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-02-24
        • 1970-01-01
        • 2020-10-18
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-07-22
        • 1970-01-01
        相关资源
        最近更新 更多