![]() |
1
23
你的函数似乎是解析函数,我建议用插值法完全替换它。这样,您就可以将昂贵的呼叫减少到
在这种情况下,最好是有理函数近似。你的函数可能在复平面上有极点,这通常会破坏多项式插值。
请注意,您有两个变量:
我要讲的是有理函数近似
另外,对于最后一部分,更换
通过
(这是
所以你可以用一些算术运算和一个指数运算。
编辑:
See a graph of
编辑: 替换
通过
你应该得到更多的百分比。在这一点上,有理近似法可能过于工程化:您有两个exp和两个sqrt。 |
![]() |
2
3
数学不会立即看起来像是可以重新排序以避免任何重复计算,因此采用的方法取决于如何使用此函数以及您需要的结果有多精确。 最好的方法是避免重新计算同一组输入值的值。您的代码可以为相同的输入值保存计算结果吗?如果没有,您可以有一个值缓存,但是要注意double可以有很多值,您可能希望将double折叠到一个已知的间隔(例如从0到1折叠到0到99的整数)。 |
![]() |
3
3
我猜
比快
|
![]() |
4
2
看一眼你提到的那篇论文,似乎l_etq和a0只是声音频率(树皮)的函数。 所以,至少你可以想出一张表,列出给定频率下各种计算的结果。例如,缓存以下结果:
按频率。[也可以缓存(a0+l_etq)*.1] 还有,可能是轻微的影响,如果有的话,但我会将1/4转换为0.25。 |
![]() |
5
1
为程序可以处理的输入范围预先生成一个查找表。 再快不过了!:) |
![]() |
6
1
根据输入参数缓存输出可能有助于: |
![]() |
7
1
这还没有被提及,所以我会的。 您可能需要考虑从浮点数学移动到整数。操作要快一点。由于浮点数是如何添加和存储的,图形倾向于使用整数数学而不是浮点。你将不得不转换为和来自,但我相信你会得到相当大的性能提升。整数数学唯一的问题是你必须定义你愿意接受的精度。 |
![]() |
8
0
|
![]() |
9
0
我愿意 take some stackshots against it 以消除猜测。 这样我就可以确定时间不会花在其他地方,比如读取数据并将其转换为浮点,或者打开/关闭文件。 当我确定这个程序花费了大部分时间时,我很确定它将花费几乎所有的时间来调用数学函数,以及将l_etq转换为整数。也许可以记忆这些数学函数。然后,正如亚历山德拉所说,你也许可以用插值来完成这一切。 问题是,你可能有不止一件事情要优化。如果这大约需要180秒,如果50%的时间,比如说,这个程序在堆栈上,那么如果你将它的时间缩短一半,你将时间缩短45秒到135秒。但是,现在这个例程只在堆栈上运行45/135秒或1/3。这意味着其他一些东西也在使用其他的2/3或90秒,我敢打赌其中也有一些东西可以优化。如果你能把它们减少到45秒,那么总数就减少到90秒,而数学程序所占的百分比又回到了50%,所以也许你能从中挤出更多。就是这样。每次你减少一部分,其他部分的百分比就会增加,所以你可以一次又一次地追求它们,直到你真的尽可能地压缩它。 |