gcc 优化标志 -O3 使代码比 -O2 慢

2024-03-29

我找到这个话题为什么处理排序数组比处理未排序数组更快? https://stackoverflow.com/questions/11227809/why-is-processing-a-sorted-array-faster-than-an-unsorted-array?rq=1。并尝试运行这段代码。我发现奇怪的行为。如果我用以下代码编译这段代码-O3需要的优化标志2.98605 sec跑步。如果我编译-O2它需要1.98093 sec。我尝试在同一环境中的同一台机器上运行此代码几次(5或6次),我关闭了所有其他软件(chrome、skype等)。

gcc --version
gcc (Ubuntu 4.9.2-0ubuntu1~14.04) 4.9.2
Copyright (C) 2014 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.  There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

那么请您向我解释一下为什么会发生这种情况?我读gcc手册,我看到了-O3包括-O2。谢谢你的帮助。

P.S.添加代码

#include <algorithm>
#include <ctime>
#include <iostream>

int main()
{
    // Generate data
    const unsigned arraySize = 32768;
    int data[arraySize];

    for (unsigned c = 0; c < arraySize; ++c)
        data[c] = std::rand() % 256;

    // !!! With this, the next loop runs faster
    std::sort(data, data + arraySize);

    // Test
    clock_t start = clock();
    long long sum = 0;

    for (unsigned i = 0; i < 100000; ++i)
    {
        // Primary loop
        for (unsigned c = 0; c < arraySize; ++c)
        {
            if (data[c] >= 128)
                sum += data[c];
        }
    }

    double elapsedTime = static_cast<double>(clock() - start) / CLOCKS_PER_SEC;

    std::cout << elapsedTime << std::endl;
    std::cout << "sum = " << sum << std::endl;
}

gcc -O3 uses a cmov http://felixcloutier.com/x86/CMOVcc.html对于条件,因此它延长了循环携带的依赖链以包括cmov(根据 Intel Sandybridge CPU 的说法,这是 2 uop 和 2 个周期的延迟Agner Fog 的说明书 http://agner.org/optimize/。另请参阅x86 /questions/tagged/x86标签维基)。这是其中一种情况cmov sucks http://yarchive.net/comp/linux/cmov.html.

