Java Best Practices: производительность с параметрами метода - PullRequest
0 голосов
/ 15 февраля 2012

Что быстрее и / или требует меньше ресурсов:

class Foo()
{
    public int value;
}

Сюда?

public int doSomeStuff(Foo f)
{
    return (f.value + 1);
}

public int doOtherStuff()
{
    ...
    Foo f = new Foo();
    int x = doSomeStuff(f);
    ...
)

или так?

public int doSomeStuff(int v)
{
    return (v + 1);
}

public int doOtherStuff()
{
    ...
    Foo f = new Foo();
    int x = doSomeStuff(f.value);
    ...
)

В обоих случаях doSomeStuff ничего не изменит в классе foo. Просто нужно знать «значение».

Ответы [ 7 ]

3 голосов
/ 15 февраля 2012

Они оба выполняют одно и то же, происходит одна и та же последовательность операций.Ваша главная забота - ремонтопригодность и продуманный дизайн.Тщательно продумайте, каким методам нужны какие данные, и спроектируйте их правильно.

Если у вас есть проблемы, вы можете оптимизировать их позже.Но вы всегда должны оптимизировать в последнюю очередь.

1 голос
/ 15 февраля 2012

С точки зрения потребления ресурсов, это точно так же.Но второй вариант явно лучше с точки зрения программирования, потому что если doSomeStuff нуждается только в значении, тогда нет смысла передавать f.

0 голосов
/ 15 февраля 2012

Это не имеет значения с точки зрения производительности.Рекомендация: не думайте о преждевременной оптимизации.Подумайте о правильности и хорошем дизайне вашего кода.

Например, ваш код

  1. Не соответствует правилам именования: имена классов должны начинаться с заглавной буквы
  2. Содержит открытые поля.Запрещено.Используйте обозначения бинов (геттеры и сеттеры).
  3. Невозможно скомпилировать (нет типа integer. Выберите из int и Integer
0 голосов
/ 15 февраля 2012

Разница между деланием:

object.intvariable + 1

и

int + 1

настолько незначительно, что не имеет значения для реальных приложений. Вероятно, это еще один или два кода операции JVM, чтобы найти foo и найти переменную-значение, о которой упоминать не стоит. Вы бы никогда этого не заметили, если бы не попытались создать псевдо-приложение в реальном времени на Java (что практически бесполезно).

Однако, тем не менее, то, как вы это делаете, очень плохо. Вы не должны подвергать value напрямую, но должны использовать правильную инкапсуляцию данных с помощью методов получения и установки.

0 голосов
/ 15 февраля 2012

Вероятно, даже лучше:

Decalre doSomeStuff() как метод foo и вызовите: f.doSomeStuff()

Это гораздо более читабельно и его легче поддерживать, делая этотак что, если у вас есть подкласс foo: Bar, и вы хотите вычислить вещи немного по-другому - все, что вам нужно сделать, это переопределить doSomeStuff() в Bar

Вы должныпредпочитаю удобочитаемость, а не микрооптимизацию - пусть компилятор позаботится о них для вас.

привязка кода:

class foo() {
    public int value; 
    public int doSomeStuff() {
       return value + 1;
    }
}

и:

public int doOtherStuff() {
    ...
    foo f = new foo();
    int x = f.doSomeStuff();
    ...
}
0 голосов
/ 15 февраля 2012

Зависит от того, как часто вы будете звонить doSomeStuff без звонка doOtherStuff, но обычно разница в производительности незначительна, и если вы звоните только doOtherStuff, они будут одинаково эффективны.

0 голосов
/ 15 февраля 2012

Я не думаю, что разница в производительности вообще. И компилятор Java все равно будет оптимизирован до лучшего ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...