为什么在调试模式下 List<>.OrderBy LINQ 比 IComparable+List<>.Sort 更快?

2024-03-20

我感兴趣的是使用 LINQ 对类进行排序更快,还是通过实现 IComparable 接口和 List.Sort 更快。当 LINQ 代码更快时,我感到非常惊讶。

为了进行测试,我创建了一个非常简单的类,使用不太恰当的名称 TestSort,实现 IComparable。

class TestSort: IComparable<TestSort>  {
    private int age;
    private string givenName;

    public int Age {
        get {
            return age;
        }
        set {
            age = value;
        }
    }

    public string GivenName {
        get {
            return givenName;
        }
        set {
            givenName = value;
        }
    }

    public TestSort(int age, string name) {
        this.age = age;
        this.givenName = name;
    }

    public int CompareTo(TestSort other) {
        return this.age.CompareTo(other.age);
    }
}

然后一个简单的程序对其进行多次排序 - 排序比复制列表要昂贵得多,因此可以忽略它的影响。

class Program {
    static void Main(string[] args) {
        // Create the test data
        string name = "Mr. Bob";

        Random r = new Random();
        var ts2 = new List<TestSort>();

        for (int i = 0; i < 100; i++) {
            ts2.Add(new TestSort(r.Next(), name));
        }

        DateTime start, end;

        // Test List<>.Sort
        start = DateTime.Now;
        for (int i = 0; i < 100000; i++) {
            var l = ts2.ToList();
            l.Sort();
        }
        end = DateTime.Now;

        Console.WriteLine("IComparable<T>: ");
        Console.WriteLine((end - start).TotalMilliseconds);


        // Test Linq OrderBy
        start = DateTime.Now;
        for (int i = 0; i < 100000; i++) {
            var l = ts2.ToList();
            l = l.OrderBy(item => item.Age).ToList();
        }
        end = DateTime.Now;

        Console.WriteLine("\nLINQ: ");
        Console.WriteLine((end - start).TotalMilliseconds);

        Console.WriteLine("Finished.");
        Console.ReadKey();
    }
}

我很惊讶收到以下输出:

IComparable<T>:
2965.1696

LINQ:
2181.1248

有时 LINQ 会低于 2000,有时 IComparable 会达到 3000 左右。

当我用正常测试时List<Int> the List.Sort是 LINQ 速度的 1/4,保持在 2000 左右。

那么为什么对于我的类来说,LINQ 的速度只有正常排序的 66% 左右呢?我的 IComparable 实现有问题吗?

Update:我只是想尝试在发布模式下进行,是的,结果是不同的:

IComparable<T>:
1593.0911

Linq:
1958.1119

但我仍然很想知道为什么 IComparable 在调试模式下速度较慢。


如果您在开始测量之前确保所有内容都经过 JIT,您可能会得到不同的结果。我也强烈推荐使用BenchmarkDotNet用于微基准测试。

var ll = ts2.ToList();
ll.Sort();
ll.OrderBy(item => item.Age).ToList();

