2011-09-21 67 views
1

与分配和垃圾收集整数相比,假设调用静态方法的速度快是否正确?静态函数访问的速度

或换言之,fh1或fh2会更好吗?在fh1中避免了分配,但fh2似乎更简单。在这种情况下,G.f()是一个相对简单的方法,它会经常被调用。 fh2和fh1也会经常被调用(可能多达每秒30次)。

伪代码:

class G { 
    static method int f() {.......} 
} 

class H { 
    method fh1(){ 
    somemethod1(G.f()); 
    somemethod2(G.f()); 
    somemethod3(G.f()); 
    } 

    method fh2(){ 
    int a = G.f(); 
    somemethod1(a); 
    somemethod2(b); 
    ..... 
    } 
} 
+0

你说的分配,避免FH1,但在G.f会发生什么()呢? – peko

+0

@peko,例如Gf()可以通过使用G类的几个静态成员变量,通过对它们应用数学公式来计算派生值(其他东西也是可能的) – tjb

回答

1

每秒30次不经常(每秒100万次)。因此这里没有问题,所以不要优化它。

话虽如此,fh2会更有效率,分配比功能调用便宜。

1

我会在这种特殊情况下使用静态方法的原因是,如果int值必须改变的潜力。换句话说,如果G.f()正在执行一些逻辑,并且第1次调用可能与第10次调用不同,那么可以使用静态方法。像这样的静态方法提供了一种通过重用逻辑并使逻辑处于可管理状态来减少代码的方法,因此如果需要更改逻辑,则只需在一个位置更改它。

这就是说,在方法fh1中,如果G.f()会在调用fh1()中的三个不同时间所需的时间跨度内发生变化,那么结果可能会有多大?可能非常小,但仍值得考虑。

我可能会选择fh2()来保持一致性。性能差异可能可以忽略不计。

+0

函数调用之间的值变化的好处 – tjb

1

在你的例子中,你不是“分配”也不是“垃圾收集”整数。

相反,在fh2中,生活在堆栈上,并且不需要额外的时间来分配/取消分配它。

方法调用花费多长时间取决于方法的代码。这个电话很快,但仍然比什么都慢。因此,我会使用fh2版本。

+0

我不喜欢不明白,当你做一个像int a这样的变量,然后函数调用结束时,不会在一段时间后收集垃圾回收吗?你是否说它被重用? – tjb

+0

不,它只是堆栈中的一个插槽,并且堆栈指针基本上递减8或递增)一些量,留下int,这是一个循环。堆栈不被垃圾收集。 – Ingo

+0

谢谢,那些正在寻找关于这个子主题的额外信息的人应该看看http:// stackoverflow。com/q/2474622/530634 – tjb

0

我们应该忘记小效率,比如约97%的时间:不成熟的优化是所有邪恶的根源。但我们不应该在这个关键的3%中放弃我们的机会。一个好的程序员不会因为这样的推理而变得自满,他会明智地仔细看看关键代码;但只有在代码已被确定

©高德纳

+0

是的,我知道这个评论,并同意,但它仍然不知道:) – tjb

+0

另外,如果有明确的最佳做法,那么它将是很好的遵循它。 – tjb