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

Поиск:

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


Эксперт
****


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

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



Программа:
Код


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Test extends JFrame implements ActionListener
{
   private JButton repaint;
   private JButton turnOff;
   private MyPanel area;
   public Test()
   {
       setSize(700, 500);
       Container cp = getContentPane();
       repaint = new JButton("Repaint");
       repaint.addActionListener(this);
       turnOff = new JButton("Turn repainting off");
       turnOff.addActionListener(this);
       area = new MyPanel();
       cp.add(repaint, BorderLayout.NORTH);
       cp.add(area, BorderLayout.CENTER);
       cp.add(turnOff, BorderLayout.SOUTH);
       setDefaultCloseOperation(EXIT_ON_CLOSE);
       setLocationRelativeTo(null);
       setResizable(false);
       setVisible(true);
   }
   
   public static void main(String [] args)
   {
       new Test();
   }
   
   public void actionPerformed(ActionEvent ae)
   {
       if (ae.getSource() == repaint)
       {
           area.repaint();
           System.out.println("Mouse button clicked at " + new java.util.Date());
       }
       else if (ae.getSource() == turnOff)
       {
       }
   }
}

class MyPanel extends JPanel
{
   private Color color;
   private int red, green, blue;
   
   public void paint(Graphics g)
   {      
       red = (red > 200) ? 0 : red + (int) (Math.random() * 40);
       green = (green > 200) ? 0 : green + (int) (Math.random() * 40);
       blue = (blue > 200) ? 0 : blue + (int) (Math.random() * 40);
       color = new Color(red, green, blue);
       g.setColor(color);
       g.fillOval(getWidth() >> 1, getHeight() >> 1, 100, 80);      
   }
}

