许多年前,C编译器并不是特别聪明.作为一种解决方法,K&R发明了register关键字,提示编译器,将这个变量保存在内部寄存器中可能是一个好主意.他们还使第三级运营商帮助生成更好的代码.
随着时间的推移,编译器逐渐成熟.他们变得非常聪明,他们的流量分析使他们能够更好地决定寄存器中的值,而不是你可能做的.register关键字变得不重要了.
由于别名问题,FORTRAN对于某些操作可能比C更快.从理论上讲,仔细编码可以解决这个限制,使优化器能够生成更快的代码.
有哪些编码实践可以使编译器/优化器生成更快的代码?
这是一个相关的问题
[编辑] 这个问题不是关于分析和优化的整个过程.假设程序编写正确,编译完全优化,测试并投入生产.您的代码中可能有一些构造禁止优化器尽其所能地完成最佳工作.您可以做什么来重构将删除这些禁令,并允许优化器生成更快的代码?
[编辑] 偏移相关链接
考虑以下功能:
void func(bool& flag)
{
if(!flag) flag=true;
}
Run Code Online (Sandbox Code Playgroud)
在我看来,如果flag有一个有效的布尔值,这相当于无条件设置它true,如下所示:
void func(bool& flag)
{
flag=true;
}
Run Code Online (Sandbox Code Playgroud)
然而,gcc和clang都没有这样优化它 - 都在-O3优化级别生成以下内容:
_Z4funcRb:
.LFB0:
.cfi_startproc
cmp BYTE PTR [rdi], 0
jne .L1
mov BYTE PTR [rdi], 1
.L1:
rep ret
Run Code Online (Sandbox Code Playgroud)
我的问题是:只是代码太特殊flag而不关心优化,或者是否有任何好的理由为什么这样的优化是不希望的,因为它不是一个参考volatile?看来这可能是唯一的原因是,flag可以在某种程度上具有非true-或- false在阅读它的点不未定义行为的价值,但我不知道这是否是可能的.
这两种方法在C中的效率更高?怎么样:
pow(x,3)
Run Code Online (Sandbox Code Playgroud)
与
x*x*x // etc?
Run Code Online (Sandbox Code Playgroud) 请考虑以下代码(p属于类型unsigned char*且bitmap->width属于某种整数类型,具体哪个是未知的,取决于我们正在使用的某个外部库的版本):
for (unsigned x = 0; x < static_cast<unsigned>(bitmap->width); ++x)
{
*p++ = 0xAA;
*p++ = 0xBB;
*p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)
值得优化它[...]
可能存在这样一种情况,即通过编写可以产生更有效的结果:
unsigned width(static_cast<unsigned>(bitmap->width));
for (unsigned x = 0; x < width; ++x)
{
*p++ = 0xAA;
*p++ = 0xBB;
*p++ = 0xCC;
}
Run Code Online (Sandbox Code Playgroud)
...或者编译器优化是否微不足道?
您认为什么是"更好"的代码?
编辑(Ike)的注意事项:对于那些对三角形文本感到疑惑的人来说,原来的问题,如同措辞一样,非常接近于偏离主题的领域,并且尽管有积极的反馈,但非常接近于被关闭.这些已经被打乱了.但是,请不要惩罚那些解决这些问题的受影响部分的回答者.
std::swap()在排序甚至分配期间被许多std容器(例如std::list和std::vector)使用.
但是std实现swap()非常普遍,而且对于自定义类型来说效率很低.
因此,通过std::swap()使用自定义类型特定实现进行重载可以获得效率.但是如何实现它以便std容器使用它?
如果我有一个整数n,并且我想知道最高位的位置(也就是说,如果最低有效位在右边,我想知道最左边位的位置是1),找出最快捷/最有效的方法是什么?
我知道POSIX支持ffs()strings.h中的一个方法来查找第一个设置位,但似乎没有相应的fls()方法.
是否有一些非常明显的方法可以解决这个问题?
如果你不能使用POSIX功能来实现可移植性呢?
编辑:如何在32位和64位架构上运行的解决方案(许多代码清单似乎只能在32位整数上运行).
您是否知道任何工具(最好是命令行)能够自动无损地优化我可以集成到构建环境中的JPEG?对于PNG,我目前正在使用PNGOUT,它通常可以节省大约40%的带宽/图像大小.
至少,我想要一个可以从JPG剥离元数据的工具 - 我注意到一个奇怪的情况,我试图从照片制作缩略图,并且不能使它小于34 kB.在研究了更多之后,我发现EXIF数据仍然是图像的一部分,删除元数据后缩略图为3 kB.
除此之外 - 是否有可能无损地进一步优化JPG?PNG优化器尝试不同的压缩策略,霍夫曼编码的随机初始化等.
我知道大多数节省来自JPEG质量参数,这是一个相当主观的衡量标准.我只是在寻找一种可以作为构建步骤运行的工具,并且无损地从图像中挤出几个字节.
我正在寻找一种有效的方法来确定在整数中设置的最低有效位的位置,例如对于0x0FF0,它将是4.
这是一个简单的实现:
unsigned GetLowestBitPos(unsigned value)
{
assert(value != 0); // handled separately
unsigned pos = 0;
while (!(value & 1))
{
value >>= 1;
++pos;
}
return pos;
}
Run Code Online (Sandbox Code Playgroud)
任何想法如何挤出一些周期?
(注意:这个问题适合喜欢这类事情的人,而不是人们告诉我xyzoptimization是邪恶的.)
[编辑] 感谢大家的想法!我也学到了其他一些东西.凉!
在所谓的"快速"方面,我没有参考框架; 我总是想知道这一点,但从来没有找到一个直接的答案......
我倾向于" if-conditional syndrome ",这意味着我倾向于一直使用条件.我很少使用三元运算符.例如:
//I like to do this:
int a;
if (i == 0)
{
a = 10;
}
else
{
a = 5;
}
//When I could do this:
int a = (i == 0) ? 10:5;
Run Code Online (Sandbox Code Playgroud)
我使用哪个问题?哪个更快?是否存在显着的性能差异?尽可能使用最短的代码是更好的做法吗?
optimization ×10
c++ ×6
c ×4
performance ×4
algorithm ×1
c++-faq ×1
caching ×1
java ×1
jpeg ×1
stl ×1