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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Маленький тест, :) 
:(
    Опции темы
Domestic Cat
Дата 7.7.2004, 15:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Данную программу можно "ускорить" на 30%(на Маке; на Wиндах может быт меньше). Как?:
Код

public class Test
{
   public static void main(String[] args)
   {
       double y = 10.456;
       double w = 0.45;
       double result = 0;
       for (int j = 0; j < 10000000; j++)
       {
           result = 0;
           for(int i = 1; i < 100; i++)
           {
               result += y + w;
           }
       }
       System.out.println(result);
   }
}

Mozhno добавлять поля, умножение, деление и кастинг.

PS. Vnutri ciklov nichego ne menjat'. Tochnost' derzhat' do 3x znakov posle zapjatoj.

Это сообщение отредактировал(а) Domestic Cat - 7.7.2004, 15:59


--------------------

PM   Вверх
AntonSaburov
Дата 7.7.2004, 16:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Вот такой вариант у меня получился smile.gif
При этом скорость выросла на вскидку раза в 4-5 под Виндой.

Код

public class Test
{
  public static void main(String[] args)
  {
      int y = 10456;
      int w = 450;
      int result = 0;
      for (int j = 0; j < 10000000; j++)
      {
          result = 0;
          for(int i = 1; i < 100; i++)
          {
              result += y + w;
          }
      }
      System.out.println(((float)result)/1000);
  }
}

PM MAIL WWW ICQ   Вверх
Domestic Cat
Дата 7.7.2004, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



biggrin.gif

Более обwиu вариант
Код

class Test
{
   private static final int SCALE = 1 << 16; // int is 32-bit
   
   public static void main(String[] args)
   {
       int y = (int)(10.456 * SCALE);
       int w = (int)(0.45 * SCALE);
       int result = 0;
       for (int j = 0; j < 10000000; j++)
       {
           result = 0;
           for(int i = 1; i < 100; i++)
           {
               result += y + w;
           }
       }
       System.out.println((float)result / SCALE);
   }
}


4-5 raz - WOW

Это сообщение отредактировал(а) Domestic Cat - 7.7.2004, 16:10


--------------------

PM   Вверх
AntonSaburov
Дата 7.7.2004, 16:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Штурман
****


Профиль
Группа: Модератор
Сообщений: 5658
Регистрация: 2.7.2002
Где: Санкт-Петербург

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



Цитата
4-5 raz - WOW

Через java -Xprof Test получил

1.9 и 11.6 секунд.
PM MAIL WWW ICQ   Вверх
Domestic Cat
Дата 7.7.2004, 16:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



java -Xprof Test

Удобная штука - показывает сколько времени потрачено на выполнение,
плюс на каждый метод отдельно (в %)

//

Pochti 10 raz biggrin.gif biggrin.gif biggrin.gif

Это сообщение отредактировал(а) Domestic Cat - 7.7.2004, 17:17


--------------------

PM   Вверх
DarkDS
Дата 7.7.2004, 16:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Цитата(Domestic @ 7.7.2004, 15:23)
Цитата
Оффтоп.
Подобная тема уже поднималась. Я как то объяснял уже один из вариантов


Я чего-то не понял. Там же о создании обэцктов при заранее неизвестном названии класса ?

Так "механизм плюгинов" как раз такой и есть smile.gif)
PM MAIL   Вверх
Domestic Cat
Дата 7.7.2004, 16:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



ОК smile.gif

1. Kstati: известно что есть две части хипа: "молодоu" хип (young heap) и "старыu" (tenure heap). Как узнать сколько раз в течение времени выполнения был запушен сборшик мусора,
сколько он собрал на каждоu части хипа, и сколько времени он потратил?

2. Сборка мусора в старом хипе длится на 1-2 порядка дольше. Если программа
создаeт много обeктов (3D шутер скажем), то это будет давать лаг.
Как минимизировать сборку мусора на старом хипе?


--------------------

