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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> что работает быстрее? оптимизация, и всё с ней связанное. 
:(
    Опции темы
polosatij
  Дата 26.11.2004, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

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



и всё с ней связанное:
народ! нужна информация по оптимизации smile

например, кто скажет, что работает быстрее:

Vector() или ArrayList() smile
может есть что-то другое, побыстрее?

например, на

http://forum.vingrad.ru/index.php?showtopic=24799&st=90

нашёл очень полезную для меня инфо.

Еще цитируя Domestic Cat:

Цитата(Domestic @ 8.7.2004, 17:33)
Не претендую на абсолютную истину, но попробую.

Не оптимизируйте! Пишите программы, которые понятны, легко дебагить и модифицировать.

На самом деле конечно оптимизировать нужно. Чтобы понять что оптимизировать, помните,
что в основном нагрузка приходится на 10-20% кода. Узнать какой метод наиболее задействован
мозжно, запустив с флагом -Xprof.

На самом деле HotSpot и JIT (Just-In-Time Compiler) делают большую работу по оптимизации. Можно легко найти инфо по этому вопросу. В целом же оптимизация программы программистом сводится к:

1. Использованию оптимальных алгоритмов. Например, для быстрого поиска используйте
HashMap, он быстрее чем, скажем TreeMap.

2. Старайтесь использоват побитовые операции. Вместо х/32 луче использоват х >> 5; вместо
х % 32 - х & 31 (31 = 32 - 1). Работает только для степеней 2.

3. Заменяйте умножение на суммирование, возведение в степень - на умножение.

4. Используйте готовые таблицы значений. Например, если нужно считать синус/косинус и
большая точность вычислений не нужна, используйте готовую таблицу для синуса.

5.Заменяйте операции с float, double на операции с int и делайте кастинг назад в float (тут на предыдущей странице пример есть )

6. Используйте Buffered{}Stream

7. Если нужен рандом -доступ к большим файлам (несколько мб), используйте memory-mapped files (см MappedByteBuffer в Java API). Программа может читать из MappedByteBuffer почти так же быстро, как из памяти.

http://forum.vingrad.ru/index.php?showtopic=24799&st=105



может еще кто что подскажет на это тему smile

Domestic Cat, я не совсем понял, что ты подразумеваешь под:

6. Используйте Buffered{}Stream

не объяснишь?

ещё на эту тему:

Код

MyDialog dial= new MyDialog(new Frame(), "title", true);

....

class MyDialog extens Dialog{
 ...
}


млин! у меня большая проблема с передачей Диалогу: new Frame(). У меня такое ощушение, что new Frame() ест очень много памяти! из за этого похоже.. если я быстро вызываю новый Диалог (скажим, 2 раза подряд), всё моё приложение зависает на вечность smile

если я передаю в Диалог -> null, то получаю исключение: nullOwnerException.
есть ли другие методы smile


заранее БОЛЬШОЕ паси smile



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


Опытный
**


Профиль
Группа: Участник
Сообщений: 547
Регистрация: 7.1.2004
Где: Москва

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



Buffered{}Stream = BufferedInputStream || BufferedOutputStream

ну буффер у них там есть - что тут еще скажешь :

...an application can write bytes to the underlying output stream without necessarily causing a call to the underlying system for each byte written.



--------------------
Имею Мнение Хрен Оспоришь   
PM MAIL ICQ   Вверх
Domestic Cat
Дата 26.11.2004, 17:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
Vector() или ArrayList() 
может есть что-то другое, побыстрее?


ArrayList почти тo ж самоe что i Vector, только несинхронизованный. Следовательно, он быстрее.

Цитата
6. Используйте Buffered{}Stream

не объяснишь?


Буффированный стрим пишет(читает) сначала в буфер, когдa буфер заполняется, sодержимое передается системе. это быстрее, чем передавать системе каждый байт. все этo в апи ест:
Цитата
The class implements a buffered output stream. By setting up such an output stream, an application can write bytes to the underlying output stream without necessarily causing a call to the underlying system for each byte written.


Цитата
млин! у меня большая проблема с передачей Диалогу: new Frame(). У меня такое ощушение, что new Frame() ест очень много памяти! из за этого похоже.. если я быстро вызываю новый Диалог (скажим, 2 раза подряд), всё моё приложение зависает на вечность 


U диалогa должен быть владелец - другой диалог или фрейm. Передавaй ему ссылку на уже имеющийся фрейм / диалоg или пользуйся чем либо другим JOptionPane, JWindow


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

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


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

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



Цитата(Domestic @ 26.11.2004, 17:12)
U диалогa должен быть владелец - другой диалог или фрейm. Передавaй ему ссылку на уже имеющийся фрейм / диалоg или пользуйся чем либо другим JOptionPane, JWindow


я javax.swing.*; не могу использовать..

у меня нет имеюшегося Фрэйма -> Applett.
А Аплет не может выступить "прородичем" smile



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


Эксперт
****


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

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



Значит, передавай всем диалогам ссылку нa один и тот же фрейм:

Код

Frame frame = new Frame();
MyDialog dial= new MyDialog(frame, "title", true);
MyDialog dial2= new MyDialog(frame, "title", true);



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

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


Опытный
**


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

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



Цитата(polosatij @ 26.11.2004, 16:38)
и всё с ней связанное:
народ! нужна информация по оптимизации smile

например, кто скажет, что работает быстрее:

Vector() или ArrayList() smile
может есть что-то другое, побыстрее?

например, на

http://forum.vingrad.ru/index.php?showtopic=24799&st=90

нашёл очень полезную для меня инфо.

Еще цитируя Domestic Cat:

Цитата(Domestic @ 8.7.2004, 17:33)
Не претендую на абсолютную истину, но попробую.

Не оптимизируйте! Пишите программы, которые понятны, легко дебагить и модифицировать.

На самом деле конечно оптимизировать нужно. Чтобы понять что оптимизировать, помните,
что в основном нагрузка приходится на 10-20% кода. Узнать какой метод наиболее задействован
мозжно, запустив с флагом -Xprof.

На самом деле HotSpot и JIT (Just-In-Time Compiler) делают большую работу по оптимизации. Можно легко найти инфо по этому вопросу. В целом же оптимизация программы программистом сводится к:

1. Использованию оптимальных алгоритмов. Например, для быстрого поиска используйте
HashMap, он быстрее чем, скажем TreeMap.

2. Старайтесь использоват побитовые операции. Вместо х/32 луче использоват х >> 5; вместо
х % 32 - х & 31 (31 = 32 - 1). Работает только для степеней 2.

3. Заменяйте умножение на суммирование, возведение в степень - на умножение.

4. Используйте готовые таблицы значений. Например, если нужно считать синус/косинус и
большая точность вычислений не нужна, используйте готовую таблицу для синуса.

5.Заменяйте операции с float, double на операции с int и делайте кастинг назад в float (тут на предыдущей странице пример есть )

6. Используйте Buffered{}Stream

7. Если нужен рандом -доступ к большим файлам (несколько мб), используйте memory-mapped files (см MappedByteBuffer в Java API). Программа может читать из MappedByteBuffer почти так же быстро, как из памяти.

http://forum.vingrad.ru/index.php?showtopic=24799&st=105



может еще кто что подскажет на это тему smile

Domestic Cat, я не совсем понял, что ты подразумеваешь под:

6. Используйте Buffered{}Stream

не объяснишь?

ещё на эту тему:

Код

MyDialog dial= new MyDialog(new Frame(), "title", true);

....

class MyDialog extens Dialog{
 ...
}


млин! у меня большая проблема с передачей Диалогу: new Frame(). У меня такое ощушение, что new Frame() ест очень много памяти! из за этого похоже.. если я быстро вызываю новый Диалог (скажим, 2 раза подряд), всё моё приложение зависает на вечность smile

если я передаю в Диалог -> null, то получаю исключение: nullOwnerException.
есть ли другие методы smile


заранее БОЛЬШОЕ паси smile

я несколько не понял цитаты DomestikCat - по поводу арифметики. - я всегда считал и считаю что мат. сопроцессор, который теперь есть везде, в любом ядре любого процессора на ПС будет гораздо лучше меня вычислять умножения (нет, не степени 2-ки - хотя и там оптимизация есть!), деления, и тем паче синусы и пр. тригонометрию. На самом деле мат. сопр - если разбираться в его кишках - в основном через таблицы и действует, редко когда через алгоритмы. но даже если через алгоритмы - это все равно будет быстрее доступа до элемента массива на J ИМХО конечно.
т.е. эту цитату можно воспринимать как - "JVM не использует мат сопроцессор"?????
Не, правда - для меня это будет открытием.



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 26.11.2004, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
На самом деле мат. сопр - если разбираться в его кишках - в основном через таблицы и действует, редко когда через алгоритмы. но даже если через алгоритмы - это все равно будет быстрее доступа до элемента массива на J ИМХО конечно.


Дело здесь в том, что если считаешь sin/cos в Java, тo обрашется она к нативным функциям. Просмотреть значние в "своем" массиве будет быстрее, тем более еслi не нужна большая точн ость.


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

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


Опытный
**


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

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



Цитата(Domestic @ 26.11.2004, 19:57)
Цитата
На самом деле мат. сопр - если разбираться в его кишках - в основном через таблицы и действует, редко когда через алгоритмы. но даже если через алгоритмы - это все равно будет быстрее доступа до элемента массива на J ИМХО конечно.


Дело здесь в том, что если считаешь sin/cos в Java, тo обрашется она к нативным функциям. Просмотреть значние в "своем" массиве будет быстрее, тем более еслi не нужна большая точн ость.

эээ ... разве 4-5 тактов процессора быстрее доступа к элементу массива в J (нет, я правда не знаю - но сопр за 4-5 тактов любую операцию сделает).
Добавлено @ 20:21
Цитата(Sleepy_PIP @ 26.11.2004, 20:16)
Цитата(Domestic @ 26.11.2004, 19:57)
Цитата
На самом деле мат. сопр - если разбираться в его кишках - в основном через таблицы и действует, редко когда через алгоритмы. но даже если через алгоритмы - это все равно будет быстрее доступа до элемента массива на J ИМХО конечно.


Дело здесь в том, что если считаешь sin/cos в Java, тo обрашется она к нативным функциям. Просмотреть значние в "своем" массиве будет быстрее, тем более еслi не нужна большая точн ость.

эээ ... разве 4-5 тактов процессора быстрее доступа к элементу массива в J (нет, я правда не знаю - но сопр за 4-5 тактов любую операцию сделает).

тоесть я хотел сказать - это реально проверяли? и доступ к массиву быстрее сопроцессора?
если действительно так - может JVM просто сопроцессор не использует?
Я правда не знаю и интересуюсь ...


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 26.11.2004, 20:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
эээ ... разве 4-5 тактов процессора быстрее доступа к элементу массива в J (нет, я правда не знаю - но сопр за 4-5 тактов любую операцию сделает).


сaм ВЫЗОВ нативноgo метоda медленнее smile
Добавлено @ 20:23
Цитата
тоесть я хотел сказать - это реально проверяли? и доступ к массиву быстрее сопроцессора?
если действительно так - может JVM просто сопроцессор не использует?
Я правда не знаю и интересуюсь ...


могем и бенчмарк забацать ... после перекурa =)


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

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


