Tag: 性能

优化我! (C,表现) – 跟随苦涩的问题

感谢bit Twiddling的一些非常有用的stackOverflow用户:设置了哪个位? ,我已经构建了我的函数(在问题的最后发布)。 任何建议 – 即使是小建议 – 将不胜感激。 希望它能使我的代码变得更好,但至少它应该教会我一些东西。 🙂 概观 此function将被调用至少10 13次,并且可能经常被调用10 15次 。 也就是说,此代码很可能会运行数月 ,因此任何性能提示都会有所帮助。 此function占计划时间的72-77%,基于分析和不同配置中的大约十二次运行(优化此处不相关的某些参数)。 此function目前平均运行50个时钟。 我不确定这可以改进多少,但我很高兴看到它在30岁时运行。 重点观察 如果在计算的某个时刻你可以告诉你将返回的值很小(准确值可协商 – 比如说,低于一百万) 你可以提前中止 。 我只对大价值感兴趣。 这就是我希望节省大部分时间的方式,而不是通过进一步的微观优化(尽管这些当然也是受欢迎的!)。 绩效信息 smallprimes是一个位数组(64位); 平均大约8位将被设置,但它可以少至0或多达12。 q通常是非零的。 (请注意,如果q和smallprimes为零,则函数会提前退出。) r和s通常为0.如果q为零,r和s也将为0; 如果r为零,则s也是如此。 正如最后的评论所说,nu到底通常是1,所以我有一个有效的特殊情况。 特殊情况下的计算可能会出现溢出风险,但通过适当的建模我已经certificate,对于我的输入,这不会发生 – 所以不要担心这种情况。 此处未定义的function(ugcd,minuu,star等)已经过优化; 无需花很长时间才能运行。 pr是一个小数组(全部在L1中)。 此外,这里调用的所有函数都是纯函数 。 但是如果你真的在乎… ugcd是gcd ,minuu是最小值,vals是尾随二进制0的数量,__ builtin_ffs是最左边的二进制1的位置,star是(n-1)>> vals(n- 1),pr是从2到313的素数数组。 目前正在Phenom II 920 x4上进行计算,尽管对i7或Woodcrest的优化仍然很有意义(如果我在其他节点上获得计算时间)。 我很乐意回答您对该function或其成员的任何问题。 […]

C中双精度数组的优化和

我有一个任务,我必须采取一个程序,并使其在时间上更有效。 原始代码是: #include #include // You are only allowed to make changes to this code as specified by the comments in it. // The code you submit must have these two values. #define N_TIMES 600000 #define ARRAY_SIZE 10000 int main(void) { double *array = calloc(ARRAY_SIZE, sizeof(double)); double sum = 0; int i; // You can […]

我在哪里可以找到世界上最快的实施方案?

我正在寻找IA32上极其快速的atof()实现,针对US-en语言环境,ASCII和非科学表示法进行了优化。 WindowsmultithreadingCRT在这里惨败,因为它检查每次调用isdigit()时的语言环境变化。 我们目前最好的是源自perl + tcl的最佳实现,并且优于msvcrt.dll的atof一个数量级。 我想做得更好,但我没有想法。 与BCD相关的x86指令看起来很有希望,但我无法让它超越perl / tcl C代码。 任何SO的人都可以找到最好的链接吗? 也欢迎基于非x86组件的解决方案。 根据初步答案澄清: 对于该应用,~2 ulp的不准确性是好的。 要转换的数字将通过网络小批量地到达ascii消息,我们的应用程序需要以尽可能低的延迟转换它们。

2次幂数据的性能优势?

如果我有一个拥有3D世界的游戏,并且世界相当大,那么需要分成几个块,是否有一个主要的,如果有的话,有128个字节块的性能优势,比如150个字节的块? 显然,块中的对象仍然是整数个字节。 即chunks[128][128][128]比chunks[150][150][150]或chunks[112][112][112]更快? 之后是否存在其他副作用,例如过多的RAM浪费? 是否还有其他因素需要考虑? 我只是看到将所有内容存储在变量和大小为2的幂的数组中是一种惯例,但我不确定它是否有任何优点,如果使用更多人类数字如100或150更好。

重新排列等式

我的C代码中有以下等式 k * dl * (1.0 + pHold / centre + (pHold * pHold) / (2.0 * centre * centre) – square / (2.0 * centre)) 我知道浮点除法比乘法要贵得多,而且我已经和它搏斗了一段时间。 有没有办法重新排列这个来划分一个师? 谢谢

OpenMP比1个线程慢于顺序版本

我使用OpenMP(gcc版本4.6.3)实现了背包 #define MAX(x,y) ((x)>(y) ? (x) : (y)) #define table(i,j) table[(i)*(C+1)+(j)] for(i=1; i<=N; ++i) { #pragma omp parallel for for(j=1; jj) { table(i,j) = table(i-1,j); }else { table(i,j) = MAX(profits[i]+table(i-1,j-weights[i]), table(i-1,j)); } } } 顺序程序的执行时间= 1s openmp的执行时间为1个线程= 1.7s(开销= 40%) 在这两种情况下使用相同的编译器优化标志(-O3)。 有人可以解释这种行为背后的原因。 谢谢。

omp_set_num_threads(1)的原因比没有openmp慢

我相信每个人都同意这篇文章的标题。 有人能指出我的理由吗? 任何像书等的引用? 我试图找到但没有运气。 我相信原因是openmp有一个同步开销,没有openmp项目没有。 希望有人可以扩大原因吗? 谢谢

clock() – c函数的执行时间

我试图用C来衡量代码块的执行时间。我的代码中有这样的东西: clock_t begin, end; double time_spent; begin = clock(); ATL_dsymv(122,n,alfa,A,n,X,1,beta,Y,1); end = clock(); time_spent = (double)(end – begin) / CLOCKS_PER_SEC; printf (“(%f seconds)”,time_spent); 但它总是返回:(0.000000秒)。 我在更简单的代码块上尝试了同样的事情,但是它有相同的结果。 我究竟做错了什么? 非常感谢。

如何在C中逐字翻译句子?

#include int main(void) { int i,j; int wordstart = -1; int wordend = -1; char words[]= “this is a test”; char temp; // Reverse each word for (i = 0; i < strlen(words); ++i) { wordstart = -1; wordend = -1; if(words[i] != ' ') wordstart = i; for (j = wordstart; j < strlen(words); […]

Jiffies – 如何计算秒数?

我有一段代码,我想以秒计算时间..虽然我在jiffies有时间,我怎么能在几秒钟内转换它? 这是我的内核代码: #include #include #include #include unsigned long js, je, tet; int netblock_init_module(void){ js = jiffies; printk(“\n[Jiffies start Time : %lu]\nModule Started.\n”, js); return 0; } void netblock_cleanup_module(void) { je = jiffies; printk(“\n[Jiffies End Time : %lu]\nModule Removed.\n”, je); tet = je – js; printk(“\nEnd Time [%lu] – Start Time [%lu]: \nTotlal elapsed Time [%lu]\n”,js,je, […]