Tag: 微优化

改进快速排序

如果可能,我如何改进以下快速排序(性能明智)。 有什么建议? void main() { quick(a,0,n-1); } void quick(int a[],int lower,int upper) { int loc; if(lower<upper) { loc=partition(a,lower,upper); quick(a,lower,loc-1); quick(a,loc+1,upper); } } /* Return type: int Parameters passed: Unsorted array and its lower and upper bounds */ int partition(int a[],int lower,int upper) { int pivot,i,j,temp; pivot=a[lower]; i=lower+1; j=upper; while(i<j) { while((i<upper)&&(a[i]pivot)) j–; if(ia[j]) { temp=a[j]; […]

如何让gcc生成合适的代码来检查缓冲区是否充满了NUL字节?

我正在实现一个解析磁带存档的程序。 解析器逻辑的一部分是检查归档结束标记,该标记是一个充满NUL字节的512字节块。 我为此目的编写了以下代码,希望gcc能够很好地优化它: int is_eof_block(const char usth[static 512]) { size_t i; for (i = 0; i < 512; i++) if (usth[i] != '\0') return 0; return 1; } 但令我惊讶的是,gcc仍会为此生成可怕的代码,即使我明确允许它访问缓冲区中的整个512字节: is_eof_block: leaq 512(%rdi), %rax jmp .L239 .p2align 4,,10 .L243: addq $1, %rdi cmpq %rax, %rdi je .L242 .L239: cmpb $0, (%rdi) je .L243 xorl %eax, %eax […]

是否可以检查2组3个中的任何一组是否等于9个比较中的任何一组?

int eq3(int a, int b, int c, int d, int e, int f){ return a == d || a == e || a == f || b == d || b == e || b == f || c == d || c == e || c == f; } 如果3个第一个int中的任何一个等于3个最后一个int中的任何一个,则此函数接收6个int并返回true。 是否有任何类似的方式使其更快?

使用可能/不太可能的提示是否有任何性能测试结果?

gcc提供可能/不太可能的提示 ,帮助编译器生成具有更好分支预测的机器代码。 有没有关于如何正确使用或不使用这些提示影响某些真实系统上实际代码性能的数据?

快速搜索并替换int中的一些半字节

这是在具有不同任务的相同偏移(C,微优化)问题的两个整数中快速搜索一些半字节的变体: 任务是在int32中找到预定义的半字节并将其替换为其他半字节。 例如,半字节搜索是0x5; 蚕食取代是0xe: int: 0x3d542753 (input) ^ ^ output:0x3dE427E3 (output int) 可以有另外一对半字节搜索和半字节替换(在编译时已知)。 我检查了我的程序,这部分是最热门的地方之一(gprofcertificate,75%的时间在function中); 它被称为非常多次(gcovcertificate)。 实际上它是嵌套循环的第3或第4循环,运行计数估计为(n ^ 3)*(2 ^ n) ,n = 18..24。 我当前的代码很慢(我将其重写为函数,但它是来自循环的代码): static inline uint32_t nibble_replace (uint32_t A) __attribute__((always_inline)) { int i; uint32_t mask = 0xf; uint32_t search = 0x5; uint32_t replace = 0xe; for(i=0;i<8;i++) { if( (A&mask) == search ) A = […]

与不使用if的测试相比,if语句的效率如何? (C ++)

我需要一个程序来获取两个数字中较小的数字,我想知道是否使用标准“如果x小于y” int a, b, low; if (a < b) low = a; else low = b; 或多或少效率高于此: int a, b, low; low = b + ((a – b) & ((a – b) >> 31)); (或者将int delta = a – b置于顶部并将a – b实例重新放置的变化)。 我只是想知道哪一个更有效(或者如果差异太小而不相关),以及if-else语句与一般的替代方案的效率。

在C数组中进行按位运算的最有效方法是什么

我有一个C数组,如: char byte_array[10]; 另一个充当面具: char byte_mask[10]; 我想在每个字节上获得另一个数组,该数组是第一个数据加上第二个使用按位运算的结果。 最有效的方法是什么? 谢谢你的回答。

在相同偏移量下快速搜索两个整数的一些半字节(C,微优化)

我的任务是检查(>万亿次检查),两个int包含任何预定义的半字节对(第一对0x2 0x7;第二对0xd 0x8)。 例如: bit offset: 12345678 first int: 0x3d542783 first pair of 0x2 second: 0xd second int: 0x486378d9 nibbles: 0x7 pair: 0x8 ^ ^ 因此,对于这个例子,我用需要的对标记两个偏移(偏移是2和5;但不是7)。 我的任务中不需要实际偏移量和找到的对数。 因此,对于给定的两个整数,问题是: 它们是否包含相同偏移量的这些半字节对中的任何一个。 我检查了我的程序,这部分是最热门的地方( gprofcertificate); 它被称为非常多次( gcovcertificate)。 实际上它是嵌套循环的第3或第4个循环(嵌套最多)。 我当前的代码很慢(我将其重写为函数,但它是内循环的代码): static inline int nibble_check (uint32_t A, uint32_t B) __attribute__((always_inline)) { int i; for(i=0;i>=4; B>>=4; } return 0; // nibbles not […]

通过分析程序集列表validationgcc / g ++中的编译器优化

我刚刚问了一个与编译器如何优化某些C ++代码有关的问题,我正在寻找有关如何validation编译器是否已执行某些优化的任何问题。 我试图查看用g ++( g++ -c -g -O2 -Wa,-ahl=file.s file.c )生成的汇编列表g++ -c -g -O2 -Wa,-ahl=file.s file.c什么,但输出太神秘了对我来说。 人们使用什么技术来解决这个问题,是否有任何关于如何解释优化代码的汇编列表或特定于GCC工具链的汇编列表来讨论这个问题的任何好的参考?

有没有工具来测试c程序的简洁性?

例如,我想检查以下代码是否更简洁: for(i = 0; i size; i++){ if(0 bucket[i].n){ p = map->bucket[i].list; while(p){ h = hash(p->key) % n; if(bucket[h].list){ new_p = bucket[h].list; while(new_p->next)new_p = new_p->next; new_p->next = p; next = p->next; p->next = NULL; p = p->next; } else{ bucket[h].list = p; bucket[h].n++; next = p->next; p->next = NULL; p = p->next; } } } […]