Опытный
**


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

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



Цитата(Domestic @ 26.11.2004, 20:22)
Цитата
эээ ... разве 4-5 тактов процессора быстрее доступа к элементу массива в J (нет, я правда не знаю - но сопр за 4-5 тактов любую операцию сделает).


сaм ВЫЗОВ нативноgo метоda медленнее smile

нее, погоди. я опять не понял. Если байт-код синуса не транслируется JVM в непосредственную команду сопроцессора - то так и будет.
Дело в том, что речь насколько я надеюсь не о найтивных методах - а о ASM командах сопроцессору.
Если JVM действительно транслирует вызовы скажем тригонометрии в вызовы какой-либо библиотеки - то да, но если напрямую в команду сопроцессора - то сопроцессор должен быть быстрее всех ...
Вообщем пошел проверять smile ... Спасибо!


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 26.11.2004, 20:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Вот такоj тест:

Код

// B.java
public class B
{  
   public static void main(String[] args)    
   {
       long t1 = System.currentTimeMillis();
       for (int i = 0; i < 10000000; i++)
       {
           GameMath.cos(0.54231f);
       }
       long t2 = System.currentTimeMillis();
       System.out.println("First took " + (t2-t1) + " milliseconds");
       t1 = System.currentTimeMillis();
       for (int i = 0; i < 10000000; i++)
       {
           Math.cos(0.54231f);
       }
       t2 = System.currentTimeMillis();
       System.out.println("Second took " + (t2-t1) + " milliseconds");
   }
}

