我正在编写一个小型模拟程序,我有一个void move(int n)
函数和一个void move()
函数。正如他们的名字所暗示的那样,move(int n)
会使n
一次移动,而move()
只会移动一次。
现在我有两种方法可以实现它们。方法1是:
public void move()
{
// make one move
}
public void move(int n)
{
for (int i=0;i<n;i++)
{
move();
}
}
接近2:
public void move(int n)
{
for (int i=0;i<n;i++)
{
// make one move
}
}
public void move()
{
move(1);
}
显然,当移动次数很大时,方法2会提高时间效率,因为我们每次移动时都不会进行单独的功能调用。但是,由于现在每个移动的实现都是在for loop
中实现的,因此稍后更改实现(例如,从每次移动中获取元数据或分析数据)似乎没有良好的模块性。并且在一次一个地进行多个单个移动的情况下,方法2需要额外的函数调用和额外的循环设置。
假设我们不了解未来的特定用例,我应该如何决定采取哪种方法?
答案 0 :(得分:1)
实际上,一个好的JVM应该使它们非常相同(主要是内联,见this answer);你应该专注于可读代码,这肯定使第一个更好。如果确实很重要,我建议尝试用随机用例(例如所有单个移动,所有大量移动,混合)来分析您的代码;您可能必须做出一些关于您最有可能查看的定性决策,并且请记住,如果您编写可能被移植的代码,它将依赖于实现。
答案 1 :(得分:1)
也许我错过了一些东西,但看起来你只需要一个功能
public void move(int n)
{
for (int i=0;i<n;i++)
{
// make one move
}
}
对于只需要进行一次移动的情况,初始化变量i所需的额外时间再做一次比较可以忽略不计。
答案 2 :(得分:0)
我建议您在进行移动时只使用一个功能,无论是一次移动还是多次移动。您应该使用第一种方法并保留void move()
private
并让void move(int n)
调用此函数public
。