Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Как заставить JVM максимально загружать процессор?


Автор: cube 24.4.2008, 16:42
Мое приложение работает локально, и не оперирует с большим количеством данных!
Выполнение программы проходит медленно, а процессор загружен всего на каких-то 15-20 процентов, почему? в приложении использую потоки выполнение которых не зависит друг от друга

Как повысить скорость выполнения моего приложения?

Автор: barin_Student 24.4.2008, 16:45
Может вы пишете на диск многа данных?

Точнее работаете с дисками , пишете и читаете в файлы? 

Автор: LSD 24.4.2008, 16:50
Значит где-то эти потоки простаивают, например на IO или синхронизации.

Автор: cube 25.4.2008, 10:57
Не я не работаю с дисками, количество данных не столь велико, сам java процесс занимает какихто 20 кб в оперативной памяти... из io ну я использую только вывод на экран sout...

Всеравно непонятно, почему jvm не забивает процессор максимально...

Автор: LSD 25.4.2008, 12:52
Цитата(cube @  25.4.2008,  11:57 Найти цитируемый пост)
сам java процесс занимает какихто 20 кб в оперативной памяти...

Java не может занимать 20Кб, Hello World! занимает несколько мегабайт.


Цитата(cube @  25.4.2008,  11:57 Найти цитируемый пост)
из io ну я использую только вывод на экран sout...

Этого вполне достаточно.
Код

import java.util.Random;
import java.util.zip.Checksum;

public class Test
{
  public static void main(String[] args) throws Exception
  {
    byte[] data = new byte[1024 * 1024];
    new Random().nextBytes(data);

    CRC32 crc32 = new CRC32();
    while(true)
    {
      for(int i = 0; i < data.length; i++)
      {
        crc32.update(data[i]);
        System.out.println(i);
      }
      crc32.reset();
    }
  }

  public static class CRC32 implements Checksum
  {
    private static int[] crc_table = makeCrcTable();

    private int crc = 0;

    private static int[] makeCrcTable()
    {
      int[] crc_table = new int[256];
      for(int n = 0; n < 256; n++)
      {
        int c = n;
        for(int k = 8; --k >= 0;)
        {
          if((c & 1) != 0)
            c = 0xEDB88320 ^ (c >>> 1);
          else
            c = c >>> 1;
        }
        crc_table[n] = c;
      }
      return crc_table;
    }

    public long getValue()
    {
      return (long) crc & 0xFFFFFFFFL;
    }

    public void reset()
    {
      crc = 0;
    }

    public void update(int bval)
    {
      int c = ~crc;
      c = crc_table[(c ^ bval) & 0xFF] ^ (c >>> 8);
      crc = ~c;
    }

    public void update(byte[] buf, int off, int len)
    {
      int c = ~crc;
      while(--len >= 0)
        c = crc_table[(c ^ buf[off++]) & 0xFF] ^ (c >>> 8);
      crc = ~c;
    }

    public void update(byte[] buf)
    {
      update(buf, 0, buf.length);
    }
  }
}

загрузка 40-50%, но больше всего систему грузит csrss.exe, а не Java. Если System.out.println() убрать, то загрузка 50% и систему грузит Java.

Автор: cube 25.4.2008, 13:12
Цитата

сам java процесс занимает какихто 20 кб в оперативной памяти...


Цитата

Java не может занимать 20Кб, Hello World! занимает несколько мегабайт.


java процесс может занимать 20 кб в оперативной памяти!  smile открой таск менеджер если под виндой работаешь и убедись

Цитата

то загрузка 50% и систему грузит Java.


ну вот я и спрашиваю, почему jvm не загружает систему полностью? а только на 50%
и как можно управлять этим?

Автор: LSD 25.4.2008, 13:46
Цитата(cube @  25.4.2008,  14:12 Найти цитируемый пост)
java процесс может занимать 20 кб в оперативной памяти!   открой таск менеджер если под виндой работаешь и убедись

Ты прав, все гораздо хуже. Написал тестик, вообще без кода, только Thread.sleep(), JDK 1.6 - 19.6Мб, JDK 1.5 - 12.9Мб.

Цитата(cube @  25.4.2008,  14:12 Найти цитируемый пост)
ну вот я и спрашиваю, почему jvm не загружает систему полностью? а только на 50%и как можно управлять этим?

1. Мой код на 50% грузит машину потому, что там один поток который грузит одно ядро на 100%, а таск менеджер показывает суммарную загрузку по всем ядрам.
2. JVM тут не причем, дело в твоем коде. Запусти http://forum.vingrad.ru/index.php?showtopic=195938&view=findpost&p=1411192 тестик, и получишь загрузку 100%.
3. Без кода, остается только гадать по звездам и кофейной гуще.

Автор: cube 25.4.2008, 15:27
Цитата(LSD @ 25.4.2008,  13:46)
Цитата(cube @  25.4.2008,  14:12 Найти цитируемый пост)
java процесс может занимать 20 кб в оперативной памяти!   открой таск менеджер если под виндой работаешь и убедись

Ты прав, все гораздо хуже. Написал тестик, вообще без кода, только Thread.sleep(), JDK 1.6 - 19.6Мб, JDK 1.5 - 12.9Мб.

Цитата(cube @  25.4.2008,  14:12 Найти цитируемый пост)
ну вот я и спрашиваю, почему jvm не загружает систему полностью? а только на 50%и как можно управлять этим?

1. Мой код на 50% грузит машину потому, что там один поток который грузит одно ядро на 100%, а таск менеджер показывает суммарную загрузку по всем ядрам.
2. JVM тут не причем, дело в твоем коде. Запусти http://forum.vingrad.ru/index.php?showtopic=195938&view=findpost&p=1411192 тестик, и получишь загрузку 100%.
3. Без кода, остается только гадать по звездам и кофейной гуще.

Ах ты нехороший!  smile   smile 
А я что написал 20 кб? Ну подумаешь не заметил что это вовсе не килобайт, а мегабайт, и потом ты сам написал 
Цитата

Каждый может потупить немножко


 smile 
Спасибо за хороший пример! Я неогу отправить весь код сюда, с библиотеками, да и сам покапаю его! Спасибо еще раз!  smile 

Кто задет сюда, если есть 100 постов,  плиз добавьте ему репутации

Автор: barin_Student 25.4.2008, 16:03
Добавил.. smile 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)