Tag: 编译优化

在C / C ++中使用汇编语言

我记得在阅读某个地方真正优化和加快某些部分的代码,程序员用汇编语言编写该部分。 我的问题是 – 这个练习还在做吗? 以及如何做到这一点? 汇编语言不是写得太麻烦了吗? 当我们编译C代码(有或没有-O3标志)时,编译器会进行一些代码优化并链接所有库并将代码转换为二进制对象文件。 所以当我们运行程序时,它已经是最基本的forms,即二进制。 那么如何诱导“汇编语言”呢? 我想了解这个概念和任何帮助或链接非常感谢。 更新:按照dbemerlin的要求改写第3点 – 因为你可能能够编写比编译器生成的更有效的汇编代码,除非你是汇编专家,否则代码会慢慢运行,因为编译器通常比大多数人能更好地优化代码。

我的编译器会忽略无用的代码吗?

我已经通过关于这个主题的networking几个问题,但我没有find任何答案我的问题,或者它是另一种语言或它不完全回答 (死代码是不是无用的代码)所以这里是我的问题: 编译器忽略了(显式的还是不是)无用的代码? 例如,在这个代码中: double[] TestRunTime = SomeFunctionThatReturnDoubles; // A bit of code skipped int i = 0; for (int j = 0; j < TestRunTime.Length; j++) { } double prevSpec_OilCons = 0; 将for循环删除? 我使用.net4.5和vs2013 背景是我保留了很多代码(我没有写) ,我想知道无用的代码应该是一个目标,还是让我的编译器负责。

为什么GCC为几乎相同的C代码生成这种完全不同的程序集?

在写一个优化的ftol函数的时候,我在GCC 4.6.1发现了一些非常奇怪的行为。 让我先告诉你代码(为了清晰起见,我标出了区别): fast_trunc_one,C: int fast_trunc_one(int i) { int mantissa, exponent, sign, r; mantissa = (i & 0x07fffff) | 0x800000; exponent = 150 – ((i >> 23) & 0xff); sign = i & 0x80000000; if (exponent < 0) { r = mantissa << -exponent; /* diff */ } else { r = mantissa >> exponent; […]

用64位代替32位循环计数variables引入了疯狂的性能偏差

我正在寻找最快的方式来popcount大量的数据。 我遇到了一个非常奇怪的结果:将循环variables从unsigned更改为uint64_t使得我的PC上的性能下降了50%。 基准 #include <iostream> #include <chrono> #include <x86intrin.h> int main(int argc, char* argv[]) { using namespace std; if (argc != 2) { cerr << "usage: array_size in MB" << endl; return -1; } uint64_t size = atol(argv[1])<<20; uint64_t* buffer = new uint64_t[size/8]; char* charbuffer = reinterpret_cast<char*>(buffer); for (unsigned i=0; i<size; ++i) charbuffer[i] = rand()%256; […]