Код

// GameMath.java
public class GameMath
{

   private static final int TABLE_SIZE_BITS = 12;
   private static final int TABLE_SIZE = 1 << TABLE_SIZE_BITS;
   private static final int TABLE_SIZE_MASK = TABLE_SIZE - 1;
   private static final int HALF_PI = TABLE_SIZE / 4;
   private static final float CONVERSION_FACTOR =
       (float)(TABLE_SIZE / (2 * Math.PI));

   private static float[] sinTable;

   static
   {
       init();
   }

   private static void init()
   {
       sinTable = new float[TABLE_SIZE];
       for (int i=0; i<TABLE_SIZE; i++)
       {
           sinTable[i] = (float)Math.sin(i / CONVERSION_FACTOR);
       }
   }
   
   public static float cos(float angleInRadians)
   {
       return cos(angleConvert(angleInRadians));
   }
   
   public static float cos(int angle)
   {
       return sinTable[(HALF_PI-angle) & TABLE_SIZE_MASK];
   }
   
   public static float cos(float dy, float hypo)
   {
       return dy / hypo;
   }

   public static float sin(float dx, float hypo)
   {
       return dx / hypo;
   }
   
   public static float sin(float angleInRadians)
   {
       return sin(angleConvert(angleInRadians));
   }
   
