C:改善使用重罪()的功能的性能

C:改善使用重罪()的功能的性能,第1张

概述我有一个C函数,根据经过时间计算4个正弦值.使用gprof,我认为这个功能使用100%(100.7%是精确的哈尔)CPU时间. voidupdate_sines(void){ clock_gettime(CLOCK_MONOTONIC, &spec); s = spec.tv_sec; ms = spec.tv_nsec * 0.0000001; etime = 我有一个C函数,根据经过时间计算4个正弦值.使用gprof,我认为这个功能使用100%(100.7%是精确的哈尔)cpu时间.
voIDupdate_sines(voID){    clock_gettime(CLOCK_MONOTONIC,&spec);    s = spec.tv_sec;    ms = spec.tv_nsec * 0.0000001;    etime = concatenate((long)s,ms);    int k;    for (k = 0; k < 799; ++k)    {        double A1 = 145 * sin((RAND1 * k + etime) * 0.00333) + RAND5;           // Amplitude        double A2 = 100 * sin((RAND2 * k + etime) * 0.00333) + RAND4;           // Amplitude        double A3 = 168 * sin((RAND3 * k + etime) * 0.00333) + RAND3;           // Amplitude        double A4 = 136 * sin((RAND4 * k + etime) * 0.00333) + RAND2;           // Amplitude        double B1 = 3 + RAND1 + (sin((RAND5 * k) * etime) * 0.00216);           // Period        double B2 = 3 + RAND2 + (sin((RAND4 * k) * etime) * 0.002);         // Period        double B3 = 3 + RAND3 + (sin((RAND3 * k) * etime) * 0.00245);           // Period        double B4 = 3 + RAND4 + (sin((RAND2 * k) * etime) * 0.002);         // Period        double x = k;                                   // Current x        double C1 = 0.6 * etime;                            // X axis move        double C2 = 0.9 * etime;                            // X axis move        double C3 = 1.2 * etime;                            // X axis move        double C4 = 0.8 * etime + 200;                          // X axis move        double D1 = RAND1 + sin(RAND1 * x * 0.00166) * 4;               // Y axis move        double D2 = RAND2 + sin(RAND2 * x * 0.002) * 4;                 // Y axis move        double D3 = RAND3 + cos(RAND3 * x * 0.0025) * 4;                // Y axis move        double D4 = RAND4 + sin(RAND4 * x * 0.002) * 4;                 // Y axis move        sine1[k] = A1 * sin((B1 * x + C1) * 0.0025) + D1;        sine2[k] = A2 * sin((B2 * x + C2) * 0.00333) + D2 + 100;        sine3[k] = A3 * cos((B3 * x + C3) * 0.002) + D3 + 50;        sine4[k] = A4 * sin((B4 * x + C4) * 0.00333) + D4 + 100;    }}

这是gprof的输出:

Flat profile:Each sample counts as 0.01 seconds.  %   cumulative   self              self     total            time   seconds   seconds    calls  Ts/call  Ts/call  name    100.07      0.04     0.04

我目前正在使用大约30-31 fps的帧速率.现在我认为这是做一个更有效的方法.

正如你所注意到的,我已经将所有的分区改为乘法,但对性能的影响很小.

我如何提高这个数学重功能的表现?

解决方法 除了其他答案中提供的所有其他建议,这里是一个纯粹的算法优化.

在大多数情况下,您正在计算一些形式为sin(k * a b)的东西,其中a和b是常量,k是一个循环变量.如果您还要计算cos(k * a b),则可以使用2D rotation matrix形成递归关系(矩阵形式):

|cos(k*a + b)| = |cos(a)  -sin(a)| * |cos((k-1)*a + b)||sin(k*a + b)|   |sin(a)   cos(a)|   |sin((k-1)*a + b)|

换句话说,您可以根据上一次迭代的值计算当前迭代的值.因此,您只需要对k == 0进行完整的触发计算,但其余的可以通过这种重复计算(一旦计算了cos(a)和sin(a),它们是常数).所以你消除了75%的trig函数调用(不清楚相同的技巧可以被拉到最后一组trig调用).

总结

以上是内存溢出为你收集整理的C:改善使用重罪()的功能的性能全部内容,希望文章能够帮你解决C:改善使用重罪()的功能的性能所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/langs/1253049.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-07
下一篇 2022-06-07

发表评论

登录后才能评论

评论列表(0条)

保存