Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Оптимизация, Что работает быстрее? Дайте ссылки 
:(
    Опции темы
Lisus
Дата 18.8.2008, 23:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: нет
Всего: 2



Народ.

Захотелось узнать разницу в скорости различных реализаций одного и тог же.
Я понимаю, что работа с паблик полями на прямую должна быстрее работать, чем через сеттеры\геттеры. Однако повальное исполнение правила всех програм-эталонов делать доступ через методы побудило меня сравнить 2 подхода, мало ли как там машина устроена. И оказалось, что вызов геттер\сеттера работает раза в 2-2.5 медленнее чем прямой доступ. Значит в некоторых случаях как раз нужно делать доступ прямым.
Порылся немного в инете и к своему удивлению обнаружил, что самые быстрые - это статик методы.

Народ, дайте ссылки на соответствующие темы. Я нашёл крайне мало информации на русском.
Меня интересует во первых что из возможных вариантов работает быстрее, и во сколько раз. Меня интересует какой вариант сколько условных ресурсов жрёт.

1) Вызов метода класса, метода абстрактного класса, интерфейса
2) сколько жрёт операция приведения типов, стоит ли делать поле OBJECT универсальным, если известно, что оно будет конкретного типа
3) Сравнение статик методов, финал, паблик, приват методов
4) Рекурсия и  итераторный способ прохода
5) Вызов функции (можно пустой) от кол-ва её параметров, и возвращаемого типа

У кого есть данные тестов приводите, буду благодарен

Добавлено через 44 секунды
Если есть какие-нибудь советы по оптимизации, пишите.
PM MAIL   Вверх
Shurr
Дата 19.8.2008, 00:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 24.10.2006

Репутация: 5
Всего: 7



Цитата(Lisus @  18.8.2008,  22:47 Найти цитируемый пост)
Если есть какие-нибудь советы по оптимизации, пишите.

Самый лучший совет по оптимизации, он же самый универсальный - не заниматься оптимизацией того, что не тормозит. А что именно тормозит - должен показать профайлер. Это дичайшая банальность, которую все равно многие игнорируют. 

Я не могу назвать себя мега-гуру Java, но опыт показывает, что в подавляющем большинстве случаев оптимизация Java программы не должна касаться таких вопросов, как использование геттеров/сеттеров, изменение модификаторов доступа методов и т.д. и т.п.
PM MAIL   Вверх
Lisus
Дата 19.8.2008, 10:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: нет
Всего: 2



Цитата(Shurr @  19.8.2008,  00:25 Найти цитируемый пост)
Самый лучший совет по оптимизации, он же самый универсальный - не заниматься оптимизацией того, что не тормозит. А что именно тормозит - должен показать профайлер. Это дичайшая банальность, которую все равно многие игнорируют.


Согласен, я как и большинство начинал своё ознакомление с кодом через ассемблер, видимо себя не переделать.
Я понимаю ваш комментарий, но где-то же должны быть даные о ресурсоёмкости разный видов одного и того же. Машину же постоянно оптимизируют, значит и тестят на скорость, мне бы эти данные не помешали.

Я не собираюсь оптимизировать каждую строку, но во-первых есть элементарные универсальные советы (к которым себя приучить совсем не сложно), во-вторых возникает необходимость написать свои аналоги библиотек, а эти библиотеки я собираюсь использовать часто (и детские ошибки делать не хочу), в-третих есть программы, которые очень хорошо жрут время, ну скажем интеллектуальный парсинг (или грабинг), где просчет (анализ) структуры страницы вместе с отклонениями может занять большее время чем получение этой страницы из сети, и скажем выигрыш в 30% - это уже не мало.

Я задал такой вопрос потому, что данные мне нужные где-то должны быть, своего опыта для этого (для ответ на мой вопрос) мне не хватает.

Даже если я и не буду активно использовать эту информацию, нормальному прогеру её владеть хотябы теоретически надо.
PM MAIL   Вверх
SoulKeeper
Дата 19.8.2008, 11:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Код в первую очередь должен быть ЧИТАБЕЛЬНЫМ, т.к. неизвестно кому прийдется его после Вас дорабатывать\исправлять.

Знал я такого оптимизатора одного, конвеншены не соблюдал, названия переменных прыгали как хотели, задачи которые занимают по 50 и больше миллисекунд запускал из конструктора.

Ну а замена instanceof на булены в сложной иерархии классов - вообще вершина маразма.

В результате после него осталась куча не читабельного кода, который работает не так как должен. И теперь уже стоит вопрос - а стоит ли разбираться в таком бреде или просто написать все заново? А работы там на пару недель...



По теме оптимизации:

Была у меня программка... Конвертировала из одного формата данные в другой. Изначально потребляла 450+ мб памяти и выполнялась почти две минуты.

После плясок с бубном (убрал лишние создание обьектов, заменил данные на примитивы, написал утилиты которые вытаскивали из примитивов нужные данные) она начала использовать 160 мб памяти и работать 28 сек.

