【发布时间】:2018-01-13 22:40:08
【问题描述】:
我正在做一个生物信息学的大学项目,遇到了一个非常奇怪的情况,我就是不明白。
为了优化计算生物序列中子序列哈希值的函数的 CPU 性能,我替换了以下内容:
hashValue += powf(4.0, k-i-1) * PHI_function((*seqence)[startIndex + i]);
//top of file has #include<cmath>
与:
hashValue += (0x1 << (2*(k-i-1))) * PHI_function((*seqence)[startIndex + i]);
//top of file does not have #include<cmath> since powf is not used
变量解释:
//k is the sub-sequence length
//i is a index going from 0 to k
//sequence -> pointer to bio-sequence string
//hashValue is of type int
//
//PHI_function has the following signature: inline int HashTableCalculationMethod::PHI_function(char b)
// and only conatins: return (b & 0x6) >> 1;
//which means
// if (b == 'A') {
// return 0;
// } else if (b == 'C') {
// return 1;
// } else if (b == 'G') {
// return 2;
// } else if (b == 'T') {
// return 3;
// }
这将程序时间性能提高了约 5 倍,但由于某种原因,内存消耗也从约 4GB 增加到了约 7.5GB(在我为该项目收到的样本上运行时)。
我确信这是由于 Git 版本跟踪而影响内存消耗的更改(我在修改前后都有提交)。
有人能解释一下这是如何影响程序内存消耗的吗?
项目位于link。提交改变性能的是 d39d055
提前谢谢你。
【问题讨论】:
-
将两行代码放入带有断言的代码中,以检查它们总是给出相同的值。
-
当你转换为 int 时,我想到解释内存差异的唯一一件事就是单精度浮点地板/截断。第一个版本实际上可能会丢失精度,导致错误地产生比预期结果更小的结果。
-
@TeamUpvote 你是对的,我通过 Richard Critten 建议的断言发现了这一点。但由于他的回答是在这样的评论中,我不知道如何接受它来结束问题
-
您可以自己回答并接受它或接受 L. Serni 的。他似乎有一种预感,这与选角有关。如果您自己回答,可能会很方便地给出问题的详细答案以及您是如何解决的,以便其他人查看他们是否遇到类似情况。干杯!
-
顺便说一句,对于未来的参考,请注意那些从浮点数转换为整数的问题。在这种情况下,四舍五入通常会给您想要的结果,例如:
int int_val = static_cast<int>(flt_val + 0.5f);这样,如果您喜欢15.9998f,它仍然会四舍五入为16。顺便说一句,你们喜欢战术角色扮演游戏吗?我也想对所有这些东西投赞成票,但我没有投赞成票!我稍后会投票!
标签: c++ performance memory-management