根据我的测量(添加上述代码后),IComparable 总是更快(即使在调试中)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么在调试模式下 List<>.OrderBy LINQ 比 IComparable+List<>.Sort 更快? 的相关文章

  • WPF DataGrid 多选

    我读过几篇关于这个主题的文章 但很多都是来自 VS 或框架的早期版本 我想做的是从 dataGrid 中选择多行并将这些行返回到绑定的可观察集合中 我尝试创建一个属性 类型 并将其添加到可观察集合中 它适用于单个记录 但代码永远不会触发多个
  • 如何将 std::string& 转换为 C# 引用字符串

    我正在尝试将 C 函数转换为std string参考C 我的 API 如下所示 void GetStringDemo std string str 理想情况下 我希望在 C 中看到类似的东西 void GetStringDemoWrap r
  • 在一个数据访问层中处理多个连接字符串

    我有一个有趣的困境 我目前有一个数据访问层 它必须与多个域一起使用 并且每个域都有多个数据库存储库 具体取决于所调用的存储过程 目前 我只需使用 SWITCH 语句来确定应用程序正在运行的计算机 并从 Web config 返回适当的连接字
  • std::list 线程push_back、front、pop_front

    std list 线程安全吗 我假设不是这样 所以我添加了自己的同步机制 我认为我有正确的术语 但我仍然遇到问题 每个函数都由单独的线程调用 Thread1 不能等待 它必须尽可能快 std list
  • -webkit-box-shadow 与 QtWebKit 模糊?

    当时有什么方法可以实现 webkit box shadow 的工作模糊吗 看完这篇评论错误报告 https bugs webkit org show bug cgi id 23291 我认识到这仍然是一个问题 尽管错误报告被标记为RESOL
  • 需要帮助优化算法 - 两百万以下所有素数的总和

    我正在尝试做一个欧拉计划 http projecteuler net问题 我正在寻找 2 000 000 以下所有素数的总和 这就是我所拥有的 int main int argc char argv unsigned long int su
  • C# 列表通用扩展方法与非通用扩展方法

    这是一个简单的问题 我希望 集合类中有通用和非通用方法 例如List
  • 为什么这个字符串用AesCryptoServiceProvider第二次解密时不相等?

    我在 C VS2012 NET 4 5 中的文本加密和解密方面遇到问题 具体来说 当我加密并随后解密字符串时 输出与输入不同 然而 奇怪的是 如果我复制加密的输出并将其硬编码为字符串文字 解密就会起作用 以下代码示例说明了该问题 我究竟做错
  • x:将 ViewModel 方法绑定到 DataTemplate 内的事件

    我基本上问同样的问题这个人 https stackoverflow com questions 10752448 binding to viewmodels property from a template 但在较新的背景下x Bind V
  • 为什么 C# 2.0 之后没有 ISO 或 ECMA 标准化?

    我已经开始学习 C 并正在寻找标准规范 但发现大于 2 0 的 C 版本并未由 ISO 或 ECMA 标准化 或者是我从 Wikipedia 收集到的 这有什么原因吗 因为编写 审查 验证 发布 处理反馈 修订 重新发布等复杂的规范文档需要
  • 两个类可以使用 C++ 互相查看吗?

    所以我有一个 A 类 我想在其中调用一些 B 类函数 所以我包括 b h 但是 在 B 类中 我想调用 A 类函数 如果我包含 a h 它最终会陷入无限循环 对吗 我能做什么呢 仅将成员函数声明放在头文件 h 中 并将成员函数定义放在实现文
  • C# xml序列化必填字段

    我需要将一些字段标记为需要写入 XML 文件 但没有成功 我有一个包含约 30 个属性的配置类 这就是为什么我不能像这样封装所有属性 public string SomeProp get return someProp set if som
  • 空指针与 int 等价

    Bjarne 在 C 编程语言 中写道 空指针与整数零不同 但 0 可以用作空指针的指针初始值设定项 这是否意味着 void voidPointer 0 int zero 0 int castPointer reinterpret cast
  • C# 动态/expando 对象的深度/嵌套/递归合并

    我需要在 C 中 合并 2 个动态对象 我在 stackexchange 上找到的所有内容仅涵盖非递归合并 但我正在寻找能够进行递归或深度合并的东西 非常类似于jQuery 的 extend obj1 obj2 http api jquer
  • 复制目录下所有文件

    如何将一个目录中的所有内容复制到另一个目录而不循环遍历每个文件 你不能 两者都不Directory http msdn microsoft com en us library system io directory aspx nor Dir
  • 如何在 Android 中使用 C# 生成的 RSA 公钥?

    我想在无法假定 HTTPS 可用的情况下确保 Android 应用程序和 C ASP NET 服务器之间的消息隐私 我想使用 RSA 来加密 Android 设备首次联系服务器时传输的对称密钥 RSA密钥对已在服务器上生成 私钥保存在服务器
  • 相当于Linux中的导入库

    在 Windows C 中 当您想要链接 DLL 时 您必须提供导入库 但是在 GNU 构建系统中 当您想要链接 so 文件 相当于 dll 时 您就不需要链接 为什么是这样 是否有等效的 Windows 导入库 注意 我不会谈论在 Win
  • C++ 继承的内存布局

    如果我有两个类 一个类继承另一个类 并且子类仅包含函数 那么这两个类的内存布局是否相同 e g class Base int a b c class Derived public Base only functions 我读过编译器无法对数
  • 对于某些 PDF 文件,LoadIFilter() 返回 -2147467259

    我正在尝试使用 Adob e IFilter 搜索 PDF 文件 我的代码是用 C 编写的 我使用 p invoke 来获取 IFilter 的实例 DllImport query dll SetLastError true CharSet
  • 如何确定 CultureInfo 实例是否支持拉丁字符

    是否可以确定是否CultureInfo http msdn microsoft com en us library system globalization cultureinfo aspx我正在使用的实例是否基于拉丁字符集 我相信你可以使

