Questions tagged «optimization»

优化是改进方法或设计的行为。在编程中,优化通常采取提高算法速度或减少所需资源的形式。优化的另一个含义是机器学习中使用的数值优化算法。


22
设置的最低有效位的位置
我正在寻找一种有效的方法来确定设置为整数的最低有效位的位置,例如对于0x0FF0它将是4。 一个简单的实现是这样的: unsigned GetLowestBitPos(unsigned value) { assert(value != 0); // handled separately unsigned pos = 0; while (!(value & 1)) { value >>= 1; ++pos; } return pos; } 有什么想法可以减少一些周期吗? (注意:这个问题是针对喜欢这种东西的人,而不是告诉我xyzoptimization是邪恶的。) [edit] 谢谢大家的想法!我也学到了其他一些东西。凉!

27
查找C中整数的最高设置位(msb)的最快/最有效方法是什么?
如果我有一些整数n,并且我想知道最高有效位的位置(也就是说,如果最低有效位在右边,那么我想知道最远的左位为1),找出最快/最有效的方法是什么? 我知道POSIX ffs()在strings.h中支持一种方法来查找第一个设置位,但是似乎没有相应的fls()方法。 是否有一些我确实不知道的真正明显的方法? 如果无法使用POSIX函数进行可移植性该怎么办? 编辑:在32位和64位体系结构上均可使用的解决方案怎么样(许多代码清单似乎只在32位int上运行)。



3
为什么C ++编译器不将此条件布尔分配优化为无条件分配?
考虑以下功能: void func(bool& flag) { if(!flag) flag=true; } 在我看来,如果flag具有有效的布尔值,则相当于将其无条件设置为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值而没有未定义的行为,但是我不确定这是否可能。
117 c++  optimization 

30
编码实践,使编译器/优化器可以制作更快的程序
许多年前,C编译器并不是特别聪明。作为解决方法,K&R发明了register关键字,以向编译器提示,将这个变量保留在内部寄存器中可能是一个好主意。他们还让第三级操作员帮助生成更好的代码。 随着时间的流逝,编译器逐渐成熟。他们变得非常聪明,因为他们的流程分析使他们能够比您可能做的更好地决定要保存在寄存器中的值。register关键字变得不重要。 由于别名问题,对于某些类型的操作,FORTRAN可能比C更快。从理论上讲,经过仔细的编码,可以绕过这一限制,以使优化器生成更快的代码。 有哪些可用的编码实践可以使编译器/优化器生成更快的代码? 确定您使用的平台和编译器,将不胜感激。 为什么该技术似乎有效? 鼓励使用示例代码。 这是一个相关的问题 [编辑] 此问题与概要分析和优化的总体过程无关。假设程序已正确编写,经过全面优化编译,经过测试并投入生产。您的代码中可能存在一些禁止优化器尽其所能的构造。您如何做才能重构以消除这些禁止并允许优化器生成更快的代码? [编辑] 偏移相关链接

4
如何重载std :: swap()
std::swap()在排序甚至分配期间,许多std容器(例如std::list和std::vector)都使用它。 但是std的实现swap()非常笼统,对于自定义类型而言效率很低。 因此,可以通过std::swap()使用自定义类型特定的实现进行重载来获得效率。但是如何实现它,以便将其用于std容器?

13
在C ++中,应该麻烦缓存变量还是让编译器进行优化?(别名)
考虑以下代码(p类型为,unsigned char*并且bitmap->width为某种整数类型,确切地是未知的,并且取决于我们使用的某些外部库的版本): 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; } ...还是对编译器进行优化很简单? 您认为什么是“更好”的代码? 编辑者(Ike)的注释:对于那些对删除线文本感到疑惑的人,最初的问题措词很危险,接近主题外的领域,尽管获得了积极的反馈,却非常接近完成。这些已经被淘汰了。但是,请不要惩罚回答了问题的这些问题的回答者。

14
JPEG优化工具?[关闭]
关闭。此问题不符合堆栈溢出准则。它当前不接受答案。 想改善这个问题吗?更新问题,使其成为Stack Overflow 的主题。 3年前关闭。 改善这个问题 您是否知道有任何工具(最好是命令行)可自动无损地优化可集成到我们的构建环境中的JPEG?对于PNG,我目前正在使用PNGOUT,它通常可以节省大约40%的带宽/图像大小。 至少,我想要一个可以从JPG中剥离元数据的工具-我注意到一种奇怪的情况,我试图从照片中制作缩略图,但缩略图大小不能小于34 kB。经过更多调查后,我发现EXIF数据仍然是图像的一部分,并且删除元数据后的缩略图为3 kB。 除此之外-是否可以无损地进一步优化JPG?PNG优化器尝试不同的压缩策略,霍夫曼编码的随机初始化等。 我知道大多数节省都来自JPEG质量参数,这是一个相当主观的措施。我只是在寻找可以作为构建步骤运行的工具,并且可以无损地从图像中压缩几个字节。
114 optimization  jpeg 

3
如何为CUDA内核选择网格和块尺寸?
这是关于如何确定CUDA网格,块和线程大小的问题。这是在此处发布的问题的另一个问题。 在此链接之后,来自爪子的答案包含一个代码段(请参见下文)。我不理解“通常是通过调整和硬件限制选择的值”的注释。 我在CUDA文档中找不到很好的解释或说明来解释这一点。总而言之,我的问题是blocksize给定以下代码,如何确定最佳(线程数): const int n = 128 * 1024; int blocksize = 512; // value usually chosen by tuning and hardware constraints int nblocks = n / nthreads; // value determine by block size and total work madd<<<nblocks,blocksize>>>mAdd(A,B,C,n);

6
.NET / C#为什么不优化尾调用递归?
我发现这个问题有关的语言优化尾递归。为什么C#尽可能不优化尾递归? 在具体情况下,为什么不将该方法优化为循环(如果需要的话,Visual Studio 2008 32位)? private static void Foo(int i) { if (i == 1000000) return; if (i % 100 == 0) Console.WriteLine(i); Foo(i+1); }

3
为什么只有注释更改的两个程序二进制文件在gcc中不完全匹配?
我创建了两个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 …


4
不管结果如何,最快的整数除法支持零除法?
摘要: 我正在寻找最快的计算方法 (int) x / (int) y 毫无例外的y==0。相反,我只想要一个任意结果。 背景: 在对图像处理算法进行编码时,我经常需要除以(累积的)alpha值。最简单的变体是带有整数算术的纯C代码。我的问题是,对于具有的结果像素,通常会得到零除误差alpha==0。但是,这恰好是像素,其结果根本不重要:我不在乎使用的像素的颜色值alpha==0。 细节: 我正在寻找类似的东西: result = (y==0)? 0 : x/y; 要么 result = x / MAX( y, 1 ); x和y是正整数。该代码在嵌套循环中执行了很多次,因此我正在寻找一种摆脱条件分支的方法。 当y不超过字节范围时,我对解决方案感到满意 unsigned char kill_zero_table[256] = { 1, 1, 2, 3, 4, 5, 6, 7, [...] 255 }; [...] result = x / …

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.