Tag: 优化

为什么没有两个只有注释的程序的二进制文件在gcc中完全匹配?

我创build了两个C程序 计划1 int main() { } 计划2 int main() { //Some Harmless comments } AFAIK,编译时,编译器(gcc)应该忽略注释和冗余的空白,因此输出必须相似。 但是,当我检查输出二进制文件的md5sums,他们不匹配。 我也尝试编译优化-O3和-Ofast但他们仍然不匹配。 这里发生了什么? 编辑:确切的命令和那里md5sums是(t1.c是程序1和t2.c是程序2) gcc ./t1.c -o aaa gcc ./t2.c -o bbb 98c1a86e593fd0181383662e68bac22f aaa c10293cbe6031b13dc6244d01b4d2793 bbb gcc ./t2.c -Ofast -o bbb gcc ./t1.c -Ofast -o aaa 2f65a6d5bc9bf1351bdd6919a766fa10 aaa c0bee139c47183ce62e10c3dbc13c614 bbb gcc ./t1.c -O3 -o aaa gcc ./t2.c -O3 -o bbb […]

无论结果如何,支持除零的最快整数除法是什么?

概要: 我正在寻找最快的方法来计算 (int) x / (int) y 没有得到y==0的exception。 相反,我只是想要一个任意的结果。 背景: 在对image processingalgorithm进行编码时,我经常需要除以(累加的)alpha值。 最简单的变体是整数算术的纯C代码。 我的问题是,我通常得到一个由零错误除alpha==0结果像素alpha==0 。 然而,这正是结果完全不重要的像素:我不关心alpha==0像素的颜色值。 细节: 我正在寻找像这样的东西: result = (y==0)? 0 : x/y; 要么 result = x / MAX( y, 1 ); x和y是正整数。 代码在嵌套循环中执行了很多次,所以我正在寻找一种方法来摆脱条件分支。 当y不超过字节范围时,我对解决scheme感到满意 unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, […] 255 }; […] result = […]

在C ++中,我应该费心去cachingvariables,还是让编译器进行优化? (混叠)

考虑下面的代码( p是unsigned char*的types,而bitmap->width是一些整数types,它是未知的,取决于我们使用的外部库的版本): for (unsigned x = 0; x < static_cast<unsigned>(bitmap->width); ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } 它是值得优化它[..] 有没有这样的情况下,可以写出更有效的结果: unsigned width(static_cast<unsigned>(bitmap->width)); for (unsigned x = 0; x < width; ++x) { *p++ = 0xAA; *p++ = 0xBB; *p++ = 0xCC; } …或者这是编译器优化这个微不足道的? 你认为什么是“更好”的代码? 编者注(艾克):对于那些想知道三文治文本的人来说,原来的这个问题,如同所说的那样,离危险的地方很近,尽pipe得到了正面的反馈,但却非常接近封闭。 这些已经被打破了。 但是,请不要惩罚处理这些问题的答复者。

为什么C ++编译器不能将这个条件布尔赋值作为无条件赋值来优化?

考虑以下function: void func(bool& flag) { if(!flag) flag=true; } 在我看来,如果标志有一个有效的布尔值,这将等于无条件设置为true ,如下所示: void func(bool& flag) { flag=true; } 然而gcc和clang都没有这样优化它们 – 都在-O3优化级别生成以下代码: _Z4funcRb: .LFB0: .cfi_startproc cmp BYTE PTR [rdi], 0 jne .L1 mov BYTE PTR [rdi], 1 .L1: rep ret 我的问题是:这只是代码是太特殊的情况下,照顾优化,或者有什么好的理由,为什么这样的优化将是不受欢迎的,因为该flag不是一个参考volatile ? 这似乎是唯一可能的原因是flag在某种程度上可能具有非true false价值,而在阅读时却没有不确定的行为,但我不确定这是否可能。

在发布前优化Android应用程序

我处于一个“ 特殊 ”情况下,关于我的程序的效率 。 现在我正处于一个需要改善应用程序性能并降低电池消耗的阶段 。 在问题之前: 首先 ,我的申请工作。 它运行良好 – 没有任何错误。 其次 ,我已经阅读了Android开发者网站上的“优化电池寿命”,并对他们所要求的小事进行了优化。 没有任何问题。 现在,我很想知道其他开发人员用来优化自己的应用程序的特殊修复程序。 用户可能永远不会认可或注意的东西。 但是,修复将增加电池寿命或帮助改进应用程序的维护。 那么, 你独特的优化技巧是什么? 我正处于一个特别的情况,那就是我真的在寻找知识,我认为这将是一个很好的机会来分享开发人员对他们所处状况的了解。 请给出最佳答案,因为这将鼓励伟大的开发者分享他们的知识。

快速find一个值是否存在于C数组中?

我有一个embedded式应用程序,其中包含一个对时间要求严格的ISR,需要遍历256个数组(最好是1024,但最less为256),并检查一个值是否与数组内容匹配。 一个bool将被设置为true是这样的。 MCU是恩​​智浦LPC4357,ARM Cortex M4内核,编译器是GCC。 我已经组合了优化级别2(3慢),并将其放入RAM而不是闪存。 我也使用指针算术和for循环,而不是向下计数(检查i!=0是否快于检查i<256 )。 总而言之,我最终需要12.5us的时间,这个时间必须大大缩短才行。 这是我现在使用的(伪)代码: uint32_t i; uint32_t *array_ptr = &theArray[0]; uint32_t compareVal = 0x1234ABCD; bool validFlag = false; for (i=256; i!=0; i–) { if (compareVal == *array_ptr++) { validFlag = true; break; } } 什么是绝对最快的方法来做到这一点? 使用内联汇编是允许的。 其他“不太优雅的”技巧也是允许的。

为什么Clang会优化x * 1.0而不是x + 0.0?

为什么铿锵优化了这个代码中的循环 #include <time.h> #include <stdio.h> static size_t const N = 1 << 27; static double arr[N] = { /* initialize to zero */ }; int main() { clock_t const start = clock(); for (int i = 0; i < N; ++i) { arr[i] *= 1.0; } printf("%u ms\n", (unsigned)(clock() – start) * 1000 / CLOCKS_PER_SEC); […]

为什么在Ruby中构buildstring时,铲运算符(<<)优先于plus-equals(+ =)?

我正在通过Ruby Koans工作。 test_the_shovel_operator_modifies_the_original_string中的test_the_shovel_operator_modifies_the_original_string Koan包含以下注释: 在构buildstring时,Ruby程序员倾向于在正等号运算符(+ =)上使用铲子运算符(<<)。 为什么? 我的猜测是涉及速度,但我不明白在引擎盖下的动作会导致铲车运行速度更快。 有人能够解释这个偏好背后的细节吗?

Sql:如何正确地检查一条logging是否存在

读一些SQL调优文档我发现这个: Select count(*) : – 统计行数 – 通常被错误地用来validationlogging的存在 Select count(*)真的不好吗? validationlogging存在的正确方法是什么?

为什么是一个简单的循环优化时,极限是959而不是960?

考虑这个简单的循环: float f(float x[]) { float p = 1.0; for (int i = 0; i < 959; i++) p += 1; return p; } 如果使用-march=core-avx2 -Ofast编译gcc 7(快照)或clang(trunk), -march=core-avx2 -Ofast得到与之非常相似的内容。 .LCPI0_0: .long 1148190720 # float 960 f: # @f vmovss xmm0, dword ptr [rip + .LCPI0_0] # xmm0 = mem[0],zero,zero,zero ret 换句话说,它只是将答案设置为960而不循环。 但是,如果您将代码更改为: float f(float x[]) […]