我正在写一个用于科学计算的程序,我最感兴趣的(在正确性之后)是速度。最近我注意到我也需要可读的代码。:)
而不是写作
for (int k=0;k!=10;k+=1)
array[k] = fun(a, k);我在考虑写
class fun_t {
private:
type a;
public:
fun_t(type in) : a(in) {};
type operator() (int k) {
...computation...
}
};
...
fun_t fun(a);
for (int k=0;k!=10;k+=1)
array[k] = fun(k);函数对象样式会和第一个例子一样快吗?我能期望在两者中有相同的内联吗?有没有更好的方法?(请注意,我只是在这里展示想法,这不是我的实际代码。)
发布于 2012-10-25 19:56:57
你可以期待来自一个合理的编译器的相同的内联。就像对fun(a,k)的调用一样,调用operator()的目的地在编译时是已知的。
我看到的不同之处在于对a的访问。在使用函数fun的情况下,将某些内容作为参数进行传递--如果没有fun的声明,就不可能看到这是a的副本、对a的引用,还是从a构造的其他类型。
对于函数器fun_t,只需复制a一次即可构造函数器。您(名义上)将fun_t*作为this传递给operator(),然后以this->a的身份访问a。一旦一切都内联并完成了优化器,额外的间接性就很可能被省略了,但话又说回来,它可能还没有完成。您必须检查特定的情况,可能是通过检查编译器发出的指令。
发布于 2012-10-25 19:39:34
我认为繁重的计算是在你的函数中执行的。相比之下,直接函数调用和成员函数调用之间的区别应该是微不足道的。
发布于 2012-10-25 19:41:25
您可以通过更改循环结构来进行一些小的优化,但这些优化的主要目的不是为了提高速度。
如果你想提高速度,你需要分析。如果fun(a,k)是一个特别慢的操作,并且每次运行都不依赖于其他运行,那么您应该考虑拆分成线程,并在各自的线程上运行每个线程。
新的API将以并行而不是串行的方式在集合上运行。激动人心的时刻即将来临。
https://stackoverflow.com/questions/13067432
复制相似问题