   public static float sin(int angle)
   {
       return sinTable[angle & TABLE_SIZE_MASK];
   }

   public static int angleConvert(float angleInRadians)
   {
       return  (int)(angleInRadians * CONVERSION_FACTOR);
   }
}




Результаты 3x запусков:

Цитата
cat> java B
First took 669 milliseconds
Second took 3037 milliseconds
cat> java B
First took 672 milliseconds
Second took 3048 milliseconds
cat> java B
First took 761 milliseconds
Second took 3121 milliseconds


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


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

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


Опытный
**


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

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



Цитата(Domestic @ 26.11.2004, 20:50)
Вот такоj тест:

Код

// B.java
public class B
{  
   public static void main(String[] args)    
   {
       long t1 = System.currentTimeMillis();
       for (int i = 0; i < 10000000; i++)
       {
           GameMath.cos(0.54231f);
       }
       long t2 = System.currentTimeMillis();
       System.out.println("First took " + (t2-t1) + " milliseconds");
       t1 = System.currentTimeMillis();
       for (int i = 0; i < 10000000; i++)
       {
           Math.cos(0.54231f);
       }
       t2 = System.currentTimeMillis();
       System.out.println("Second took " + (t2-t1) + " milliseconds");
   }
}

Код

// GameMath.java
public class GameMath
{

   private static final int TABLE_SIZE_BITS = 12;
   private static final int TABLE_SIZE = 1 << TABLE_SIZE_BITS;
   private static final int TABLE_SIZE_MASK = TABLE_SIZE - 1;
   private static final int HALF_PI = TABLE_SIZE / 4;
   private static final float CONVERSION_FACTOR =
       (float)(TABLE_SIZE / (2 * Math.PI));

   private static float[] sinTable;

   static
   {
       init();
   }

   private static void init()
   {
       sinTable = new float[TABLE_SIZE];
       for (int i=0; i<TABLE_SIZE; i++)
       {
           sinTable[i] = (float)Math.sin(i / CONVERSION_FACTOR);
       }
   }
   
   public static float cos(float angleInRadians)
   {
       return cos(angleConvert(angleInRadians));
   }
   
   public static float cos(int angle)
   {
       return sinTable[(HALF_PI-angle) & TABLE_SIZE_MASK];
   }
   
   public static float cos(float dy, float hypo)
   {
       return dy / hypo;
   }

   public static float sin(float dx, float hypo)
   {
       return dx / hypo;
   }
   
   public static float sin(float angleInRadians)
   {
       return sin(angleConvert(angleInRadians));
   }
   