随机推荐

  • 如何在iOS项目中使用dylib库和hpp头文件?

    我已经获得了一个 dylib 库和一个 hpp 头文件 我应该在 Xcode 中的 iOS 项目中使用它们 我一直在网上查找 但所有答案都很简洁 没有具体的步骤可遵循 我只需将这些文件复制到我的项目中吗 如何在 Obj C 类中创建 使用库
  • 如何估计线程上下文切换开销?

    我正在尝试通过实时截止日期来提高线程应用程序的性能 它运行在 Windows Mobile 上并用 C C 编写 我怀疑高频率的线程切换可能会导致有形的开销 但既不能证明也不能反驳它 众所周知 缺乏证据并不是相反的证明 因此我的问题是双重的
  • iPhone UITableView:如何删除组样式表中各部分之间的间距?

    我正在创建一个表格视图 其中有 10 个部分 所有部分都有标题视图 但没有单元格 所以 简而言之 我的表视图将仅显示 10 个标题视图 任何部分都不会有单元格 现在 当我这样做时 该部分的标题视图之间有一些空间 我想删除那个空格 那可能吗
  • 在 Flutter 中显示几秒钟后没有执行操作按钮时关闭 AlertDialog

    我有一个 AlertDialog 弹出几秒钟 然后自动弹出 没有执行任何操作按钮 弹出后 会显示另一个AlertDialog 我怎样才能做到这一点 这是我的示例代码 初始化计时器以显示第一个对话框 timerToShowFirstDialo
  • AVFoundation,在预览层中剪掉边缘

    我正在开发一些 iOS 应用程序 我需要在其中进行一些相机扫描 这是我第一次体验 AVFoundation 之前我使用 UIImagePickerController 开发相机应用程序 但 AVFoundation 似乎更强大 问题是它会切
  • 使用 doPost 将文件上传到 Google Web Apps

    我正在尝试使用 doPost e 将文件上传到 Google Web App 如下所示 function doPost e var blob e parameter myFile DriveApp createFile blob 然后将文件
  • Intel x86 与 AMD x86 CPU 上的访问性能不一致

    我已经实现了一个带有结构内存布局数组的简单线性探测哈希图 该结构包含键 值和指示条目是否有效的标志 默认情况下 该结构体由编译器填充 因为键和值是 64 位整数 但该条目仅占用 8 个布尔值 因此 我也尝试以未对齐访问为代价来打包结构 由于
  • 使用 pdfnet 下划线会导致不同的线条粗细

    我用来为所选文本添加下划线的代码 我开始调用 addUnderline 方法 其他方法是辅助方法 private pdftron SDF Obj CreateUnderlineAppearance pdftron PDF Rect bbox
  • Python 和 numpy:从 1 维数组中逐行减去 2 维数组

    在python中 我希望从1维数组中逐行减去2维数组 我知道如何使用 for 循环和索引来完成此操作 但我认为使用 numpy 函数可能会更快 但是我没有找到办法做到这一点 这是一个带有 for 循环的示例 from numpy impor
  • 文件 -> 在 MonoDevelop 中打开网站?

    我无法在 MonoDevelop 中打开现有网站 我尝试了各种选择但没有成功 有什么办法可以做到这一点吗 Visual Studio 有这个功能并且运行得很好 但我想在我当前的项目中尝试使用 MonoDevelop MonoDevelop
  • 在 Linux 中如何判断哪个进程向我的进程发送了信号

    我有一个java应用程序SIG TERM 我想知道发送这个信号的进程的pid 那可能吗 两种 Linux 特定的方法是SA SIGINFO http www kernel org doc man pages online pages man
  • 如何获得 TreeNodes 的 TreeView 行为,当您检查一个 TreeNodes 时,它会检查其所有子 TreeNodes?

    这与大多数应用程序的行为方式相同 我认为 TreeView 默认情况下是这样工作的 有没有办法做到这一点 或者我是否必须获取已检查的 TreeNode 的所有子节点并自己检查它们 这是winform 你需要自己做 但另一方面这并不难 pri
  • 块范围内没有链接?

    块中声明的所有变量是否都 无链接 例如 1 如果我声明一个静态变量 void foo static int i 它有内部联系还是没有联系 如果没有链接 那为什么要使其静态呢 2 如果我使用 extern 会发生什么 global scope
  • 检测迭代器是否会被消耗

    是否有一种统一的方法来知道迭代是否会消耗可迭代对象 假设你有一个特定的函数crunch它要求一个可迭代对象作为参数 并多次使用它 就像是 def crunch vals for v in vals chomp v for v in vals
  • 便携式 JPA 批量/批量插入

    我刚刚开始使用其他人编写的一个功能 该功能似乎效率稍低 但我对 JPA 的了解并不足以找到非 Hibernate 特定的可移植解决方案 简而言之 在循环中调用的 Dao 方法插入每个新实体会执行 entityManager merge ob
  • 删除具有多个 ul 的特定列表样式[重复]

    这个问题在这里已经有答案了 举个例子 我有两个列表 1st ul li TEST 1 li li TEST 2 li li TEST 3 li li TEST 4 li li TEST 5 li li TEST 6 li li TEST 7
  • Pytorch 数据加载器:错误的文件描述符和 EOF > 0

    问题描述 在使用由自定义数据集制作的 Pytorch 数据加载器进行神经网络训练期间 我遇到了奇怪的行为 数据加载器设置为workers 4 pin memory False 大多数时候 训练都顺利完成 有时 训练会随机停止 并出现以下错误
  • RMarkdown 无法编织:找不到 html_dependency

    我正在尝试使用创建一个 html 文件RMarkdown 使用 RStudio 中的示例 Rmd 当我点击Knit 我收到以下消息 错误 找不到 html dependency 的路径 执行已停止 我尝试卸载并重新安装 R 和 RStudi
  • 如何向AudioQueue提供音频缓冲区来播放音频?

    在我的应用程序中 我正在接收需要播放的线性 PCM 格式的音频数据 我正在关注 iOS SpeakHere 示例 但是我不知道应该如何以及在哪里提供缓冲区AudioQueue 谁能给我提供一个在 iOS 中播放音频缓冲区的工作示例Audio
  • 为什么在调试模式下 List<>.OrderBy LINQ 比 IComparable+List<>.Sort 更快?

    我感兴趣的是使用 LINQ 对类进行排序更快 还是通过实现 IComparable 接口和 List Sort 更快 当 LINQ 代码更快时 我感到非常惊讶 为了进行测试 我创建了一个非常简单的类 使用不太恰当的名称 TestSort 实