Tag: 性能

将python与c集成以提高性能是否合理?

我喜欢几乎所有东西都使用python,并且总是清楚地知道如果由于某种原因我在我的python代码中找到了一个瓶颈(由于python的限制),我总是可以使用集成到我的代码中的C脚本。 但是,当我开始阅读有关如何集成python的指南时。 在文章中,作者说: 有几个原因可能导致人们希望在C或C ++中扩展Python,例如: 在现有库中调用函数。 向Python添加新的内置类型 优化代码中的内部循环 将C ++类库暴露给Python 将Python嵌入C / C ++应用程序中 关于表现没什么。 所以我再问一遍,将python与c集成以获得性能是否合理?

整数的最小除数,而不是计算平方根

此代码给出整数的最小除数。 但问题是我必须计算平方根。 有没有办法让我不必明确计算平方根? int d,r,n; scanf(“%d”,&n); if(n%2==0) { printf(“2 is ans”); } else { r=sqrt(n); d=3; while((n%d!=0)&&d<r) { d=d+2; } if(n%d==0) printf("ans is %d",d); else printf("ans is 1"); }

如何在大型输入集中更快地在C中进行这种排序程序

对于非常大的输入文件数据,此排序代码会失败,因为它需要很长时间才能完成。 rewind(ptr); j=0; while(( fread(&temp,sizeof(temp),1,ptr)==1) &&( j!=lines-1)) //read object by object { i=j+1; while(fread(&temp1,sizeof(temp),1,ptr)==1) //read next object , to compare previous object with next object { if(temp.key > temp1.key) //compare key value of object { temp2=temp; //if you don’t want to change records and just want to change keys use three statements temp2.key =temp.key; temp=temp1; […]

包含库的运行时性能成本是多少?

包含整个库(可能有数百个函数)然后只使用单个函数之间是否有任何运行时性能差异 : #include int main(int argc, char *argv[]) { bar();//from library foo return 0; } 在将相关代码片段从库直接粘贴到代码之间,例如: void bar() { … } int main(int argc, char *argv[]) { bar();//defined just above return 0; } 什么会阻止我在我的C文件开头无意识地包括我最喜欢的(也是最常用的)库? 这个流行的线程C / C ++:检测多余的#includes? 表明编译时间会增加。 但编译后的二进制文件会有什么不同吗? 第二个项目实际上是否会超过第一个项目? 相关: #include 在ac程序中真的做了什么 编辑:这里的问题与相关的问题不同在C / C ++中包含未使用的头文件会有性能损失吗? 这里的问题是包含一个文件。 我在这里问,如果包含一个文件与将实际使用的代码片段复制粘贴到源中有任何不同。 我稍微调整了标题以反映这种差异。

线程参数的高效快捷方式

使用参数创建线程的最有效方法是什么? 参数是一个结构,如果结构不能保留在父线程堆栈上,则有两种解决方案。 具有动态内存分配 struct Arg{ int x; int y; }; void* my_thread(void* v_arg){ Arg* arg = (Arg*) v_arg; //… running delete arg; return NULL; } //Creating a thread void a_function(){ Arg* arg = new Arg; arg->x = 1; arg->y = 2; pthread_t t; pthread_create(&t, NULL, my_thread, arg); pthread_detach(t); } 用信号量 struct Arg{ sem_t sem; int […]

通过延迟/性能测量确定NUMA布局

最近我一直在观察内存密集型工作负载中的性能影响,我无法解释。 试图找到底部我开始运行几个微基准测试,以确定常见的性能参数,如缓存行大小和L1 / L2 / L3缓存大小(我已经知道了,我只是想看看我的测量是否反映了实际值)。 对于缓存行测试,我的代码大致如下(Linux C,但这个概念当然与Windows等相似): char *array = malloc (ARRAY_SIZE); int count = ARRAY_SIZE / STEP; clock_gettime(CLOCK_REALTIME, &start_time); for (int i = 0; i < ARRAY_SIZE; i += STEP) { array[i]++; } clock_gettime(CLOCK_REALTIME, &end_time); // calculate time per element here: [..] 从1到128改变STEP表明从STEP=64开始,我看到每个元素的时间没有进一步增加,即每次迭代都需要获取一个主导运行时的新缓存行。 改变ARRAY_SIZE从1K到16384K保持STEP=64我能够创建一个很好的绘图,展示一个大致对应于L1,L2和L3延迟的步骤模式。 为了获得可靠的数字,有必要多次重复for循环,对于非常小的arrays大小甚至100,000次。 然后,在我的IvyBridge笔记本上,我可以清楚地看到L1结束于64K,L2处于256K,甚至L3处于6M。 现在谈谈我的真正问题:在NUMA系统中,任何一个核心都将获得远程主内存甚至共享缓存,这些缓存不一定与其本地缓存和内存一样接近。 我希望看到延迟/性能的差异,从而确定在保持快速缓存/部分内存时我可以分配多少内存。 为此,我改进了我的测试,以1/10 MB块的forms遍历内存,分别测量延迟,然后收集最快的块,大致如下: for (int chunk_start […]

为什么在比较范围内的数字时,汇编代码中是否出现分支?

我正在读这个问题,这是接受的答案。 我阅读了评论,但我无法弄清楚产生优化的原因。 使用以下代码时,为什么在汇编代码中出现分支? x >= start && x <= end 编辑: 为清楚起见,我想了解接受答案产生优化的原因。 据我所知,编译器生成的汇编代码中存在分支。 我想了解为什么生成的代码中有一个分支。

在C if-else语句中,是否应该首先出现更可能的条件?

我碰巧写了一个if-else语句,条件在大多数时候都是假的(检查是否分配了静态指针)。 哪一个对编译器进行优化会更好? 或者他们是平等的? 该函数将被调用很多次,因此优化其性能至关重要。 void foo() { static int * p = NULL; if (p == NULL) { p = (int *) malloc( SIZE * sizeof(int)); } //do something here } void foo() { static int * p = NULL; if (p != NULL) { //do something here } else { p = (int *) […]

当我使用并行代码时,为什么我的计算机没有显示加速?

所以我意识到这个问题听起来很愚蠢(是的,我使用的是双核),但是我尝试了两个不同的库(Grand Central Dispatch和OpenMP),并且在使用clock()时使用和不使用的行来计时代码它平行,速度是一样的。 (为了记录,他们都使用自己的平行forms)。 他们报告说是在不同的线程上运行,但也许它们运行在同一个核心上? 有没有办法检查? (两个库都用于C,我在较低层时感到不舒服。)这非常奇怪。 有任何想法吗?

用C ++初始化数组

我看到的每个地方都有人大声争辩说未经初始化的变量是坏的,我当然同意并理解为什么 – 但是; 我的问题是,有时候你不想这样做吗? 例如,取代码: char arrBuffer[1024] = { ‘\0’ }; 对整个arrays执行NULL操作是否会在不初始化的情况下使用arrays产生性能影响?