   public static float sin(int angle)
   {
       return sinTable[angle & TABLE_SIZE_MASK];
   }

   public static int angleConvert(float angleInRadians)
   {
       return  (int)(angleInRadians * CONVERSION_FACTOR);
   }
}




Результаты 3x запусков:

Цитата
cat> java B
First took 669 milliseconds
Second took 3037 milliseconds
cat> java B
First took 672 milliseconds
Second took 3048 milliseconds
cat> java B
First took 761 milliseconds
Second took 3121 milliseconds

ничего себе.
тоесть
Math.cos(0.54231f);
не транслируется в прямые вызовы сопроцессора. Так понять это?
как-же так ... обидно ужас ... сопр. есть, но не используется smile(. нет?
Добавлено @ 21:02
жаль что не прошли времена когда о математике надо было заботиться. и жаль что это теперь в J ... теперь надо быть осторожнее в 10 крат.
Спасибо!



--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
Domestic Cat
Дата 26.11.2004, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата
не транслируется в прямые вызовы сопроцессора. Так понять это?


JVM - это "надстройка " над ОС, напрямую она ничего не вызывает. smile

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


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

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


Опытный
**


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

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



Цитата(Domestic @ 26.11.2004, 21:09)
Цитата
не транслируется в прямые вызовы сопроцессора. Так понять это?


JVM - это "надстройка " над ОС, напрямую она ничего не вызывает. smile

да. мои заблуждения глубоки. учимся далше. ....


--------------------
--
Sleepy_PIP. Pavel Pryazhentsev (ex. 2:5020/141) "... Лучше быть нужным, чем
свободным ..."
PM MAIL ICQ   Вверх
polosatij
  Дата 26.11.2004, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1143
Регистрация: 22.2.2004
Где: Stuttgart<-> ;Karlsruhe, Germany

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



ещё один линк на тему оптимизации: smile

Оптимизация Java программ
Добавлено @ 21:59
вот, откопал то, что, наверно, не только мне одному интересно будет прочитать ( и не один раз )

Объекты

1. уменьшайте число временных объектов (в том числе внутри циклов);
2. по возможности используйте старые объекты, не создавайте новых;
3. контролируйте процесс создания объектов

* пишите простые конструкторы;
* используйте метод clone();
* используйте методы для создания объектов:
* public MyObject getInstance() { return new MyObject();}

String

1. используйте метод append() класса StringBuffer взамен конкантации строк;
2. используйте массив char[] array для создания строки, а не класс StringBuffer;
3. используйте запись String myString = "Hello!"; вместо String myString = new String("Hello!");
4. метод equalsIgnoreCase() работает быстрее, чем equals(), если длины строк не равны.

Поля классов и экземпляров классов

1. используйте ключевое слово final для создания неизменных объектов;
2. избегайте повторной инициализации полей экземпляра класса;
3. делайте методы static/private;
4. время, затраченное на вызов метода, оценивается примерно по следующей схеме: static < final < instance < interface метод < synchronized метод.

Память

1. используйте WeakReference для хранения элементов в больших таблицах;
2. используйте SoftReference для кэширования элементов;
3. используйте SoftReference для повторного использования памяти;
4. для замера времени исполнения фрагмента кода вызывайте System.gc();

Методы

1. не используйте без причины приведение типов;
2. не пишите громоздких методов;
3. операторы "n+=4" быстрее, чем "n=n+4";
4. оператор int++ быстрее, чем short++ or byte++;
5. избегайте деления переменных типа long;
6. используйте итерацию, а не рекурсию.

Синхронизация

1. по возможности избегайте синхронизации;
2. синхронизируйте блок, а не метод;
3. не используйте синхронизацию в циклах;
4. создавайте/используйте мониторы (Monitors) и мютексы (Mutex) взамен обыкновенной синхронизации.

Класс Doubles

1. Double.toString(double) метод – очень медленный;
2. не создавайте Double-объект из строки;

Общие советы

1. выполнение System.currentTimeMillis может занимать около 0.5ms;
2. научитесь понимать байт-код.

Это сообщение отредактировал(а) polosatij - 26.11.2004, 22:01


--------------------
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.0645 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


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

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