PM   Вверх
LSD
Дата 7.7.2004, 19:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Как создать экземпляр класса в Runtime я представляю, у меня вопрос в том как это класс загрузить если он не был прописан в CLASSPATH и как определить тот ли это класс что я ищу (реализует ли он необходимый интерфейс) не загружая этот класс.
Со воторым вопросом можно разобраться потребовав прописать в mainfest нужный класс. Но вот как сделать так чтобы SystemClassLoader загружал файлы из данного jar? Если использовать вариант Domestic Cat с URLClassLoader, то придется предварительно грузить все классы из jar-а, иначе при запуске плагина он может не обнаружить некоторых классов. Это не желательно по тому что плагин может и не использоваться, кроме как получить его имя и показать новый пункт меню, и тогда все эти классы не нужны.

У меня вопрос такой Domestic Cat написал программу которая показывает все Thread-ы, созданные "нормальным" образом, а как ее можно обмануть? Т.е. запустить в той же JVM Thread так чтобы она его не увидела?



--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Domestic Cat
Дата 7.7.2004, 19:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



LSD, может тебе в сторону Avalon посмотреть (http://avalon.apache.org/) ? Я не работал с ним, но говорят что-то подобное
делает:
Цитата
To use it, you place your common jar files into a directory that functions as the repository. You then create these property files that end with .meta and place them into the repository. You create an instance of the InitialContext class that requires a path to the repository.
You use the context to request "Artifacts" from the repository. The name of the artifact corresponds to a .meta file. It reads the .meta file, creates the classloader and loads the jars listed in the .meta file.

There are code examples that you should be able to follow. However there is one very important item not documented. When you download the repository jars, do not place all of them into the application's class path. Only put the avalon-repository-main in the application's classpath. The other jars go into the repository. The main jar is a boot jar. It loads the others from the repository.

Nu а чтобы обмануть программу, нужно написать сабкласс ThreadGroup и сделать override метода
activeCount()

Код

public class Test
{
   public static void main(String [] args)
   {
       MyGroup trick = new MyGroup();
       Invisible oops = new Invisible(trick);
       Invisible oops1 = new Invisible(trick);
       ThreadGroup root = Thread.currentThread().getThreadGroup().getParent();
       while (root.getParent() != null)
       {
           root = root.getParent();
       }
       visit(root, 0);
   }
   public static void visit(ThreadGroup group, int level)
   {
       int numThreads = group.activeCount();
       Thread[] threads = new Thread[numThreads * 2];
       numThreads = group.enumerate(threads, false);
       for (int i = 0; i < numThreads; i++)
       {
           Thread thread = threads[i];
           System.out.println(thread.getName());
       }
       int numGroups = group.activeGroupCount();
       ThreadGroup[] groups = new ThreadGroup[numGroups * 2];
       numGroups = group.enumerate(groups, false);
       for (int i = 0; i < numGroups; i++)
       {
           visit(groups[i], level + 1);
       }
   }
}

class Invisible extends Thread
{
   Invisible(MyGroup trick)
   {
       super(trick, "");
       start();
   }
   public void run()
   {
       while(true)
       {
             // doing something
       }
   }
}

class MyGroup extends ThreadGroup
{
   public MyGroup()
   {
       super("MyGroup");
   }
   
   public int activeCount()
   {
       return 0;
   }
}



--------------------

PM   Вверх
LSD
Дата 7.7.2004, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Хорошее решение я пошел более радикальным путем, без субклассов.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Domestic Cat
Дата 7.7.2004, 20:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Цитата
Хорошее решение я пошел более радикальным путем, без субклассов.

А каким, интересно? smile.gif


--------------------

PM   Вверх
DarkDS
Дата 7.7.2004, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник Клуба
Сообщений: 748
Регистрация: 6.5.2003
Где: Таллинн, Эстония

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



Цитата(LSD @ 7.7.2004, 19:13)
Это не желательно по тому что плагин может и не использоваться, кроме как получить его имя и показать новый пункт меню, и тогда все эти классы не нужны.

Эта... Кстати... Создай по этому тему... тама и пообсуждаем smile.gif
PM MAIL   Вверх
Domestic Cat
Дата 7.7.2004, 20:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



Опять флууудим-с ? biggrin.gif
Добавлено @ 20:47
Вопрос про хип не закрыт smile.gif

Это сообщение отредактировал(а) Domestic Cat - 7.7.2004, 20:46


--------------------

PM   Вверх
LSD
Дата 7.7.2004, 21:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Leprechaun Software Developer
****


Профиль
Группа: Модератор
Сообщений: 15718
Регистрация: 24.3.2004
Где: Dublin

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



Цитата(Domestic @ 7.7.2004, 20:29)
А каким, интересно?  smile.gif

Я использовал приватный конструктор ThreadGroup. Хотя тут могут быть проблемы с SecurityManager.
Цитата
Эта... Кстати... Создай по этому тему... тама и пообсуждаем

Я пока гляну на Avalon, а там если будут вопросы или не понравиться создам.


--------------------
Disclaimer: this post contains explicit depictions of personal opinion. So, if it sounds sarcastic, don't take it seriously. If it sounds dangerous, do not try this at home or at all. And if it offends you, just don't read it.
PM MAIL WWW   Вверх
Domestic Cat
Дата 8.7.2004, 16:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5452
Регистрация: 3.5.2004
Где: Dallas, US

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



1. Чтобы узнать о том, что делал сборщик мусора (=gc), нужно запустить программу с
опцией -verbose:gc
Типичный результат будет таким:
Цитата

[GC 926K->592K(1984K), 0.0133686 secs]
[GC 1103K->692K(1984K), 0.0586286 secs]
[GC 1203K->1000K(1984K), 0.0138741 secs]
[GC 1490K->1412K(1984K), 0.0071983 secs]
[GC 1924K->1837K(2368K), 0.0060598 secs]
[Full GC 1837K->1250K(2368K), 0.3012520 secs]
[GC 1757K->1633K(2664K), 0.0056265 secs]
[GC 2133K->2052K(2664K), 0.0044287 secs]
[GC 2564K->2356K(2920K), 0.0059645 secs]
[Full GC 2356K->2131K(2920K), 0.1983004 secs]
...

(если сборки мусора не было, то ничего он не выдаст конечно)
GC обозначает сборку на молодом хипе, Full GC - на старом; далее идет : [размер хипа до -> размер после (общий размер хипа), вреня потраченное на сборку]
Как видим, сборка на старом хипе заняла в 10 раз больше времени чем на молодом -
правда комп был в плохом настроении, обычно в этом же шутере сборка длится в 10 раз
быстрее на обеих частях хипа.
Более подробную инфу осборке можно получить так: -XX:+PrintGCDetails:

Цитата

[GC [DefNew: 511K->64K(576K), 0.0122158 secs] 926K->592K(1984K), 0.0123501 secs]
[GC [DefNew: 575K->64K(576K), 0.0173724 secs] 1104K->691K(1984K), 0.0174782 secs]
[GC [DefNew: 574K->64K(576K), 0.0141866 secs] 1202K->1009K(1984K), 0.0142940 secs]
[GC [DefNew: 558K->63K(576K), 0.0072319 secs] 1504K->1426K(1984K), 0.0073383 secs]
[GC [DefNew: 575K->64K(576K), 0.0059967 secs][Tenured: 1789K->1262K(1792K), 0.1463170 secs] 1938K->1262K(2368K), 0.1570296 secs]
[GC [DefNew: 506K->64K(576K), 0.0049062 secs] 1768K->1644K(2680K), 0.0050128 secs]


DefNew соответствует молодому хипу, Tenured - старому.
Длительность сборки зависит от размера хипа, поскольку молодой хип меньше, то и убирается он быстрее. Все созданные обьекты попадают сначала на молодой хип; если в течение некоторого времени они все еще нужну, они перемещаются на старый хип.


--------------------

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

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

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


 




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


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

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