Tag: 优化

读进程写的最佳缓冲区大小

在我的函数中,我需要将文件中的一些数据读入缓冲区,操作数据并将其写回另一个文件。 该文件大小未知,可能非常大。 如果我使用一个小缓冲区,将会有一个很长的读/写周期,这将花费很多时间。 相反,长缓冲区意味着我需要消耗更多内存。 我应该使用的最佳缓冲区大小是多少? 这种情况是依赖的吗? 我在Windows中看到了一些像Tera copy这样的应用程序,可以高效地管理大量文件。 我应该注意其他任何技术或机制吗? 注意:此程序将在Windows下运行。

跟踪位操作的优化机会?

你觉得函数haswon有优化的余地吗(见下文)? 我认识到将参数类型从__int64更改为unsigned __int64使得函数更快,因此我可能仍然有机会进行优化。 更详细:我正在写一个连接四游戏。 最近我使用了Profiler Very Sleepy,并认识到函数haswon使用了大部分的cpu-time。 该function使用连接四板的位板表示给一个玩家。 我在fourstones基准测试的源头找到了这个function。 位板表示如下: . . . . . . . TOP 5 12 19 26 33 40 47 4 11 18 25 32 39 46 3 10 17 24 31 38 45 2 9 16 23 30 37 44 1 8 15 22 29 36 43 0 7 […]

循环平铺。 如何选择块大小?

我正在尝试学习循环优化。 我发现循环平铺有助于使数组循环更快。 我尝试使用下面给出的两个代码块,有或没有循环阻塞,并测量两者的时间。 我大部分时间都没有发现明显的差异。 我测试了不同的块大小,但我不知道如何选择块大小。 如果我的方向错了,请帮助我。 实际上我发现没有块的循环工作速度快了很多倍。 一个。 随着阻止 int max = 1000000; int B = 100; for (i = 0; i < max; i += B) { for (j = i; j < (i + B); j++) { array[j] = 0; } } 湾 没有阻止 for (i = 0; i < max; i++) { […]

如何编写更好的strlen函数?

我正在阅读“编写伟大的代码卷2”并显示以下strlen inslementation: int myStrlen( char *s ) { char *start; start = s; while( *s != 0 ) { ++s; } return s – start; } 这本书说这种实现对于没有经验的C程序员来说是典型的。 在过去的11年里,我一直在使用C语言进行编码,我无法在C中看到如何编写比这更好的函数(我可以想到在汇编中编写更好的东西)。 如何在C中编写比这更好的代码? 我看了glibc中strlen函数的标准库实现,我无法理解它的大部分内容。 在哪里可以找到有关如何编写高度优化代码的更好信息?

俄罗斯农民增殖

这是我对俄罗斯农民增殖的简短实施。 怎么改进? 限制 :仅在> 0,b> 0时有效 for(p=0;p+=(a&1)*b,a!=1;a>>=1,b<<=1);

是否假定C / C ++中的所有函数都返回?

我正在阅读关于未定义行为的本文 ,其中一个示例“优化”看起来非常可疑: if (arg2 == 0) ereport(ERROR, (errcode(ERRCODE_DIVISION_BY_ZERO), errmsg(“division by zero”))); /* No overflow is possible */ PG_RETURN_INT32((int32) arg1 / arg2); 图2 :意外的优化使PostgreSQL的src/backend/utils/adt/int8.c中的除零检查src/backend/utils/adt/int8.c 。 对ereport(ERROR, :::)的调用将引发exception。 本质上,编译器假定 ereport将返回,并删除arg2 == 0检查,因为除法的存在意味着非零分母,即arg2 != 0 。 这是一个有效的优化吗? 编译器是否可以自由地假设函数将始终返回? 编辑:整个事情取决于电子报,因此描述: 84 /*———- 85 * New-style error reporting API: to be used in this way: 86 * ereport(ERROR, 87 * […]

学习可能()和不太可能()编译器提示的样本

我如何向学生展示likely和unlikely编译器提示的可用性( __builtin_expect )? 你能编写一个示例代码吗,这些代码比较没有提示的代码会快几倍。

高效(循环)算法计算模25?

我有一个代码,我在其中计算x%25。x总是取正值但其动态范围很大。 我发现这个计算轴%25的特殊代码片段需要大周期。 我需要优化它。 由于表可能存在大的内存大小,因此排除了预先计算的查找表。 作为第二种方法我编码下面的片段(C代码) – mod(a, b) { int r = a; while(r >= b) { r = r – b; } return r; } 1.)如何针对周期进一步优化此代码(将其压缩到最大值)? 2.)是否有任何完全不同的优化方式来实现x%25(我知道它不是一个常见的操作,但仍然,寻找人们可能在他们的经验中使用的聪明输入,这可能会让我感到厌烦。)。 谢谢。 -广告 编辑: 我认为在C中使用本机模运算符%,内部使用除法运算(/),这对我正在使用的处理器来说代价很高。(没有div指令)。 因此,尝试查看自定义实现是否可以使用%运算符击败固有计算。 -广告

如何使用C中的SSE内部函数计算矢量点积

我试图将两个向量相乘,其中一个向量的每个元素乘以另一个向量的相同索引中的元素。 然后,我想总结得到的向量的所有元素以获得一个数字。 例如,对于向量{1,2,3,4}和{5,6,7,8},计算结果如下: 1 * 5 + 2 * 6 + 3 * 7 + 4 * 8 基本上,我正在采用两个向量的点积。 我知道有一个SSE命令来执行此操作,但该命令没有与之关联的内部函数。 此时,我不想在我的C代码中编写内联汇编,所以我只想使用内部函数。 这似乎是一个常见的计算,所以我很惊讶自己在Google上找不到答案。 注意:我正在针对特定的微架构进行优化,该架构最多支持SSE 4.2。 谢谢你的帮助。

C的非线性最小二乘优化库

我正在寻找一个C语言库,它将对目标函数进行优化(最好是Levenberg-Marquardt算法),并支持盒约束,线性不等式约束和非线性不等式约束。 我已经尝试了几个库,但它们都没有为我的应用程序使用必要的约束类型: GNU GSL (根本不支持约束) cMPFIT (仅支持框约束) levmar (根本不支持非线性约束) 我目前正在探索NLopt ,但我不确定我是否可以使用任何提供的算法实现最小二乘法。 我发现很难相信没有一个库可以支持这个问题的全部限制,所以我猜我在google搜索时出错了。 我最近发现我可以从C调用Matlab函数。虽然这很容易解决问题,但我不想从C调用Matlab函数。根据我的经验,这并不快。 任何帮助将不胜感激。