使用inline::C来加速数学计算是否值得?

5
我一直在开发一款perl程序,用于处理大量的dna数据。它能输出我需要的内容,但是执行速度比我预期的要慢得多。使用NYTprof分析后,我发现问题主要出在将值相加的循环中。使用inline::C来进行计算能够加速程序吗?或者我应该接受这种速度并继续前进呢?还有其他方法可以提高速度吗?您可以在这里找到我的程序和一个输入文件,以及一个已经填好默认值的可执行文件。

3
你尝试使用 inline::C 了吗?它有效吗? - Mat
6
我建议您在此处内联添加来自代码的相关摘录 - 该函数/区域由NYTProf指示为热点; 甚至可能包括有关问题区域的NYTProf信息的摘录 - 这将有助于人们更轻松地回答您的问题。 - DaveR
没有看到你的程序或数据的基本描述,回答这样一个泛泛而谈的问题听起来相当困难。 - TLP
我正在执行高度迭代的任务,我的程序扫描DNA文件以查找特定模式,根据这些模式的位置计算向量并将它们相加。 - Orion
codereview.stackexchange.com? - AShelly
2个回答

3

在这里(包括这里)很难得到有用的帮助。我看到你的代码存在各种问题,但与语言选择无关。

  1. 使用CPAN。如果你正在解析genbank,则使用一些适当的模块

  2. 你正在使用Perl编写汇编代码,但Perl和你都不太擅长。当你不将参数传递给子程序,而是依靠全局变量时,很难知道发生了什么。 @X1,@ X2,@Y1,@ Y2 是什么意思?

  3. 以下内容可能是你的问题:until ($ender - $starter > $tlength) {(第153行)。根据你的测试案例,它们最初分别为103、1和200,不清楚何时或是否会更改。根据@te中的内容,它可能永远不会跳出循环;从你的代码中我无法判断。

  4. 如果我们知道add的参数、输入输出不变量以及返回值,将有所帮助。

就这些了。


1
这非常有帮助。我将它从五分钟缩短到了三秒钟。非常感谢你。 - Orion
1
很高兴我能有所帮助! - Pedro Silva

0

如果适用的话,我赞同在评论中提到的使用PDL。或者使用针对您问题量身定制的CPAN模块(同样,如果适用)。

我在那段代码中没有看到任何一些明确表示“将我的值相加的循环”;请只展示您正在考虑优化的代码,并最好有足够的结构使其能够运行。

回答您的通用问题,是的,如果您确定性能问题仅限于它实际能为您做的事情,Inline::C可以成为优化的有力工具。在使用它时,请注意从Perl调用您的C代码或反过来调用都是比较昂贵的,因此您必须翻译足够多的代码以将转换次数最小化。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接