Questions tagged «compiler-optimization»

编译器优化涉及调整编译器以减少运行时或对象大小,或两者兼而有之。这可以通过使用编译器参数(即CFLAGS,LDFLAGS),编译器插件(例如DEHYDRA)或直接对编译器进行修改(例如修改源代码)来实现。


2
为什么std :: fill(0)比std :: fill(1)慢?
我在一个系统std::fill上观察到,与恒定值或动态值相比,将恒定值std::vector<int>设置为大时显着且始终较慢:01 5.8 GiB /秒和7.5 GiB /秒 但是,对于较小的数据,结果会有所不同,但fill(0)速度更快: 如果有多个线程,则在4 GiB数据大小下,fill(1)斜率更高,但峰值要低得多fill(0)(51 GiB / s与90 GiB / s): 这就提出了第二个问题,即为什么峰值带宽 fill(1)这么低。 为此的测试系统是双插槽Intel Xeon CPU E5-2680 v3,设置为2.5 GHz(通过/sys/cpufreq),带有8x16 GiB DDR4-2133。我使用GCC 6.1.0(-O3)和Intel编译器17.0.1(-fast)进行了测试,两者均得到相同的结果。GOMP_CPU_AFFINITY=0,12,1,13,2,14,3,15,4,16,5,17,6,18,7,19,8,20,9,21,10,22,11,23被设定。Strem / add / 24线程在系统上的速度为85 GiB / s。 我能够在不同的Haswell双套接字服务器系统上重现这种效果,但在任何其他体系结构上均无法重现。例如,在Sandy Bridge EP上,内存性能是相同的,而在高速缓存fill(0)中则要快得多。 这是要重现的代码: #include <algorithm> #include <cstdlib> #include <iostream> #include <omp.h> #include <vector> using value = …

8
带重载算子的De Morgan定律优化
每个程序员都应该知道: (德摩根定律) 在某些情况下,为了优化程序,编译器可能会修改(!p && !q)为(!(p || q))。 这两个表达式是等效的,并且对第一个或第二个表达式的求值没有区别。 但是在C ++中,可能会重载运算符,而重载的运算符可能并不总是尊重此属性。因此,以这种方式转换代码实际上将修改代码。 当和重载时!,编译器是否应使用De Morgan定律?||&&

2
/ Ox和/ O2编译器选项之间有什么区别?
Microsoft的C ++编译器(cl.exe包括在Visual Studio中)提供了几个优化开关。它们中的大多数之间的差异似乎是不言而喻的,但是我不清楚/O2(将代码优化为最大速度)与/Ox(选择“完全优化”)之间的区别。 我试着阅读文档的/Ox选项,它似乎证实,该交换机还支持优化的最高速度,而不是大小: 所述/Ox编译器选项产生在较小尺寸有利于代码的执行速度。 但特别是,“备注”部分下的以下声明引起了我的注意: 通常,请指定/O2(Maximize Speed)而不是/Ox。 所以我的问题是,为什么要一个普遍青睐/O2了/Ox?后一个选项是否启用已知的特定优化,从而导致无法预料的错误或其他意外行为?仅仅是获得的优化数量不值得额外的编译时间吗?还是由于VS中/O2的默认选项而导致的这完全是毫无意义的“推荐” ?


2
可比性测试比%运算符更快?
我注意到计算机上有一件奇怪的事情。*手写除数测试比%操作员快得多。考虑最小的示例: * AMD锐龙Threadripper 2990WX,GCC 9.2.0 static int divisible_ui_p(unsigned int m, unsigned int a) { if (m <= a) { if (m == a) { return 1; } return 0; } m += a; m >>= __builtin_ctz(m); return divisible_ui_p(m, a); } 该示例受奇数a和限制m > 0。但是,可以很容易地将其推广到所有a和m。该代码只是将除法转换为一系列的加法。 现在考虑使用以下命令编译的测试程序-std=c99 -march=native -O3: for (unsigned int a …

1
为什么GCC聚合数组的初始化会首先用零填充整个东西,包括非零元素?
为什么gcc用零而不是仅剩余的96个整数填充整个数组?非零初始值设定项都在数组的开头。 void *sink; void bar() { int a[100]{1,2,3,4}; sink = a; // a escapes the function asm("":::"memory"); // and compiler memory barrier // forces the compiler to materialize a[] in memory instead of optimizing away } MinGW8.1和gcc9.2都使asm像这样(Godbolt编译器资源管理器)。 # gcc9.2 -O3 -m32 -mno-sse bar(): push edi # save call-preserved EDI which …

2
Java 8:Class.getName()会减慢字符串连接链的速度
最近,我遇到了有关字符串串联的问题。该基准总结如下: @OutputTimeUnit(TimeUnit.NANOSECONDS) public class BrokenConcatenationBenchmark { @Benchmark public String slow(Data data) { final Class<? extends Data> clazz = data.clazz; return "class " + clazz.getName(); } @Benchmark public String fast(Data data) { final Class<? extends Data> clazz = data.clazz; final String clazzName = clazz.getName(); return "class " + clazzName; } @State(Scope.Thread) …

2
我的编译器是否忽略了我未使用的静态thread_local类成员?
我想在我的课程中做一些线程注册,所以我决定为该thread_local功能添加一个检查: #include <iostream> #include <thread> class Foo { public: Foo() { std::cout << "Foo()" << std::endl; } ~Foo() { std::cout << "~Foo()" << std::endl; } }; class Bar { public: Bar() { std::cout << "Bar()" << std::endl; //foo; } ~Bar() { std::cout << "~Bar()" << std::endl; } private: static thread_local …
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.