如果数据具有一定程度的不可预测性,cmov可能会是一个胜利,所以这对于编译器来说是一个相当明智的选择。 (然而,编译器有时可能会过多使用无分支代码 https://bugs.llvm.org/show_bug.cgi?id=33013.)

I 将您的代码放在 Godbolt 编译器资源管理器上 https://gcc.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(j:1,source:'%23include+%3Calgorithm%3E%0A%23include+%3Cctime%3E%0A%23include+%3Ciostream%3E%0A%0Aint+main()%0A%7B%0A++++//+Generate+data%0A++++const+unsigned+arraySize+%3D+32768%3B%0A++++int+data%5BarraySize%5D%3B%0A%0A++++for+(unsigned+c+%3D+0%3B+c+%3C+arraySize%3B+%2B%2Bc)%0A++++++++data%5Bc%5D+%3D+std::rand()+%25+256%3B%0A%0A++++//+!!!!!!+With+this,+the+next+loop+runs+faster%0A++++std::sort(data,+data+%2B+arraySize)%3B%0A%0A++++//+Test%0A++++clock_t+start+%3D+clock()%3B%0A++++long+long+sum+%3D+0%3B%0A%0A++++for+(unsigned+i+%3D+0%3B+i+%3C+100000%3B+%2B%2Bi)%0A++++%7B%0A++++++++//+Primary+loop%0A++++++++for+(unsigned+c+%3D+0%3B+c+%3C+arraySize%3B+%2B%2Bc)%0A++++++++%7B%0A++++++++++++if+(data%5Bc%5D+%3E%3D+128)%0A++++++++++++++++sum+%2B%3D+data%5Bc%5D%3B%0A++++++++%7D%0A++++%7D%0A%0A++++double+elapsedTime+%3D+static_cast%3Cdouble%3E(clock()+-+start)+/+CLOCKS_PER_SEC%3B%0A%0A++++std::cout+%3C%3C+elapsedTime+%3C%3C+std::endl%3B%0A++++std::cout+%3C%3C+%22sum+%3D+%22+%3C%3C+sum+%3C%3C+std::endl%3B%0A%7D%0A'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:33.36599326802078,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:g492,filters:(b:'0',commentOnly:'0',directives:'0',intel:'0'),options:'-O2+-std%3Dgnu%2B%2B11+-Wall+',source:1),l:'5',n:'0',o:'x86-64+gcc+4.9.2+(Editor+%231,+Compiler+%231)',t:'0')),k:32.731651559407744,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:g492,filters:(b:'0',commentOnly:'0',directives:'0',intel:'0'),options:'-O3+-std%3Dgnu%2B%2B11+-Wall',source:1),l:'5',n:'0',o:'x86-64+gcc+4.9.2+(Editor+%231,+Compiler+%232)',t:'0')),k:33.90235517257147,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4查看 asm(具有良好的突出显示并过滤掉不相关的行。不过,您仍然需要向下滚动所有排序代码才能到达 main())。

.L82:  # the inner loop from gcc -O3
    movsx   rcx, DWORD PTR [rdx]  # sign-extending load of data[c]
    mov     rsi, rcx
    add     rcx, rbx        # rcx = sum+data[c]
    cmp     esi, 127
    cmovg   rbx, rcx        # sum = data[c]>127 ? rcx : sum
    add     rdx, 4          # pointer-increment
    cmp     r12, rdx
    jne     .L82

gcc 可以使用 LEA 而不是 ADD 来保存 MOV。

循环瓶颈在于 ADD->CMOV(3 个周期)的延迟,因为循环的一次迭代使用 CMO 写入 rbx,而下一次迭代使用 ADD 读取 rbx。

该循环仅包含 8 个融合域微指令,因此每 2 个周期可以发出一个。执行端口压力也不像执行端口的延迟那样是一个严重的瓶颈。sumdep 链,但很接近(Sandybridge 只有 3 个 ALU 端口,与 Haswell 的 4 个不同)。

顺便说一句,写成sum += (data[c] >= 128 ? data[c] : 0);采取cmov循环外携带的 dep 链可能很有用。仍然有很多说明,但是cmov每次迭代都是独立的。这在 gcc6.3 中按预期编译-O2和更早的 https://gcc.godbolt.org/#g:!((g:!((g:!((h:codeEditor,i:(j:1,source:'%23include+%3Calgorithm%3E%0A%23include+%3Cctime%3E%0A%23include+%3Ciostream%3E%0A%0Aint+main()%0A%7B%0A++++//+Generate+data%0A++++const+unsigned+arraySize+%3D+32768%3B%0A++++int+data%5BarraySize%5D%3B%0A%0A++++for+(unsigned+c+%3D+0%3B+c+%3C+arraySize%3B+%2B%2Bc)%0A++++++++data%5Bc%5D+%3D+std::rand()+%25+256%3B%0A%0A++++//+!!!!!!+With+this,+the+next+loop+runs+faster%0A++++std::sort(data,+data+%2B+arraySize)%3B%0A%0A++++//+Test%0A++++clock_t+start+%3D+clock()%3B%0A++++long+long+sum+%3D+0%3B%0A%0A++++for+(unsigned+i+%3D+0%3B+i+%3C+100000%3B+%2B%2Bi)%0A++++%7B%0A++++++++//+Primary+loop%0A++++++++for+(unsigned+c+%3D+0%3B+c+%3C+arraySize%3B+%2B%2Bc)%0A++++++++%7B%0A%23if+0%0A++++++++++++if+(data%5Bc%5D+%3E%3D+128)%0A++++++++++++++++sum+%2B%3D+data%5Bc%5D%3B%0A%23else%0A++++++++++++sum+%2B%3D+(data%5Bc%5D+%3E%3D+128+%3F+data%5Bc%5D+:+0)%3B%0A%23endif%0A++++++++%7D%0A++++%7D%0A%0A++++double+elapsedTime+%3D+static_cast%3Cdouble%3E(clock()+-+start)+/+CLOCKS_PER_SEC%3B%0A%0A++++std::cout+%3C%3C+elapsedTime+%3C%3C+std::endl%3B%0A++++std::cout+%3C%3C+%22sum+%3D+%22+%3C%3C+sum+%3C%3C+std::endl%3B%0A%7D%0A'),l:'5',n:'0',o:'C%2B%2B+source+%231',t:'0')),k:33.36599326802078,l:'4',n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:g63,filters:(b:'0',binary:'1',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',trim:'1'),libs:!(),options:'-O2+-std%3Dgnu%2B%2B11+-Wall+-mtune%3Dhaswell',source:1),l:'5',n:'0',o:'x86-64+gcc+6.3+(Editor+%231,+Compiler+%231)',t:'0')),k:32.731651559407744,l:'4',m:100,n:'0',o:'',s:0,t:'0'),(g:!((h:compiler,i:(compiler:g63,filters:(b:'0',binary:'1',commentOnly:'0',demangle:'0',directives:'0',execute:'1',intel:'0',trim:'1'),libs:!(),options:'-O3+-std%3Dgnu%2B%2B11+-Wall+-mtune%3Dhaswell',source:1),l:'5',n:'0',o:'x86-64+gcc+6.3+(Editor+%231,+Compiler+%232)',t:'0')),k:33.90235517257147,l:'4',n:'0',o:'',s:0,t:'0')),l:'2',n:'0',o:'',t:'0')),version:4,但是 gcc7 去优化为cmov在关键路径上(https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82666 https://gcc.gnu.org/bugzilla/show_bug.cgi?id=82666)。 (它还使用比 gcc 版本更早的版本自动矢量化if()的书写方式。)

即使使用原始源代码,Clang 也会使 cmov 脱离关键路径。


gcc -O2使用分支(对于 gcc5.x 及更早版本),它可以很好地预测,因为您的数据已排序。由于现代 CPU 使用分支预测来处理控制依赖性,因此循环携带的依赖性链更短:只需一个add(1 个周期延迟)。

由于分支预测+推测执行,每次迭代中的比较和分支都是独立的,这使得执行可以在确定分支方向之前继续。

.L83:   # The inner loop from gcc -O2
    movsx   rcx, DWORD PTR [rdx]  # load with sign-extension from int32 to int64
    cmp     ecx, 127
    jle     .L82        # conditional-jump over the next instruction 
    add     rbp, rcx    # sum+=data[c]
.L82:
    add     rdx, 4
    cmp     rbx, rdx
    jne     .L83

有两个循环携带的依赖链:sum和循环计数器。sum是 0 或 1 个周期长,循环计数器始终是 1 个周期长。然而,该循环在 Sandybridge 上有 5 个融合域微指令,因此无论如何它每次迭代都无法以 1c 的速度执行,因此延迟不是瓶颈。

它可能以大约每 2 个周期一次迭代的速度运行(分支指令吞吐量的瓶颈),而 -O3 循环每 3 个周期一次迭代。下一个瓶颈是 ALU uop 吞吐量:4 个 ALU uop(在未采用的情况下),但只有 3 个 ALU 端口。 (ADD 可以在任何端口上运行)。

此管道分析预测与 -O3 的 ~3 秒和 -O2 的 ~2 秒的时间几乎完全匹配。


Haswell/Skylake 可以每 1.25 个周期运行一次未采取的情况,因为它可以在与采取的分支相同的周期中执行未采取的分支,并且具有 4 个 ALU 端口。 (或者稍微少一点,因为5 uop 循环在每个周期 4 uop 时不太问题 https://stackoverflow.com/questions/39311872/is-performance-reduced-when-executing-loops-whose-uop-count-is-not-a-multiple-of).

(刚刚测试过:Skylake @ 3.9GHz 在 1.45 秒内运行整个程序的分支版本,或在 1.68 秒内运行无分支版本。因此差异要小得多。)


g++6.3.1 使用cmov即使在-O2,但 g++5.4 的行为仍然与 4.9.2 类似。

对于 g++6.3.1 和 g++5.4,使用-fprofile-generate / -fprofile-use即使在-O3 (with -fno-tree-vectorize).

较新 gcc 中循环的 CMOV 版本使用add ecx,-128 / cmovge rbx,rdx而不是 CMP/CMOV。这有点奇怪,但可能不会减慢速度。 ADD 会写入输出寄存器和标志,因此会对物理寄存器的数量造成更大的压力。但只要这不是瓶颈,就应该大致相等。


较新的 gcc 使用 -O3 自动矢量化循环,即使仅使用 SSE2,这也是显着的加速。 (例如我的 i7-6700k Skylake 运行矢量化版本 在 0.74 秒内,大约是标量的两倍。或者-O3 -march=native在 0.35 秒内,使用 AVX2 256b 向量)。

矢量化版本看起来有很多指令,但还不错,而且其中大多数不是循环携带的 dep 链的一部分。它只需在接近末尾时解压为 64 位元素。确实如此pcmpgtd但两次,因为它没有意识到当条件已经将所有负整数归零时,它可以只进行零扩展而不是符号扩展。

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

gcc 优化标志 -O3 使代码比 -O2 慢 的相关文章

  • 具有不同大小结构的结构数组的 malloc()

    如果每个结构都包含一个大小不同的字符串数组 那么如何正确地 malloc 一个结构数组 因此每个结构可能有不同的大小 并且不可能 realloc 结构体数量 sizeof 结构体名称 after malloc 初始大小 sizeof 结构名
  • 通过增加索引之和来生成排序组合的有效方法

    对于启发式算法 我需要一个接一个地评估特定集合的组合 直到达到停止标准 由于它们很多 目前我正在使用以下内存高效迭代器块生成它们 受到 python 的启发 itertools combinations http docs python o
  • Subversion 和 Visual Studio 项目的最佳实践

    我最近开始在 Visual Studio 中处理各种 C 项目 作为大型系统计划的一部分 该系统将用于替换我们当前的系统 该系统是由用 C 和 Perl 编写的各种程序和脚本拼凑而成的 我现在正在进行的项目已经达到了颠覆的临界点 我想知道什
  • ASP.NET Core 与现有的 IoC 容器和环境?

    我想运行ASP NET 核心网络堆栈以及MVC在已托管现有应用程序的 Windows 服务环境中 以便为其提供前端 该应用程序使用 Autofac 来处理 DI 问题 这很好 因为它已经有一个扩展Microsoft Extensions D
  • 在 C# 中生成 HMAC-SHA1

    我正在尝试使用 C 来使用 REST API API 创建者提供了以下用于 hmac 创建的伪代码 var key1 sha1 body var key2 key1 SECRET KEY var key3 sha1 key2 var sig
  • (const T v) 在 C 中从来都不是必需的,对吗?

    例如 void func const int i 在这里 const是不必要的 因为所有参数都是按值传递的 包括指针 真的吗 C 中的所有参数确实都是按值传递 这意味着无论您是否包含该参数 实际参数都不会改变const or not 然而
  • 将字符串中的“奇怪”字符转换为罗马字符

    我需要能够将用户输入仅转换为 a z 罗马字符 不区分大小写 所以 我感兴趣的角色只有26个 然而 用户可以输入他们想要的任何 形式 的字符 西班牙语 n 法语 e 和德语 u 都可以包含用户输入中的重音符号 这些重音符号会被程序删除 我已
  • SFINAE 如何使用省略号?

    过去 当使用 SFINAE 选择构造函数重载时 我通常使用以下内容 template
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • OpenCV 2.4.3 中的阴影去除

    我正在使用 OpenCV 2 4 3 最新版本 使用内置的视频流检测前景GMG http docs opencv org modules gpu doc video html highlight gmg gpu 3a 3aGMG GPU算法
  • C++ 错误 - “成员初始值设定项表达式列表被视为复合表达式”

    我收到一个我不熟悉的 C 编译器错误 可能是一个非常愚蠢的错误 但我不能完全指出它 Error test cpp 27 error member initializer expression list treated as compound
  • 从 R 到 C 处理列表并访问它

    我想使用从 R 获得的 C 列表 我意识到这个问题与此非常相似 使用 call 在 R 和 C 之间传递数据帧 https stackoverflow com questions 6658168 passing a data frame f
  • asp.net网格分页的SQL查询

    我在用iBatis and SQLServer 使用偏移量和限制进行分页查询的最佳方法是什么 也许我添加该列ROW NUMBER OVER ORDER BY Id AS RowNum 但这只会阻止简单查询的数据访问 在某些情况下 我使用选择
  • WPF。如何从另一个窗口隐藏/显示主窗口

    我有两个窗口 MainWindow 和 Login 显示登录的按钮位于主窗口 this Hide Login li new Login li Show 登录窗口上有一个检查密码的按钮 如果密码正确 我如何显示主窗口 将参数传递给 MainW
  • 使用 mingw32 在 Windows 上构建 glew 时“DllMainCRTStartup@12”的多个定义

    我关注了这个主题 使用 mingw 使建筑物在 Windows 上闪闪发光 https stackoverflow com questions 6005076 building glew on windows with mingw 6005
  • ASP.NET JQuery AJAX POST 返回数据,但在 401 响应内

    我的应用程序中有一个网页 需要调用我设置的 Web 服务来返回对象列表 这个调用是这样设置的 document ready function var response ajax type POST contentType applicati
  • 使用 iTextSharp 5.3.3 和 USB 令牌签署 PDF

    我是 iTextSharp 和 StackOverFlow 的新手 我正在尝试使用外部 USB 令牌在 C 中签署 PDF 我尝试使用从互联网上挖掘的以下代码 Org BouncyCastle X509 X509CertificatePar
  • 受限 AppDomain 中的代码访问安全异常

    Goal 我需要在权限非常有限的 AppDomain 中运行一些代码 它不应该访问任何花哨或不安全的内容 except对于我在其他地方定义的一些辅助方法 我做了什么 我正在创建一个具有所需基本权限的沙箱 AppDomain 并创建一个运行代
  • 类中不允许使用不完整类型,但类模板中允许使用不完整类型

    以下为无效代码 struct foo struct bar bar x error field x has incomplete type struct bar int value 42 int main return foo x valu
  • 在 Xamarin 中获取 OutOfMemoryException

    java lang OutOfMemoryError 考虑增加 JavaMaximumHeapSize Java 执行时内存不足 java exe 我的 Visualstudio Xamarin 项目出现内存不足异常 请帮助我如何解决此问题

随机推荐

  • 获取 OpenLayers 中绘制要素的坐标

    我正在尝试使用 OpenLayers 3 创建在线地图 我对使用 OpenLayers 是全新的 我想做的就是获取我在地图上绘制的点 线 多边形的坐标 我知道有一个 featuresadded 参数可用 但我无法正确实现它 有人能给我指明如
  • Firebase 推送通知在 NuxtJS 中停止工作

    我再次在推送通知方面遇到一些麻烦 几周前相同的代码也有效 昨天我无意中发现推送通知不再起作用 我正在做的和写的一样文档 https firebase google com docs cloud messaging js receive 我使
  • 如何使用 Python PPTX 设置图表标题的字体大小?

    我添加了一个图表 doughnutchart data add series YTD COMPLETION TO PLAN PerformancePercent NotPerformedPercent 这为我提供了带有文本的图表标题 但如何
  • 在多台笔记本电脑上运行相同的 Rails 代码并将所有笔记本电脑的数据保存到同一个数据库

    我正在尝试在 localhost 3000 上的多台笔记本电脑上运行相同的 Rails 代码 如何将从不同笔记本电脑提交的数据保存在单个数据库中 或者 他们将共享相同的数据库 如果有人提交了数据 数据将自动存储在其他人的笔记本电脑上 还要考
  • 静态方法内的变量共享

    我对静态方法内的变量有疑问 静态方法内的变量是否共享相同的内存位置 或者它们有单独的内存吗 这是一个例子 public class XYZ Public Static int A int value int b value return b
  • 删除div中的空行

    我有一个标签 pre this is a this is b this is c pre 浏览器解析后输出 this is a this is b this is c 我想要的是 this is a this is b this is c
  • JSF 2.0 无法从 primefaces 渲染对话框

    最近我在使用 primefaces 组件时遇到了很多问题 我不知道为什么 我使用glassfishV3 0 我的primefaces版本是2 2 1 我现在的问题是 当我单击表行时 我无法使 primefaces 的 p dialog 呈现
  • 清除 symfony 2 中日志文件的命令

    我想知道 Symfony 2 中是否有清除日志文件的命令 虽然有php app console cache clear要清除缓存 我不知道任何命令来清除日志文件 logs dev log 和logs prod log 我一直手动清除这些日志
  • 如何在C++中存储1000000位整数

    在我的问题中 我必须保存大整数 例如最多 1000000 位数字 并执行一些操作 我该怎么做 我知道 C 中的 long int 最多可以存储 10 位数字 您可以使用GMP http gmplib org GNU 任意精度库 请注意 这不
  • 如何在 R 中使用范围数据显示离散类别中的频率?

    我正在尝试整理我掌握的有关恐龙及其年龄范围的大量数据 到目前为止 我的数据由一列名称组成 然后是两列过去数百万年的最大和最小日期 如下所示 GENUS ma max ma min ma mid Abydosaurus 109 94 3 10
  • android:等待连接时显示进度对话框

    我试图在启动新活动时添加一个进度对话框 该活动必须等待来自互联网的响应 目前 等待时屏幕会变黑 有谁知道它需要放置在哪里才能工作吗 这个进度对话框 ProgressDialog dialog ProgressDialog show Sear
  • 多行 UIButton 和自动布局

    我创建了一个视图控制器 如下所示 我希望两个顶部按钮与整个视图的左 右边缘之间始终保持 20 个点 它们也应该始终具有相同的宽度 我已经为所有这一切创建了约束 并且它完全按照我想要的方式工作 问题是垂直限制 按钮应始终位于顶部边缘下方 20
  • 如何在 Dancer 模板中制作特定于页面的标题?

    我有一个标准的 Perl Dancer 应用程序 使用 Template Toolkit 作为渲染引擎 有两条路线 get gt sub template index get foo gt sub template foo My views
  • Doctrine2 将实体导出到数组

    I have Product具有多对一的实体Category实体 我需要商店Product会议中 首先我尝试实施 Serializable产品上的界面 我应该如何序列化我的相关Category实体 我是否也应该实施 Serializable
  • 错误!代码 EPERM

    我正在使用 Node v6 11 2 npm v5 3 0 和 Angular cli v1 2 7 我的大部分 npm 安装突然收到以下错误消息 以前没见过 mmeppiel MC LT MMEPPIEL MINGW64 Desktop
  • 我可以在调用 Flask app.run 之后让 Python 代码继续执行吗?

    尽管过去 30 年来我一直在使用其他语言进行编程 但我才刚刚开始使用 Python 我想让我的第一个应用程序保持简单 所以我从一个托管在 Raspberry Pi 上的小型家庭自动化项目开始 我的代码工作正常 控制阀门 读取流量传感器并在显
  • 使用 Django 和 Twilio 通过短信进行一次性用户身份验证

    我正在 Django 中为我正在创建的移动应用程序编写后端 我需要在用户第一次通过短信打开移动应用程序时对其进行身份验证 以验证其是否为真人 需要发生的事情如下 用户在应用程序中输入电话号码 服务器然后向用户发送带有验证码的短信 然后用户在
  • 如何通过 VSCode 始终在新窗口中打开文件?

    Using MacOS Mojave VSCode 1 28 2 我在文本编辑中使用 VSCode 如 js txt csv 当我双击并在 Finder 或桌面中打开文件 或 在 VSCode 中打开 时 如果我打开另一个工作区 它会在与我
  • 我可以为 C# 中的匿名类指定一个有意义的名称吗?

    我们都知道 当我们创建这样的匿名类时 var Employee new ID 5 Name Prashant 在运行时它将是以下类型 lt gt f AnonymousType0
  • gcc 优化标志 -O3 使代码比 -O2 慢

    我找到这个话题为什么处理排序数组比处理未排序数组更快 https stackoverflow com questions 11227809 why is processing a sorted array faster than an un