草庐IT

OPTIMIZATION

全部标签

c++ - 现代 C++ 编译器的有效优化策略

我正在编写对性能非常关键的科学代码。代码的初始版本已经编写和测试,现在,有了分析器,是时候从热点开始剃须周期了。众所周知,一些优化,例如循环展开,如今由编译器比由程序员手动干预更有效地处理。哪些技术仍然值得?显然,我会通过探查器运行我尝试的所有操作,但如果有关于哪些方法有效哪些方法无效的传统智慧,这将为我节省大量时间。我知道优化非常依赖于编译器和架构。我正在使用面向Core2Duo的英特尔C++编译器,但我也对哪些适用于gcc或“任何现代编译器”感兴趣。以下是我正在考虑的一些具体想法:将STL容器/算法替换为手动容器/算法有什么好处?特别是,我的程序包含一个非常大的优先级队列(当前是s

c++ - 对于 { A=a;乙=乙; }, "A=a"会在 "B=b"之前严格执行吗?

假设A,B,a,和b都是变量,A的地址,B,a,和b都是不同的。然后,对于以下代码:A=a;B=b;C和C++标准是否明确要求A=a在B=b之前严格执行?鉴于A的地址,B,a,和b都是不同的,编译器是否允许为了优化等目的交换两条语句的执行顺序?如果我的问题在C和C++中的答案不同,我都想知道。编辑:问题的背景如下。在棋盘游戏AI设计中,人们使用lock-lessshared-hashtable进行优化,如果我们不添加volatile,其正确性很大程度上取决于执行顺序限制。 最佳答案 这两个标准都允许这些指令乱序执行,只要这不会改变可

c++ - 对于 { A=a;乙=乙; }, "A=a"会在 "B=b"之前严格执行吗?

假设A,B,a,和b都是变量,A的地址,B,a,和b都是不同的。然后,对于以下代码:A=a;B=b;C和C++标准是否明确要求A=a在B=b之前严格执行?鉴于A的地址,B,a,和b都是不同的,编译器是否允许为了优化等目的交换两条语句的执行顺序?如果我的问题在C和C++中的答案不同,我都想知道。编辑:问题的背景如下。在棋盘游戏AI设计中,人们使用lock-lessshared-hashtable进行优化,如果我们不添加volatile,其正确性很大程度上取决于执行顺序限制。 最佳答案 这两个标准都允许这些指令乱序执行,只要这不会改变可

c++ - 这个浮点平方根近似是如何工作的?

我发现floats的一个相当奇怪但有效的平方根近似值;我真的不明白。有人能解释一下为什么这段代码有效吗?floatsqrt(floatf){constintresult=0x1fbb4000+(*(int*)&f>>1);return*(float*)&result;}我已经测试了一下,itoutputsvaluesoffofstd::sqrt()byabout1to3%.我知道QuakeIII的fastinversesquareroot我猜这里是类似的东西(没有牛顿迭代),但我真的很感谢它是如何工作的的解释。(注意:我已将其标记为c和c++,因为它都是有效的(见注释)C和C++代码)

c++ - 这个浮点平方根近似是如何工作的?

我发现floats的一个相当奇怪但有效的平方根近似值;我真的不明白。有人能解释一下为什么这段代码有效吗?floatsqrt(floatf){constintresult=0x1fbb4000+(*(int*)&f>>1);return*(float*)&result;}我已经测试了一下,itoutputsvaluesoffofstd::sqrt()byabout1to3%.我知道QuakeIII的fastinversesquareroot我猜这里是类似的东西(没有牛顿迭代),但我真的很感谢它是如何工作的的解释。(注意:我已将其标记为c和c++,因为它都是有效的(见注释)C和C++代码)

c++ - 如何让 IOStream 表现更好?

大多数学习C的C++用户更喜欢使用printf/scanf系列函数,即使他们使用C++进行编码也是如此。虽然我承认我发现界面更好(尤其是类似POSIX的格式和本地化),但似乎压倒性的问题是性能。看看这个问题:HowcanIspeeduplinebylinereadingofafile似乎最好的答案是使用fscanf并且C++ifstream始终慢2-3倍。我认为,如果我们可以编译一个“技巧”存储库来提高IOStreams性能,哪些有效,哪些无效。需要考虑的要点缓冲(rdbuf()->pubsetbuf(buffer,size))同步(std::ios_base::sync_with_s

c++ - 如何让 IOStream 表现更好?

大多数学习C的C++用户更喜欢使用printf/scanf系列函数,即使他们使用C++进行编码也是如此。虽然我承认我发现界面更好(尤其是类似POSIX的格式和本地化),但似乎压倒性的问题是性能。看看这个问题:HowcanIspeeduplinebylinereadingofafile似乎最好的答案是使用fscanf并且C++ifstream始终慢2-3倍。我认为,如果我们可以编译一个“技巧”存储库来提高IOStreams性能,哪些有效,哪些无效。需要考虑的要点缓冲(rdbuf()->pubsetbuf(buffer,size))同步(std::ios_base::sync_with_s

c++ - 在 C++ 中迭代链表比在具有类似内存访问的 Go 中慢

在各种情况下,我观​​察到C++中的链表迭代始终比Go慢10-15%。我第一次尝试在StackOverflow上解决这个谜团是here.我编写的示例有问题,因为:1)由于堆分配,内存访问不可预测,并且2)因为没有做任何实际工作,一些人的编译器正在优化主循环。为了解决这些问题,我有一个用C++和Go实现的新程序。C++版本需要1.75秒,而Go版本需要1.48秒。这一次,我在计时开始之前做了一个大堆分配,并用它来操作一个对象池,我从中释放和获取链表的节点。这样,两个实现之间的内存访问应该完全类似。希望这能让谜团更加重现!C++:#include#include#include#inclu

c++ - 在 C++ 中迭代链表比在具有类似内存访问的 Go 中慢

在各种情况下,我观​​察到C++中的链表迭代始终比Go慢10-15%。我第一次尝试在StackOverflow上解决这个谜团是here.我编写的示例有问题,因为:1)由于堆分配,内存访问不可预测,并且2)因为没有做任何实际工作,一些人的编译器正在优化主循环。为了解决这些问题,我有一个用C++和Go实现的新程序。C++版本需要1.75秒,而Go版本需要1.48秒。这一次,我在计时开始之前做了一个大堆分配,并用它来操作一个对象池,我从中释放和获取链表的节点。这样,两个实现之间的内存访问应该完全类似。希望这能让谜团更加重现!C++:#include#include#include#inclu

linux - 'perf stat' 结果中的停滞周期前端和停滞周期后端是什么?

有人知道性能统计结果中stalled-cycles-frontend和stalled-cycles-backend是什么意思吗?我在互联网上搜索但没有找到答案。谢谢$sudoperfstatlsPerformancecounterstatsfor'ls':0.602144task-clock#0.762CPUsutilized0context-switches#0.000K/sec0CPU-migrations#0.000K/sec236page-faults#0.392M/sec768956cycles#1.277GHz962999stalled-cycles-frontend#12