chto нужно добавить чтобы при нажатии кнопки "Repaint" прекратилась прорисовка овала? Нужно
выключить только repaint события (то есть posle нажатиja на "Turn repainting off" овал не прорисовывается, но дата в консоль выводится esli nazhimat' "Repaint"). Можно:
1. добавлять код в
Код

       else if (ae.getSource() == turnOff)
       {
              // sjuda
       }

2. создавать другие классы
Менять код в программе нельзя.

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


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

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


Эксперт
****


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

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



sad.gif
Ответ простоu:

Код

...
       else if (ae.getSource() == turnOff)
       {
           NullRepainter.install();
       }

...
class NullRepainter extends RepaintManager
{
   public static void install()
   {
       RepaintManager rm = new NullRepaint();
       RepaintManager.setCurrentManager(rm);
   }
   
   public void addInvalidComponent(JComponent c)
   {}
   
   public void addDirtyRegion(JComponent c, int x, int y, int w, int h)
   {}
   
   public void markCompletelyDirty(JComponent c)
   {}
   
   public void paintDirtyRegions()
   {}
}



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

PM   Вверх
Domestic Cat
Дата 12.7.2004, 15:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Код

public class Test
{
   public static void main(String [] arguments)
   {
       String string1 = new String("qwerty");
       String string2 = new String("qwerty");
       // ?
       // ?
       System.out.println(string1 == string2);
   }
}


Какие 2 строки нужно добавить чтобы получить в результате true?
Приравнивать string1 i string2 нельзя.


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

PM   Вверх
Domestic Cat
Дата 12.7.2004, 15:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Имеется в виду, что нельзя использовать выражения типа
Код

string1 = string2;

и
Код

String string3 = string1;
string2 = string3;



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

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


Account removed
***


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

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



Код

      string1 = string1.intern();
      string2 = string2.intern();
?


--------------------
Account removed
PM MAIL   Вверх
Domestic Cat
Дата 12.7.2004, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Согласен biggrin.gif




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

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


Эксперт
****


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

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



А как узнать сколько было создано обьектов класса Float и Integer после выполнении этоu программы:
Код

public class Test
{
   public static void main(String [] arguments)
   {
       int numIter = (int)(Math.random() * 1000);
       for (int i = 0; i < numIter; i++)
       {
           double random = Math.random();
           if (random < 0.5)
           {
               new Float(1);
           }
           else
           {
               new Integer(1);
           }
       }
   }
}



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

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


Эксперт
****


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

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



Ответ опять простой :

java -Xaprof Test

- выдаст количество созданных объектов каждого класса (за все время выполнения программы) и занятое ими место.




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

PM   Вверх
Domestic Cat
Дата 14.7.2004, 15:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Простой бенчмарк:

Код

public class Test
{
   public static void method()
   {
   }
           
   public static void runTest()
   {
       long before;
       long after;
       before = System.currentTimeMillis();
       for (int index = 0; index < 1*1000*1000; index += 1)
       {
       }
       after = System.currentTimeMillis();
       long loopTime = after - before;
       System.out.println("Loop time: " +
                       Long.toString(loopTime) +
                       " milliseconds");
       before = System.currentTimeMillis();
       for (int index = 0; index < 1*1000*1000; index += 1)
       {
           method();
       }
       after = System.currentTimeMillis();
       long methodTime = after - before;
       System.out.println("Method time: " +
                           Long.toString(methodTime) +
                           " milliseconds");
       System.out.println("Method time - Loop time: " +
                           Long.toString(methodTime - loopTime) +
                           " milliseconds");
   }
   public static void main(String[] arg)
   {
       runTest();
   }
}


Частенько я получаю нечто наподобие:

Loop time: 22 milliseconds
Method time: 17 milliseconds
Method time - Loop time: -5 milliseconds

Почему пустoй цикл медленнее чем цикл с вызовом метода ? biggrin.gif biggrin.gif

Еще интереснее станет если изменить метод, например
Код

   public static void method(int x)
   {
         int y = x + 100;
   }

Опять получаем:

Loop time: 22 milliseconds
Method time: 16 milliseconds
Method time - Loop time: -6 milliseconds

Почему цикл с вызовом непустого метода быстрее пустого цикла?

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


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

PM   Вверх
Domestic Cat
Дата 15.7.2004, 15:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Чуствую приходит шизофрения: сам спрашиваю, сам себе же и отвечаю adv/57.gif


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

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


Leprechaun Software Developer
****


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

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



Результат довольно нестабильный, после 3-4 запуско все становится на свои места. Я думаю все дело в JIT. Если запускать с -Xint, то loop всегда меньше.


--------------------
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
Дата 15.7.2004, 20:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



biggrin.gif Да, это дело рук JIT. Если бы method например возвращал константу, то JIT перенес бы тело метода внутрь цикла (method inlining) и таким образом устранил лишний вызов метода. (Если бы метод не был static, и от класса Test наследовал бы другой класс, то JIT бы сделать этого уже не мог).
Здесь в обеих случаях method фактически ничего не делает, поэтому JIT делает инлайнинг метода, то есть оба цикла после компиляции оказываются пустыми, а значит и время выполнения
должно быть одинаковым. То, что оно разное обусловлено случайными факторами.


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

PM   Вверх
Domestic Cat
Дата 16.7.2004, 15:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну это совсем уж просто.
Для записи объекта используем сериализацию:
Код

import java.io.*;
public class Test
{
   public static void main(String [] args) throws Exception
   {
       if (args[0].equals("-r"))
       {
           MyObject mo;
           FileInputStream fis = new FileInputStream("object.ser");
           ObjectInputStream ois = new ObjectInputStream(fis);
           mo = (MyObject) ois.readObject();
           ois.close();
           System.out.println(mo.name);
       }
       else if (args[0].equals("-w"))
       {
           MyObject mo = new MyObject();
           FileOutputStream fos = new FileOutputStream("object.ser");
           ObjectOutputStream oos = new ObjectOutputStream(fos);
           oos.writeObject(mo);
           oos.close();
       }
       else return;
   }
}

class MyObject implements Serializable
{
   public String name = "Name";
}


1. Предположим я сохраню 1000 обьектов, после чего может оказаться что нужно добавить новое поле в класс MyObject. После добавления нового поля при попытке чтения ранее сохраненных объектов я получу InvalidClassException. Как обеспечить совместимость версий?

2. Предположим я сохраняю объект в фаил описанным выше методом. Любой злонамеренный
товариш теперь может открыть этот фаил в текстовом редакторе и исправить все что нужно:

Содержимое : srMyObjectLnametjava/lang/String;xptName

Исправлено: srMyObjectLnametjava/lang/String;xptFame

Как предотвратить такую возможность в рамках той же сериализации?

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


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

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


Опытный
**


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

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



Что можно менять/добавлять?

Отвечать сразу или подождать вариантов? smile.gif

Это сообщение отредактировал(а) DarkDS - 16.7.2004, 17:32
PM MAIL   Вверх
Domestic Cat
Дата 16.7.2004, 17:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Ну, здесь можно делать с классом MyObject все что хотите smile.gif


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

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

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

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


 




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


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

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