English 中文(简体)
海湾合作委员会 为什么不实行最佳时机?
原标题:GCC Why Non Run Optimization All Time?

我在C写上了众所周知的雕刻功能,用电灯观察组的组装产出,并再次这样做,但优化了O2。

差异很大,因为与20条线相比,我只看到5条线。

我的问题是,如果选择真正有助于什么理由不使用否决权? 我们为什么不鼓励编纂法典?

www.un.org/Depts/DGACM/index_spanish.htm 当你在测试之后公布您方案的最后版本时,对从事该行业的人提出额外的问题?

www.un.org/Depts/DGACM/index_spanish.htm 请宣读你的所有意见。

问题回答

有几个原因。

1. Compilation takes longer time

对于中小型项目,今天很少出现这个问题。 现代计算机是快车。 如果采用5或10秒,则通常无关紧要。 但对于大型项目来说,它确实很重要。 尤其是如果建筑工程没有适当建立的话。 我记得,当我试图在游戏中添加一个特征:。 汇编大约10分钟。 如果你能够的话,很容易看到你想要把这减少到5分钟或更低。

2. Optimized code is harder to debug

更难以推测的原因是,变换者没有按行走方案线。 这只是一种幻想。 这里的例子可能是一个问题:

int main(void) {
    char str[] = "Hello, World!";
    
    int number_of_capital_letters = 0;

    for(int i=0; i<strlen(str); i++) {
        if(isupper(str[i]))
            number_of_capital_letters++;
    }

    printf("%s
", str);

    // Outcommented for debugging reasons
    // printf("%d
", number_of_capital_letters);
}

您向你们的夸大了,并想知道它为什么不跟踪<代码>_of_capital_letters。 并且,你发现,由于你对最后的<条码>print/条码>说明发表了评论,因此该变量没有用于任何可观察到的行为,因此,最优化的改动了你的代码:

int main(void) {
    puts("Hello, World!");
}

人们可以争辩说,然后,你就把最佳办法推向去,建造一条 de。 而且,当一个。 但第三个原因是:

3. Sometimes bugs only show up at higher optimization levels.

Imagine that you have a big code base. When you upgrade the compiler, a bug suddenly emerges. And it seems to vanish when you remove optimization. What s the problem here? Well, it could be a bug in the optimizer. But it could also be a bug in your code that manifested itself with the new version of the optimizer. Very often, code with undefined behavior behaves different in code compiled with optimization.

So what do you do? You could try to figure out if the bug is in the optimizer or your code. That can be a VERY time consuming task. Let s assume it s a bug in the optimizer. What to do? You could downgrade your compiler, which is not optimal for several reasons. Especially if it s an open source project. Imagine downloading the source and then run the build script and scratching your head for hours to figure out what s wrong, and then you see in some documentation (provided that the author documented it) that you need a specific version of a specific compiler.

相反,让我们把它推向你们的法典。 当然,要确定这一点是理想的。 但也许你们没有资源这样做。 此时此刻,你还可以要求任何汇编者使用某种版本的具体汇编者。

但是,如果你能够用<条码>-O3替换成<条码>-O2,你可以清楚地看到,它有时在我们的非理想世界中是一种可行的选择,而时间不是无限的资源。 有了一条坏uck的灯光,这种ug子可以花一个星期才能追踪。 或更多。 那天,你可以花在其他地方。

这里就是一个例子:

#include <stdio.h>

int main(void) {
    char str[] = "Hello";
    str[5] =  ! ;
    puts(str);
}

当我用10.2克谢来汇编这一数据时,我根据优化程度得出不同的结果。

Without optimization:

Hello!

优化:

Hello!`@

Try it out yourself:

https://godbolt.org/z/5dcKKrEW1

https://godbolt.org/z/48bz5ae1d

在这里,我发现了一个论坛,在这个论坛上,辩论会建造了工程,但没有释放:https://developer.apple.com/forums/thread/15112

4. Sometimes bugs only show up at LOWER optimization levels.

情况也可能发生。 在这种情况下,如果你不关心正确性,你就能够提高最佳程度。 但是,如果你谨慎,这可以成为找到ug的办法。 如果你的法典正确操作并且没有优化,那么它就更可能含有今后会困扰你的ug子,而如果你只是以优化的方式汇编成文的话。

我没有发现一个行之有效的例子,但理论上可能这样做。

int main(void) {
    if(1/0) // Division by zero
        puts("An error has occurred");
    else
        puts("Everything is fine");
}

如果这种汇编没有优化,就会发生故障。 但是,最优化者可能认为,没有界定的行为(如零的分裂)永远不会发生,因此它优化了守则,使之公正:

int main(void) {
    puts("Everything is fine");
}

假设<代码>1/0是某种错误核对,很难加以评价,因此,通常会假设节目印刷“每打一次罚款”。 在这里,最优化者隐藏着一杯。

5. The optimizer might produce a binary that s bigger in size, or is using more memory. Or something else that s not desirable.

有时情况如此。 特别是在嵌入式系统中。 通常(途径)<代码>-O0产生非常大的代码,但你可能希望使用<代码>-Os(大小而不是速度的鼓励)而不是<代码>-O3,以获得一个小型双亲。 有时还能加快制定法典。 见下文。

6. The optimizer might produce slower code

Yep, 确实。 这并非经常发生,而是可能发生。 可在

If you never use a source level debugger you probably could. But if you never use a source level debugger, you probably should.

未经开发的法典对源代码中的表述和变数有直接一对一的对应关系,因此,在通过该守则时,所有线都是有意义的——所有线都是按你预期的顺序执行,所有变数在你期望时都有有效状态。

而优化的法典则可以消除法典和变量,重新排列执行顺序,一般使来源水平偏离非专利。 有时,在选择建造的建筑中,你只得到一张“ > <> > > 只见<>> /em”的灯,因此,你可能不得不处理,但一般而言,这种事情是未界定的行为<>的结果,一般而言,最好避免这种情况。

值得考虑的一个问题是,在发展过程中,你进行了关于无益守则的所有测试和开发工作;因此,你可以加以.弄。 如果在你释放时,你rank倒了选客的舱位,将其船运,那么,你基本上要运送大量的未经测试的代码。 测试是困难的,你真的应该测试你释放的东西,这样,在建设和释放你之间,你可能有很多工作要做,以消除风险。 把你每天在发展过程中进行测试的同一建筑幽灵排除在外,风险可能较低。

对于在台式上运行的、对用户投入的反应和等待,或者在磁盘或网络I/O约束上运行的代码,使该代码更快或更小,往往用处不大。 大型应用中可能会有具体部分,如大型数据集的分类或搜索算法,或图像或音频处理法,而对于您可能使用有针对性的全方位应用选择法。

在嵌入式系统中,如果你使用处理器的速度往往比拥有更小的记忆资源的桌面系统要慢得多,那么选择速度和规模都可能至关重要,但即便如此,守则通常必须既适合,也符合其精炼的实时期限,以便支持测试和分解。 如果它只是优化工作,那么就更难解。

除了选择你的代码外,或许应该指出,为了完成这一工作,选择者必须通过诸如销毁<>>>等技术对守则进行更深入的分析,这样就可以找到ug,发出警告,即正常汇编不会发现。 例如,在发现在开始使用之前可能使用的变量时,优化者非常好。 为此,我建议把选择人变成一种“穷人”的静态分析,并尽量扩大选择,即使你出于先前的原因使用较低的选择释放标准。

选择人也是任何汇编者中最复杂的部分;如果汇编者有ug,则可能选择。 尽管如此,在1989年的Microsoft C v6.0中,我从未遇到过这种确认的ug。 起初似乎是一种汇编者,其结果往往是不明确的行为,或正在汇编的来文方中带有不同代法选择的潜水器。

我个人通常选择了。

我的原因如下:

由于我们需要——特别是数字——性能,运输法是以优化方式制定的。 既然你可以拖船检查你带的拖船,也必须选择测试版本。 如果在发展阶段不选择发展,我会相信能够建设,但我会决定额外的时间,然后通过选择和测试在释放之前进行建设。 此外,业绩有时是投机的一部分,因此,有些发展测试必须以选择性的代码进行。

我看不出使用一种精选的法典的夸张。 鉴于我主要撰写的那种方案——没有用户接口和数字图书馆的轮胎过滤器——印刷版和阀门(用选择性代码进行罚款)是我的首选工具。

在最近几版的“加速治疗”中,至少通过优化而不是脱胎而产生更多更好的诊断。

如同方案规划中的其他许多工作一样,这种情况当然会因情况而异。

One reason is probably just: tradition. The first C compiler was written for the DEC PDP-11, which had a 64k address space. (That s right, a tenth of that famous but mythical old IBM PC quote about "640k should be enough for anybody".) The first C compiler ran as quite a number of separate programs or passes: there was the preprocessor cpp, the parser c0, the code generator c1, the assembler as, and the linker ld. If you asked for optimization, it ran as a separate pass c2 which was a "peephole optimizer" operating on c1 s output, before passing it to as.

这些日子的汇编速度比今天要慢(当然,加工商的速度要慢得多)。 人们通常不要求优化日常工作,因为你确实在你的ed/comp/de周期中花费了很多东西。

虽然自那时以来,情况发生了很大变化,但优化是你们必须明确要求的额外、特殊的东西。

《标准》允许汇编者,作为一种“修改语言扩展”的形式,在比《标准》规定更重要的情况下,通过“以环境特征的有文件记载的方式”处理它们的行为,这样做是有用的,没有理由这样做。 在许多情况下,这种行为使得能够比其他可能的工作更有效率地完成任务。

但是,一些编织者,如克塞克和部族,根据以下假设设计优化:方案将永远不会收到与上述语文推广相关的投入,并且将摆脱“优化”任何只与这种假想相关的建筑。 取消这种优化将使这种汇编者与依靠《标准》作者在公布的《理论》中所引述的“某些大众推广”的方案相一致。

选择真正有助于什么理由不使用?> 问题似乎被误解。 优化的目标是什么?

除了其他答复中就“”所有时间为何不能使用优化”所提出的许多要点之外,还有的问题,应当转向“优化”。 OP 问题似乎确实是关于海湾合作委员会等优化程度的default

是的,执行速度有时是释放守则的一个优先事项,但并不总是如此。 有时,双亲的规模优先。 现有优质优化方案。 其中哪一部分应该通过违约提供? 事实上,海合会作出这一选择:-O0是按违约情况优化的。 利用<代码>-help=optimizers对海合会12.2进行快速研究,以观察能够优化的旗帜,显示有266个最优化的旗帜。 请注意,这些<代码>-f的备选办法中,只有选定了某些<代码>-O水平时才会有用。 部分内容载于<代码>-O。 国旗:

  • -O0 (the default level) enables 49 optimization flags
  • -O1 enables 90 optimization flags
  • -Os enables 127 optimization flags
  • -O2 enables 134 optimization flags
  • -O3 enables 147 optimization flags
  • -Ofast enables 149 optimization flags

请注意,上述各项内容并不严格准确,因为某些悬挂本国国旗的国旗本身使一些悬挂本国国旗的国旗得以悬挂。

If the goal is speed, perhaps -Ofast should be the default. Yet this flag enables ffast-math which can cause subtle problems for numerically sensitive code; this is probably not a good default. Sometimes optimizations involve trade-offs which may be significant. GCC has already made a choice for what they consider to be a useful general default optimization level for development cycles. Other optimization levels may be appropriate during development, but these may also involve further specifics which may not always be the best choices. OP s "what s the reason of not using it all the time" simply paints the question with too broad of a brush, and even OP s comments about "but I m talking about speed optimizations" is too broad as there are many detailed considerations that may be relevant here.





相关问题
Fastest method for running a binary search on a file in C?

For example, let s say I want to find a particular word or number in a file. The contents are in sorted order (obviously). Since I want to run a binary search on the file, it seems like a real waste ...

Print possible strings created from a Number

Given a 10 digit Telephone Number, we have to print all possible strings created from that. The mapping of the numbers is the one as exactly on a phone s keypad. i.e. for 1,0-> No Letter for 2->...

Tips for debugging a made-for-linux application on windows?

I m trying to find the source of a bug I have found in an open-source application. I have managed to get a build up and running on my Windows machine, but I m having trouble finding the spot in the ...

Trying to split by two delimiters and it doesn t work - C

I wrote below code to readin line by line from stdin ex. city=Boston;city=New York;city=Chicago and then split each line by ; delimiter and print each record. Then in yet another loop I try to ...

Good, free, easy-to-use C graphics libraries? [closed]

I was wondering if there were any good free graphics libraries for C that are easy to use? It s for plotting 2d and 3d graphs and then saving to a file. It s on a Linux system and there s no gnuplot ...

Encoding, decoding an integer to a char array

Please note that this is not homework and i did search before starting this new thread. I got Store an int in a char array? I was looking for an answer but didn t get any satisfactory answer in the ...