来自维基百科上的优化编译器 , 编译器优化通常使用一系列优化转换来实现 ,这些算法采用程序并对其进行转换以生成使用较少资源的语义上等效的输出程序。 和GCC有很多优化选择。 我想在使用不同的标志(如-O1 , -O2 , -O3等)进行编译时执行每次优化后,研究生成的程序集(一个-S给出)。 我怎样才能做到这一点? 编辑:我的输入将是C代码。
我试图优化Radix排序代码,因为我觉得它有空间,因为书籍和网络上的传统代码似乎是彼此的直接副本,而且它们的工作速度很慢,因为它们采用任意数字,例如10为模数操作。 我尽可能地优化了代码,也许我可能错过了一些优化技术。 在那种情况下请赐教。 优化动机: http://codercorner.com/RadixSortRevisited.htm http://stereopsis.com/radix.html 我无法在文章中实现所有优化,主要是超出我的技能和理解,缺乏足够的时间,如果你可以随意实现它们。 编辑4 这个Java版本的Radix Sort在1次读取中计算所有直方图,并且不需要在每次LSB排序后用零填充数组Z以及通常的跳过排序和跳转到下一个LSB排序的能力(如果所有先前的LSB都相同)。 像往常一样,这仅适用于32位整数,但可以从中创建64位版本。 protected static int[] DSC(int A[])// Sorts in descending order { int tmp[] = new int[A.length] ; int Z[] = new int[1024] ; int i, Jump, Jump2, Jump3, Jump4, swap[] ; Jump = A[0] & 255 ; Z[Jump] = 1 ; Jump2 = ((A[0] >> […]
我在一个文档中读到你可以用逻辑替换mod操作,如下所示: 代替: int Limit = Value % Range; 你做: int Limit = Value & (Range-1); 但编译器仍然生成mod指令,我的问题基本上是:为什么编译器如果工作相同,就不会使用最有效的方法?
我发现这篇文章解释了如何通过24次操作转置8×8字节矩阵,稍后会有几个滚动条实现转置。 但是,这种方法没有利用我们可以阻止 8×8转置为4个4×4转置的事实,并且每个转换只能在一个shuffle指令中完成( 这篇文章是参考文献)。 所以我推出了这个解决方案: __m128i transpose4x4mask = _mm_set_epi8(15, 11, 7, 3, 14, 10, 6, 2, 13, 9, 5, 1, 12, 8, 4, 0); __m128i shuffle8x8Mask = _mm_setr_epi8(0, 1, 2, 3, 8, 9, 10, 11, 4, 5, 6, 7, 12, 13, 14, 15); void TransposeBlock8x8(uint8_t *src, uint8_t *dst, int srcStride, int dstStride) { __m128i load0 […]
我有一个代码从stdin读取(10 ^ 5)int(s)然后执行## i后在stdout输出它们。 我通过使用“setvbuf”和使用“fgets_unlocked()”读取行来处理INPUT部分,然后解析它们以获得所需的int(s)。 我有2个问题,我无法解决: 1.)因为我在stdout上打印了500万,花了很多时间:有什么方法可以减少它(我尝试使用fwrite()但o / p打印出不可打印的字符,因为使用fread的原因读入int缓冲区 ) 2.)解析int(s)的输入后说’x’我实际上通过对循环中的no执行%(mod)来找到除数的数量。(参见下面的代码):也许这也是一个我的代码超时的原因:对此有任何改进建议。 非常感谢这实际上是来自http://www.codechef.com/problems/PD13的问题 # include # define SIZE 32*1024 char buf[SIZE]; main(void) { int i=0,chk =0; unsigned int j =0 ,div =0; int a =0,num =0; char ch; setvbuf(stdin,(char*)NULL,_IOFBF,0); scanf(“%d”,&chk); while(getchar_unlocked() != ‘\n’); while((a = fread_unlocked(buf,1,SIZE,stdin)) >0) { for(i=0;i<a;i++) { if(buf[i] != '\n') { num = […]
为什么使用两个编译器gcc和turbo c编译代码时产生的输出有所不同。 #include int main() { char *p = “I am a string”; char *q = “I am a string”; if(p==q) { printf(“Optimized”); } else{ printf(“Change your compiler”); } return 0; } 我在gcc上得到了”Optimized” ,在turbo c上得到了”Optimized” “Change your compiler” 。 为什么?
根据我的经验,有许多代码明确使用内联函数,这需要权衡: 代码变得不那么简洁,而且可维护性稍差。 有时,内联可以大大提高运行时性能。 内联是在一个固定的时间点决定的,可能没有对其用途的非常好的预知,或者没有考虑所有(未来)周围环境。 问题是:链接时优化(例如,在GCC中)是否呈现手动内联,例如,在C99中声明一个“内联”函数并提供一个实现,已经过时了? 我们是否真的不需要考虑自己内联大多数function? 那些总能从内联中受益的函数呢,例如deg_to_rad(x)? 澄清:我不是在考虑同一个翻译单元中的函数,而是考虑逻辑上应该存在于不同翻译单元中的函数。 更新:我经常看到反对“内联”,并建议过时。 然而,就个人而言,我确实经常看到明确的内联函数:作为类体中定义的函数。
已经阅读了这个相关的问题 ,但正在寻找一些更具体的东西。 有没有办法告诉你的编译器你想要你的枚举有多宽? 如果是这样,你怎么做? 我知道如何在C#中指定它; 它是否同样在C中完成? 它甚至值得做吗? 当枚举值传递给函数时,它是否会作为int -sized值传递?
我想用2的任意幂实现无符号整数除法 ,有效地向上舍入 。 所以我想要的是数学上的ceiling(p/q) 0 。 在C中,不利用q的受限域的strawman实现可能类似于以下函数1 : /** q must be a power of 2, although this version works for any q */ uint64_t divide(uint64_t p, uint64_t q) { uint64_t res = p / q; return p % q == 0 ? res : res + 1; } …当然,我实际上并不想在机器级别使用除法或mod,因为即使在现代硬件上也需要很多周期。 我正在寻找使用轮class和/或其他一些廉价操作的力量减少 – 利用q是2的幂的事实。 你可以假设我们有一个有效的lg(unsigned int […]
我正在使用下面的代码研究子集求和问题的变体的解决方案。 该问题需要从较大的集合(超集)生成11个int的子集,并检查它是否与特定值(endsum)匹配。 #include #include #include int endsum = 0, supersetsize = 0, done = 0; int superset[] = {1,30,10,7,11,27,3,5,6,50,45,32,25,67,13,37,19,52,18,9}; int combo = 0; int searchForPlayerInArray(int arr[], int player) { for (int i=0; i<11; i++) { if (arr[i] == player) { return 1; } } return 0; } int sumOfArray(int arr[]) { int res = 0; […]