Tag: 优化

错误的gcc生成的assembly顺序,导致性能损失

我有以下代码,它将数据从内存复制到DMA缓冲区: for (; likely(l > 0); l-=128) { __m256i m0 = _mm256_load_si256( (__m256i*) (src) ); __m256i m1 = _mm256_load_si256( (__m256i*) (src+32) ); __m256i m2 = _mm256_load_si256( (__m256i*) (src+64) ); __m256i m3 = _mm256_load_si256( (__m256i*) (src+96) ); _mm256_stream_si256( (__m256i *) (dst), m0 ); _mm256_stream_si256( (__m256i *) (dst+32), m1 ); _mm256_stream_si256( (__m256i *) (dst+64), m2 ); _mm256_stream_si256( […]

是否有可能比C中的同一程序(优化)更快地获得Java程序?

关于在编译时生成C / C ++优化的事实,并且在运行时生成Java优化。 是否有可能比C中的同一程序(优化)更快地获得Java程序? 我知道运行时优化可能比编译时更好。 因此,我想知道这些优化的好处是否可以与运行JVM的开销进行比较。

C – 编译器优化如何影响没有主体的for循环?

我有一些遗留代码,其中包含了一个时间浪费循环,以便有时间让eeprom读取完成(不良做法): for(i = 0; i < 50; i++); 但是,当编译器优化开启以获得速度时,会发生特殊情况。 它不一定与该语句相关联,但我想知道编译器是否可能只是优化时间延迟

C变量声明的效率

在C中声明变量需要多长时间,例如int x或unsigned long long var ? 我想知道它是否会使我的代码更快地在这样的东西。 for (conditions) { int var = 0; // code } 这样做会更快,还是更容易? int var; for (conditions) { var = 0; // code } 谢谢您的帮助。

仅使用SSE2提取SSE混洗32位值

我试图以有效的方式从128位寄存器中提取4个字节。 问题是每个值都是32 {120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0} 。 我想将128位变换为32位,forms为{120,55,42,120} 。 “原始”代码如下所示: __m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}; unsigned char * byte_result_array=(unsigned char*)&byte_result_vec; result_array[x]=byte_result_array[0]; result_array[x+1]=byte_result_array[4]; result_array[x+2]=byte_result_array[8]; result_array[x+3]=byte_result_array[12]; 我的SSSE3代码是: unsigned int * byte_result_array=…; __m128i byte_result_vec={120,0,0,0,55,0,0,0,42,0,0,0,120,0,0,0}; const __m128i eight_bit_shuffle_mask=_mm_set_epi8(1,1,1,1,1,1,1,1,1,1,1,1,0,4,8,12); byte_result_vec=_mm_shuffle_epi8(byte_result_vec,eight_bit_shuffle_mask); unsigned int * byte_result_array=(unsigned int*)&byte_result_vec; result_array[x]=byte_result_array[0]; 我怎样才能有效地使用SSE2。 SSSE3或SSE4有更好的版本吗?

malloc和gcc优化2

while(count < 30000000){ malloc(24); count++; } 上面的代码在我用gcc -O0编译的计算机上运行大约170毫秒。 但是,使用-Ox进行编译,其中x> 0,优化器巧妙地指出所请求的内存永远不会被使用,因此它被排除在优化的可执行文件之外。 它是如何做到的?

-O2将printf(“%s \ n”,str)优化为puts(str)

用clang玩弄,我编译了一个包含这一行的C程序: printf(“%s\n”, argv[0]); 在没有优化的情况下进行编译时,在设置寄存器后,程序集输出称为printf : movq (%rcx), %rsi movq %rax, %rdi movb $0, %al callq _printf 我尝试使用clang -O2编译。 printf调用被替换为puts调用: movq (%rsi), %rdi callq _puts 虽然这在这种情况下非常有意义,但它提出了两个问题: 在优化编译中,函数调用替换的频率是多少? 这是频繁的还是stdio是个例外? 我可以为自己的库编写编译器优化吗? 我该怎么办?

ANSI C编译器可以删除延迟循环吗?

考虑ANSI C中的while循环,其唯一目的是延迟执行: unsigned long counter = DELAY_COUNT; while(counter–); 我已经看到这很多用于强制执行嵌入式系统的延迟,例如。 没有sleepfunction,定时器或中断是有限的。 我对ANSI C标准的解读是,这可以通过符合标准的编译器完全删除。 它没有5.1.2.3中描述的副作用: 访问易失性对象,修改对象,修改文件或调用执行任何这些操作的函数都是副作用,这些都是执行环境状态的变化。 ……并且本节还说: 实际实现不需要评估表达式的一部分,如果它可以推断出它的值未被使用并且不产生所需的副作用(包括由调用函数或访问易失性对象引起的任何副作用)。 这是否意味着可以优化循环? 即使counter是volatile ? 笔记: 这与编译器允许消除无限循环不完全相同? ,因为它指的是无限循环,并且出现关于何时允许程序终止的问题。 在这种情况下,程序肯定会在某个时刻通过这条线,优化与否。 我知道GCC会做什么(删除-O1或更高的循环,除非counter是volatile ),但我想知道标准规定了什么。

Java比C快2倍(作为C ++的一个子集)

下面的代码是一种非常低效的乘法算法。 它被写成测试目的。 我相信我用不同的语言编写了相同的代码。 正下方是运行代码的结果。 OS: Windows 7 language: C (as a subset of C++) compiler: Visual C++ optimization option: /Ox /Oi /Ot /Oy /GL running time (seconds): 40 +/- 1 compiler: MinGW/gcc optimization option: -O3 march=native running time (seconds): 81 +/- 1 compiler: MinGW/g++ optimization option: -O3 march=native running time (seconds): 82 +/- 1 language: […]

C编译器是否重复(合并)代码?

循环展开是一种常见的优化,但反过来也是如此? (减小目标文件输出的大小,减小二进制)。 我很好奇,如果编译器将连续的,相同的代码块(或函数调用)重复数据删除到循环中,或者将重复的块提取到静态函数中,这是一种常见的技术。 我很感兴趣,因为C中只有头文件库*可以添加大量重复代码,因此了解一些C编译器是否能够检测到这一点并更有效地处理它会很有用。 * 通过header-only-library,我的意思是直接定义代码而不是函数定义的头。 如果这样做,了解适用于哪些条件和约束以确保可以使用它将是有用的。 注意(出于问题的目的 – 任何流行的C编译器都是精细的GCC / Clang / Intel / MSVC)。 我找到的一个只有头文件库,名为uthash,它使用了一些非常大的宏,我想知道是否有一些编译器技巧可以巧妙地去除这些巨大的代码块,请参阅:例如uthash.h ,另一个类似的示例是内联qsort.h 可以重复数据删除的块的示例(事实certificatePy_DECREF可以扩展为相当大的代码块)。 #define PY_ADD_TO_DICT(dict, i) \ do { PyDict_SetItemString(dict, names[i], item = PyUnicode_FromString(values[i])); \ Py_DECREF(item); \ } while (0) /* this could be made into a loop */ PY_ADD_TO_DICT(d, 0); PY_ADD_TO_DICT(d, 1); PY_ADD_TO_DICT(d, 2); PY_ADD_TO_DICT(d, 3); 请注意,这是设计的,但基于一个真实的例子。 澄清 […]