Tag: 性能

C:内联关键字值得吗?

是否值得使用inline关键字或编译器足够聪明,知道何时需要内联函数?

python高效子字符串搜索

可能重复: 如何在CPython中实现string.find? 我在这里阅读了很多关于堆栈溢出的post比较子字符串搜索的性能(例如Python字符串搜索效率 , 这是搜索子字符串的最有效方法吗? , python中的子字符串等等) 我还看了一下包含abstract.c的源代码实现。 据我所知,内置实现是迭代的: python docs python是否有更多足够的技术来实现查找子字符串: Boyer-Moore算法 , Rabin-Karp算法等…… ??? 编辑 问题已经扩展: Python:通过嵌入复杂的算法改进子字符串搜索 。

为什么我必须在g ++中启用优化才能进行简单的数组访问?

我在C ++(gcc / Linux)中使用了一个double s的std::vector编写了一个简单的高斯消元法。 现在我已经看到运行时依赖于编译器的优化级别(使用-O3速度提高了5倍)。 我写了一个小测试程序并收到了类似的结果。 问题不在于矢量的分配,也没有任何resize等。 陈述这是一个简单的事实: v[i] = x + y / z; (或类似的东西)没有优化就慢得多。 我认为问题是索引运算符。 如果没有编译器优化, std::vector比raw double *v慢,但是当我打开优化时,性能是相同的,令我惊讶的是,即使访问raw double *v也更快。 这种行为有解释吗? 我真的不是一个专业的开发人员,但我认为编译器应该能够将上述语句直接转移到硬件指令。 为什么需要启用优化,更重要的是,优化的缺点是什么? (如果没有,我想知道为什么优化不是标准。) 这是我的矢量测试代码: const long int count = 100000; const double pi = 3.1416; void C_array (long int size) { long int start = time(0); double *x = (double*) […]

在C / C ++中包含未使用的头文件是否会受到性能影响?

我有一个项目,每个C / C ++文件使用一堆头文件。 但是每个C / C ++文件使用的头文件大约有70-80%是相同的。 因此,为了使我的代码更具可读性,我计划将项目中需要的所有头文件包含在单个头文件中,例如common_headers.h并将其包含在我的所有C / C ++文件中,如下所示: #include “common_headers.h” 现在,这将包括所有必需的标题,但也包含一些单独文件不会使用的额外标题。 我想知道如果这样做,它会在运行时以任何机会达到性能吗? 我可以用几毫秒的额外延迟来编译代码,但我想知道这是否会影响我的运行时性能? 使用的标题说明: 其中大多数是标准的C / C ++标头。 用户定义的标题中包含内联模板函数。 用户定义的标头中没有静态函数。 这是我的编译器: g ++(GCC)4.4.7 20120313(Red Hat 4.4.7-3)

数百万UINT64 RGBZ图形像素的最快排序算法

我正在使用来自.RAW文件的RGB数据对1000多万uint64_t排序,并且在qsort花费了79%的C程序时间。 我正在寻找这种特定数据类型的更快排序。 作为RAW图形数据,这些数字非常随机,大约80%是唯一的。 不需要对排序数据进行部分排序或运行。 uint64_t内的4 uint16_t s是R,G,B和零(可能是一个小的计数<= ~20)。 我有最简单的比较函数,我可以想到使用unsigned long long (你不能只减去它们): qsort(hpidx, num_pix, sizeof(uint64_t), comp_uint64); … int comp_uint64(const void *a, const void *b) { if(*((uint64_t *)a) > *((uint64_t *)b)) return(+1); if(*((uint64_t *)a) < *((uint64_t *)b)) return(-1); return(0); } // End Comp_uint64(). StackExchange上有一个非常有趣的“Programming Puzzles&Code Golf”,但是他们使用了float 。 然后有QSort,RecQuick,堆,stooge,树,基数…… swenson / sort看起来很有趣,但对我的数据类型uint64_t没有(明显的)支持。 而“快速排序”时间是最好的。 有些消息称,系统qsort可以是任何东西,不一定是“快速排序”。 C ++排序绕过了void指针的通用转换,并实现了对C的性能的极大改进。必须有一种优化的方法,以经线速度通过64位处理器猛击U8。 系统/编译器信息: […]

GCC标准优化行为

在这里,我使用-O2优化级别(使用gcc 4.8.4)编译输入程序并测量执行时间: gcc -O2 -c test.c -o obj.o TIMEFORMAT=’%3R’ && time(./obj.o) execution time = 1.825 当我用-O2 https://gcc.gnu.org/onlinedocs/gcc-4.8.4/gcc/Optimize-Options等级中的GCC manuel中定义的选项列表替换-O2标志时。 html #Oftimize-这样的选项 : gcc -fauto-inc-dec -fcompare-elim -fcprop-registers -fdce -fdefer-pop -fdse -fguess-branch-probability -fif-conversion2 -fif-conversion -fipa-pure-const -fipa-profile -fipa-reference -fmerge-constants -fsplit-wide-types -ftree-bit-ccp -ftree-builtin-call-dce -ftree-ccp -ftree-ch -ftree-copyrename -ftree-dce -ftree-dominator-opts -ftree-dse -ftree-forwprop -ftree-fre -ftree-phiprop -ftree-slsr -ftree-sra -ftree-pta -ftree-ter -funit-at-a-time -fthread-jumps -falign-functions -falign-jumps […]

C中任何更快的RMS值计算?

我正在用C编写一个小型8位微控制器的软件。部分代码是读取电流互感器(ZCT)的ADC值,然后计算RMS值。 流过ZCT的电流是正弦曲线但可能会失真。 我的代码如下: float adc_value, inst_current; float acc_load_current; // accumulator = (I1*I1 + I2*I2 + … + In*In) double rms_current; // Calculate the real instantanous value from the ADC reading inst_current = (adc_value/1024)*2.5; // 10bit ADC, Voltage ref. 2.5V, so formula is: x=(adc/1024)*2.5V // Update the RMS value with the new instananous value: // Substract […]

内部计算64位整数中的尾随零位?

这是关于位操作的一些先前问题的后续跟进。 我修改了这个站点的代码来枚举设置了N位的K的字符串(x是设置了K位的当前int64_t ,在这段代码的末尾,它是按字典顺序排列的下一个整数,设置了K位): int64_t b, t, c, m, r,z; b = x & -x; t = x + b; c = x^t; // was m = (c >> 2)/b per link z = __builtin_ctz(x); m = c >> 2+z; x = t|m; 只要最低有效位在x的较低DWORD中,使用__builtin_ctz()的修改就可以正常工作,但如果不是,则完全中断。 这可以通过以下代码看到: for(int i=0; i<64; i++) printf("i=%i, ctz=%i\n", i, __builtin_ctz(1UL << i)); 打印GCC版本4.4.7: […]

使用RDTSC以C计算CPU频率始终返回0

我们的讲师给出了以下代码,因此我们可以测量一些算法性能: #include #include static unsigned cyc_hi = 0, cyc_lo = 0; static void access_counter(unsigned *hi, unsigned *lo) { asm(“rdtsc; movl %%edx,%0; movl %%eax,%1” : “=r” (*hi), “=r” (*lo) : /* No input */ : “%edx”, “%eax”); } void start_counter() { access_counter(&cyc_hi, &cyc_lo); } double get_counter() { unsigned ncyc_hi, ncyc_lo, hi, lo, borrow; double result; access_counter(&ncyc_hi, […]

高效的Modulo 3操作?

可能重复: 快速模3或除法算法? 每个人都知道模运算可能是性能上的一个巨大缺点。 有没有人知道x%3操作的好选择? 我知道x%2存在一个,但我真的需要一个模3,因为我想在for循环中在三个缓冲区之间交替。 谢谢!