Мораль? Проблема была не в геттерах\сеттерах, а в не оптимальной структуре хранения данных.
Да и в подавляющем большинстве случаев корень зла кроется именно в не оптимальном алгоритме работы, т.к. при серьезной нагрузке (базы данных, клиент-сервер, прочее) выигрыш составит около1-2% в лучшем случае. Стоит ли из-за этого выигрыша делать код нечитабельным и сложным в понимании, где, вполне возможно, что выигрыш от такой оптимизации за ближайшую сотню лет будет меньше чем программист потратит времени на эту самую оптимизацию?

P.S. Вы не пробували писать весь код без переводов строк и пробелов? Говорят исходники занимают меньше места  smile 
PM MAIL   Вверх
alexadr
Дата 19.8.2008, 13:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

Репутация: 4
Всего: 4



Цитата(SoulKeeper @  19.8.2008,  11:12 Найти цитируемый пост)
Да и в подавляющем большинстве случаев корень зла кроется именно в не оптимальном алгоритме работы, т.к. при серьезной нагрузке (базы данных, клиент-сервер, прочее) выигрыш составит около1-2% в лучшем случае. 

+1

От себя добавляю, что темой оптимизации заниается сама JVM, это в первых версиях был "простенький" интерпретатор, сейчас же она много чего стала уметь, - как например преобразование каких-то методов в статик. Сейчас ОЧЕНЬ многое оптимизируется JVM-ом на лету.
PM MAIL   Вверх
Lisus
Дата 19.8.2008, 16:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 93
Регистрация: 21.10.2007

Репутация: нет
Всего: 2



Хорошо, пробуем по другом.

Есть самопальное дерево. Примерно состоит из 100...00 единиц узлов.
Сделал рекуррентный проход по дереву где метод рекурсии был методом дерева.

Я попробовал по другому, сделал метод рекурсии методом Узла. Разница оказалась 15%. И это эффективная разница, т.е. кроме рекурсии в методе ещё и операции были.

Оно конечно и понятно, что быстрее. 

Для того, чтобы понять нужна ли оптимизация, нужно знать сколько она может дать, т.е. нужны данные, которые я хочу от вас получить.
Если замена типа метода даст выигрыш 15-20 процентов - это одно, а если 1% - это другое.

Заранее исключаю просчеты в общем алгоритме. Со стратегией все хорошо, мне нужна тактика.
PM MAIL   Вверх
SoulKeeper
Дата 19.8.2008, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 375
Регистрация: 14.1.2007
Где: Ukraine, Lviv.

Репутация: 11
Всего: 15



Lisius, выигрыш будет заметно меньше чем от оптимизации аллгоритма...

Код

public class StaticMethodTest {

  public static int ITERATION_COUNT;

  public int x;

  public int y;

  public int z;

  public void calc() {
    setZ(getX() + getY());
  }

  public int getX() {
    return x;
  }

  public void setX(int x) {
    this.x = x;
  }

  public int getY() {
    return y;
  }

  public void setY(int y) {
    this.y = y;
  }

  public int getZ() {
    return z;
  }

  public void setZ(int z) {
    this.z = z;
  }

  public static void calc(StaticMethodTest object) {
    object.z = object.x + object.y;
  }

  public static void main(String[] args) {

    ITERATION_COUNT = Integer.MAX_VALUE;

    System.out.println("Running static test");
    runStaticTest();
    System.out.println("Running not static test");
    runTest();
  }

  private static void runStaticTest() {
    for (int q = 0; q < 5; q++) {
      long time = System.currentTimeMillis();

      StaticMethodTest test = new StaticMethodTest();
      for (int i = 0; i < ITERATION_COUNT; i++) {
        calc(test);
      }

      System.out.println(System.currentTimeMillis() - time);
    }
  }

  private static void runTest() {
    for (int q = 0; q < 5; q++) {
      long time = System.currentTimeMillis();

      StaticMethodTest test = new StaticMethodTest();
      for (int i = 0; i < ITERATION_COUNT; i++) {
        test.calc();
      }

      System.out.println(System.currentTimeMillis() - time);
    }
  }
}


Это сообщение отредактировал(а) SoulKeeper - 19.8.2008, 17:58
PM MAIL   Вверх
alexadr
Дата 19.8.2008, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 25.9.2006

Репутация: 4
Всего: 4



Я правда примерно об этом уже говорил, но повторюсь: HotSpot из вот такого куска кода:

Код

public void someMethod() {
    System.out.println("someMethod");
}

public void otherMethod() {
    System.out.println("otherMethod start");
    someMethod();
    System.out.println("otherMethod end");
}


сделает в рантайме примерно вот это:
Код

public void otherMethod() {
    System.out.println("otherMethod start");
    System.out.println("someMethod");
    System.out.println("otherMethod end");
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
javastic
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux, javastic.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0526 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.