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


Автор: AntonSaburov 18.6.2004, 10:59
Вот, обнаружил.

http://soft.compulenta.ru/2004/6/17/47645/?ref=left

http://kano.net/javabench/

Автор: LSD 18.6.2004, 17:13
Я где то видел подобный тест, для теста была выбранна игра жизнь, и проводился замер времени затраченного на N итераций. И Java там себя показала тоже очень достойно. Предлагаю провести такое тестирование самостоятельно. Кто хочет покчаствовать пишите.

Автор: redrick 18.6.2004, 18:06
спасибо большое - впервые увидел подобные тесты, до этого слышал только что Java обгоняет C++ на Sun Sparc, что вроде как не так впечатляет. Сплош и рядом сионисты кричат, что дескать виртуальная машина - это гроб в плане производительности

Автор: Domestic Cat 18.6.2004, 18:18
JIT / HotSpot переводит bytecode в нативныи, так что подобная скорость неудивительна smile.gif

Автор: Domestic Cat 20.6.2004, 00:16
Две программы:

Код

// C
#include <stdio.h>
#include <time.h>

unsigned int f;
unsigned int factorial (unsigned int a);

main()
{  
   clock_t t1 = clock();
   int i;
   for (i = 0; i < N; i++)
   {
       f = factorial(100);
   }
   clock_t t2 = clock();
   printf("\n Program execution time is %u milliseconds \n", (t2 - t1) * 10);
}

unsigned int factorial(unsigned int a)
{
   if (a == 1) return 1;
   else
   {
       a *= factorial(a - 1);
       return a;
   }
}

Код

// Java
public class Test
{
   public static void main(String [] args)
   {
       long t1 = System.currentTimeMillis();
       int f;
       for (int i = 0; i < N; i++)
       {
           f = factorial(100);
       }
       System.out.println("\n Program execution time is " + (System.currentTimeMillis() - t1) +
                                      "   milliseconds");    
   }
   public static int factorial(int a)
   {
       if (a == 1) return 1;
       else
       {
           a *= factorial(a - 1);
           return a;
       }
   }
}

Я использовал си компилятор
Код

gcc (GCC) 3.3 20030304 (Apple Computer, Inc. build 1495)
Copyright (C) 2002 Free Software Foundation, Inc.

и Java
Код

java version "1.4.2_03"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2_03-117.1)
Java HotSpot(TM) Client VM (build 1.4.2-34, mixed mode)

Вот результаты нескольких запусков,

C обозначает
gcc -o test test.c
./test

C1 -
gcc -O -o test test.c
./test

C3 -
gcc -O3 -o test test.c
./test

Java -
javac -O Test.java
java Test

(Программа всегда выдает "Program execution time is x milliseconds", я привожу только число)
N - число циклов с программе, всего привожу по три результата. Результаты для javc -O Test.java и javac Test.java практически не отличаются.
Код

N = 1000000

  C          C1      C3       Java
6710       2710     2710    4660
6630       2740     2770    4646
6620       2650     2820    4550


Код

N = 100000

  C          C1        C3         Java
700        300        280      429
680        290        280      431
660        280        270      443



Код

N = 10000

  C           C1         C3       Java
 70           20         30        40
 70           30         30        31
 70           30         30        29

Автор: Domestic Cat 21.6.2004, 16:47
Повторил тест, только усреднил время по 20 запускам и добавил

JavaS обозначает
javac Test.java
java -server Test

Цифры - среднее время выполнения в ms (чем меньше тем лучше)
Код

N = 1000000

C         6693
C1       2741
Java    2759.55    
JavaS  2589.8


Код

N = 100000

C         667.5
C1       282         
Java     262.45    
JavaS   260.95


Код

N = 10000

C         67.5      
C1       29        
Java    26.8   
JavaS  26.4


smile.gif smile.gif biggrin.gif

Автор: LSD 23.6.2004, 21:18
Наконец нашел время заняться этим делом smile.gif .
Прогнал тест Domestic Cat и вот что получил:
Использовался компилятор Microsof Visual C++ 6.0, Borland C++ Builder 6.0 с предустановками Release и Optimisation: perfomance. Для Java использовалась JDK 1.4.2_01, копилировалась с ключами -O и -g:none.
AMD Athlon XP 2000, RAM 768Mb, Windows XP Pro SP1
Код

Borland C++ Builder | Microsoft Visual C++ | Java client VM | Java server VM
--------------------+----------------------+----------------+----------------
            77,192с |              68,211с |        70,391с |        42,547с

Intel Celeron 1300, RAM 256Mb, Windows 2000 Pro SP4
Код

Borland C++ Builder | Microsoft Visual C++ | Java client VM | Java server VM
--------------------+----------------------+----------------+----------------
           111,192с |              91,651с |       100,272с |        59,901с


Добавлено @ 21:21
Через пару деньков доделаю програмку жизнь и выложу результаты.

Автор: LSD 27.6.2004, 22:40
В коде Domestic Cat есть небольшая ошибка, факториал 100 не поместится в 4-х байтовое целое, исправил ее и заодно скомпилил под Delphi получились очень интерестные результаты:
Код
Borland C++ Builder | Borland Delphi | Microsoft Visual C++ | Java client VM | Java server VM
--------------------+----------------+----------------------+----------------+----------------
             102,7  |           97,2 |                 96,5 |           78,9 |           38,6

это усредненные результаты после 10 запусков. Четно говоря столь слильного преимущества Java я не ожидал.
Добавлено @ 22:42
Забыл указать:
Машина: AMD Athlon XP 2000, RAM 768Mb, Windows XP Pro SP1
Компиляторы: Borland Delphi 5.5 и плюс те же что и ранее.

Автор: Sardar 27.6.2004, 23:17
Результаты впечатляют. По моему у серверной Явы коронка: быстрые вызовы функций(тоже где то в тесте было). Факториал вычисляется рекурсивно, отсюда и столь впечатляющий результат... наверное... smile.gif

Автор: LSD 19.3.2005, 02:07
В связи с очередными дускусиями http://forum.vingrad.ru/index.php?showtopic=45838&st=0 решил поднять темку.

На этот раз думаю надо взять програмку посерьезней. Я предлагаю все ту же жизнь, а заодно добавить сюда еще одного новичка: C#. Предполагается псевдо-бесконечное поле, реализуемое с помощью хеш-таблиц. На нем размещается парочка глайдерных ружей и кто быстрее выполнит заданное количество итераций.

У меня есть готовый код для Java и C#, для C++ надо чтобы кто-нить взялся его написать, т.к. я с ним не знаком. Программа порождает много объектов, можно будет посмотреть где сборщик мусора эффективней и что выгодней сборщик мусора или ручное выделение памяти.

Автор: Domestic Cat 19.3.2005, 02:30
НЕ понял, ты с шарпом не знаком или С++? Если шарп - то я возьмусь.
Добавлено @ 02:32
Все, вопрос снят, нужен С++.

Автор: LSD 19.3.2005, 02:32
Лекции по С++, я прогуливал smile

Автор: Domestic Cat 19.3.2005, 02:40
На это дело надо С++ шников брать, иначе обвинят smile

Автор: chipset 19.3.2005, 06:35
Цитата(Domestic @ 18.3.2005, 15:40)
На это дело надо С++ шников брать, иначе обвинят smile

А в чём собссна дело? smile Мы вылижем код до дыр smile
Что, где, когда писать?
Добавлено @ 06:36
Увидел Ж)

Автор: Domestic Cat 19.3.2005, 10:44
Ну, у меня C# и Java наравне - при компиляции jikes -g:none -O , флаге -server и подборе -Xmn.

Автор: LSD 19.3.2005, 12:56
У меня C# быстрее на 5%. Компилятор javac -g:none, флаг -server использовал а с -Xmn, не пробовал играться, надо будет попробовать.

Автор: Domestic Cat 19.3.2005, 21:42
По моим субъективным ощущениям jikes дает более быстрый код, как-нибудь проверю.

Автор: chipset 3.4.2005, 07:21
Народ, обьясните как такое может "логически", чтобы интерпретатор работал быстрее ассемблерного кода?

Автор: Domestic Cat 3.4.2005, 07:25
Дык не ассемблерного, а С++шного, - две большие разницы smile
http://www.javaworld.com/javaworld/jw-02-1998/jw-02-jperf_p.html

Автор: chipset 3.4.2005, 07:28
Там у них в тестах:
Simple Loop 46K(С++) vs 3.9K(Java)
Они наверное в Debug компилили, я делал ActiveX 2 кб smile

Автор: Domestic Cat 3.4.2005, 07:31
То ж не просто цикл, там ряд мат операций, и т п, в любом случае С++ шный код будет больше.

Автор: LSD 7.9.2005, 10:03
После недавней дискусси с Се ля ви, решил поднять некоторые тесты которые мы гоняли на работе и прогнать их еще раз.
Сам код представляет собой итерацию по 2-м массивам, вычисление разности и запись результата в третий массив (нам это было необходимо для обработки видеоизображения). На скорость тестировались:
  • Sun JVM build 1.5.0_01-b08, mixed mode
  • Bea JRockit build dra-45238-20050523-2021-win-ia32
  • Microsoft 32-bit C/C++ Optimizing Compiler Version 13.00.9466 for 80x86
Тесты запускались на следующей машине: P4 3.06Ghz, 512Mb RAM, Windows XP Pro SP2. Java код компилировался соответсвующей JDK (Sun - Sun JDK, BEA - BEA JDK), с ключом -g:none. Ключи запуска такие:
Sun: -Xms50M -Xmx200M -server
BEA: -Xms50M -Xmx200M -jrockit
Были получены следующие результаты:
Код
JVM: BEA Systems, Inc. , dra-45238-20050523-2021-win-ia32
  calculation time = 26368ms (10000 iterations)
  calculation time = 26369ms (10000 iterations)
  calculation time = 26400ms (10000 iterations)

JVM: Sun Microsystems Inc. , 1.5.0_01-b08
  calculation time = 22119ms (10000 iterations)
  calculation time = 22164ms (10000 iterations)
  calculation time = 22960ms (10000 iterations)

Microsoft C++
  calculation time = 22188ms (10000 iterations)
  calculation time = 23563ms (10000 iterations)
  calculation time = 23496ms (10000 iterations)
  calculation time = 23531ms (10000 iterations)

Для Sun JVM один раз было полученно время ~20 сек, но так как оно сильно выделяется на фоне остальных запусков и повторить эксперимент не получилось, в расчет я его не брал. Для C++, тоже замечена странная особенность, первый запуск теста выполняется быстрее последующих на ~1.3 сек, в чем проблема я так и не понял, но результат оставил.

Автор: aquaserpent 7.9.2005, 16:46
Исходя из примера в MSDN функция clock() возвращает время в миллисекундах:
Код

/* Pauses for a specified number of milliseconds. */
void sleep( clock_t wait )
{
   clock_t goal;
   goal = wait + clock();
   while( goal > clock() )
      ;
}

Тогда совершенно не понятно, зачем это время умножать на 10 в пятом посте в примере?..
Код

printf("\n Program execution time is %u milliseconds \n", (t2 - t1) * 10);

Автор: bars_uz 7.9.2005, 16:58
Ya neponemayau ,, cheta vizde ideot spor na temu Java vs C++... Bratani ya odnu vesh ponyal, chto oba yzika otlichnie..
oba yzika lutshe pod kakoeta zadach...
no ya dumayu vseotaki Java na odin shag vperedi...

Автор: LSD 7.9.2005, 20:35
bars_uz во первых у меня просьба не писать транслитом, тяжело читать, если есть проблемы с русской раскладкой используй чекбокс "транслит".

Во вторых подобные вопросы не всегда связанны с "религиозными войнами". Например я гонял последний тест, для того чтобы выяснить насколько пригодна Java для применения в нашем проекте.

Ну и наконец, должен же быть у нас заготовлен "наш ответ Чемберлену" smile

Автор: aquaserpent 7.9.2005, 22:47
Не знаю как в остальных тестах, а в первом примере просто неправильно замеряется время в сишном примере. Его нужно просто поделить на 10 (точнее не умножать на 10). И все становится на свои места...

Автор: Mayk 9.9.2005, 07:27
Цитата(aquaserpent @ 7.9.2005, 20:46)
Исходя из примера в MSDN функция clock() возвращает время в миллисекундах:

Цитата(aquaserpent @ 8.9.2005, 02:47)
Не знаю как в остальных тестах, а в первом примере просто неправильно замеряется время в сишном примере. Его нужно просто поделить на 10 (точнее не умножать на 10). И все становится на свои места...

Вы не правы. Котъ писал,
Цитата(Domestic @ 20.6.2004, 04:16)

Я использовал си компилятор
gcc (GCC) 3.3 20030304 (Apple Computer, Inc. build 1495)
Copyright © 2002 Free Software Foundation, Inc.

Поэтому MSDN тут не при чём.
Вообще по Стандарту CLOCKS_PER_SEC = 1000000. А ни 1000, как сделано у мс. Пасикс не указ мелкомягким, а последние не указ пасиксу. Не знаю про cps в апплах, не юзал. Судя по *10, он им тоже не указ. Кстати, мне почему-то кажется, что Доместик 4 секунды от 0.4 отличил бы. Ну я бы, к примеру, отличил.

Проведем еще раз тест.
Результаты для 1000000 итераций(без всяких оптимизаций, чтоб за цикл никто ничего не выкинул)
Java: 1984, 2000, 2000, 1985 ms
Борла: 1500, 1500, 1500, 1531(*10 убрано) ms
VS2003: Дебаг: 11016ms((*10 убрано) 11 СЕКУНД НАФИГ. 11 секунд явно длятся больше секунды. Я уж думал, повисла). Релиз: 0ms(!!!). Фтопку. Фигня какая-то.

Ну и где опережение в десять раз, чтоб всё встало на свои места? Я пока вижу(Visual'но - черное окно в течение 10 секунд) только ухудшение в десять раз в вязанке. В ней делить надо на 10, чтоб она не выбивалась.

Давайте проведем масштабное сравнение компилеров, а? Ну пжалуста. smile smile

зы. В следующий раз, прежде чем кричать "*10 - это не правильно" либо проверьте сами, либо подумайте, совпадает насколько ваш clock() совпадает с clock()'ом проверяющего:

Цитата(http)

Fri, 05 Nov 2004 15:28:44 +0100 =?ISO-8859-1?Q?Anders_F_Bj=F6rklund?= <afb xx algonet.se>  writes:
Thomas Kuehne wrote:
> On POSIX systmes like Linux std.c.time.CLOCKS_PER_SEC should be 1000000 and
> not 1000.
And on Darwin BSD (Mac OS X), it should be 100.

Автор: Metal_Heart 9.9.2005, 09:16
Mayk, очень прошу, ненадо жаргона, я в твоем посте нить теряю

Чтобы это значило?
Цитата(Mayk @ 9.9.2005, 07:27)
VS2003: Дебаг: 11016ms((*10 убрано) 11 СЕКУНД НАФИГ. 11 секунд явно длятся больше секунды. Я уж думал, повисла). Релиз: 0ms(!!!). Фтопку. Фигня какая-то.



Автор: aquaserpent 9.9.2005, 10:13
Mayk, при чем здесь мелкомягкие? Неужели Вы считаете, что одна и та же СИШНАЯ (а не мелкомягковская) функция будет возвращать разные значения под разными компиляторами? smile Может еще и printf будет другим цветом печатать? smile Нет уж, извините. Есть стандарт языка..
А MSDN, в общем-то, является очень даже авторитетным справочником. И прежде чем "кричать" (как Вы заявляете) я ображаюсь к документации. Теперь подтверждени (модифицированный пример).
Код

#include <stdio.h>
#include <time.h>

unsigned int f;
unsigned int factorial (unsigned int a);

#define N  1000000

main()
{   
   clock_t t1 = clock();
   int i, j, k;
   k = 0;
   for (j = 0; j < 100; j++) {
       for (i = 0; i < N; i++) {
           f = factorial(100);
       }
       k += f;
   }
   clock_t t2 = clock();
   printf("\n Program execution time is %u milliseconds \n", (t2 - t1) * 10);


unsigned int factorial(unsigned int a)
{
   if (a == 1) return 1;
   else 
   {
       a *= factorial(a - 1);
       return a;
   }
}

Код

public class Test
{
   private final static int N = 1000000;
   public static void main(String [] args)
   {
       long t1 = System.currentTimeMillis();
       int f;
    int i, j, k;
    k = 0;
    for (j = 0; j < 100; j++) {
         for (i = 0; i < N; i++)  {
           f = factorial(100);
       k += f;
         }
    }
       System.out.println("\n Program execution time is " + (System.currentTimeMillis() - t1) + 
                                      "   milliseconds");    
   }
   public static int factorial(int a) 
   {
       if (a == 1) return 1;
       else 
       {
           a *= factorial(a - 1);
           return a;
       }
   }
}

Засекаем время секундомером. Java - 128 cек. CPP - 85 сек (плюс/минус секунда погоды не делает). Теперь то, ЧТО ВЫДАЕТ ПРОГРАММА. Java - 128032. CPP - 845150. Ничего не смущает??? Так что MSDN в очередной раз оказался на высоте. А доку читать надо. smile
А мерять время в Debug или умножать реальное время на 10 smile

Автор: Domestic Cat 9.9.2005, 11:14
Цитата(aquaserpent @ 9.9.2005, 01:13)
Засекаем время секундомером.

На какой оси засекалось?

Цитата(aquaserpent @ 9.9.2005, 01:13)
Так что MSDN в очередной раз оказался на высоте.

Ага, прям так щас. С каких это пор МСДН имеет хоть какое-то отношение к Макинтошу?

Кстати, доки действительно надо читать. На маздае 1000, на дарвине (мак ос х, который я и пользовал) - 100. 1/CLOCS_PER_SEC = количество секунд за один тик. Чтоб перевести в миллисекунды, домножаем числитель и знаменатель на 10. Знаменатель выбрасываем (в Java коде все итак в мс) и получаем то что надо.

Так что читайте мануалы и не верьте в кроссплатформенность си.

Автор: aquaserpent 9.9.2005, 13:40
Я замерял под Win2000 Prof.
Согласитесь, что результат говорит сам за себя.

Дело не в том, на сколько программа на Java работает медленне, чем на С. Дело в том, что по вашим тестам она (программа на Java) работает БЫСТРЕЕ. А это неправильно. Элементарное правило треугольника: AB+BC <= AC.

Автор: LSD 9.9.2005, 13:44
Цитата(aquaserpent @ 9.9.2005, 14:40)
Согласитесь, что результат говорит сам за себя.

Не согласен. Ты вообще ничего не указал, ни ключей запуска, ни версию JVM, ни конфигурацию машины, ни компилятора. Да и противоречие с теми тестами что я гонял разительное, вообщем [i]не верю[b].

Автор: aquaserpent 9.9.2005, 13:49
Цитата(LSD @ 9.9.2005, 13:44)
Цитата(aquaserpent @ 9.9.2005, )
Согласитесь, что результат говорит сам за себя.

Не согласен. Ты вообще ничего не указал, ни ключей запуска, ни версию JVM, ни конфигурацию машины, ни компилятора. Да и противоречие с теми тестами что я гонял разительное, вообщем [i]не верю[b].

Ну, верить или не верить, это дело личное. Не верите - проверьте.
Я компилировал VS6.0 (Release, естесственно). Никаких дополнительных настроек не ставил, т.е. все по умолчанию.
Java - jdk1.5.0_01. Компилировал с теми же параметрами, что и в самом первом примере.

Машина - PIV-2400, 512Mb.

Хотя это все и не имеет значения.

Автор: LSD 9.9.2005, 13:55
Цитата(aquaserpent @ 9.9.2005, 14:49)
Не верите - проверьте.

Без дополнительных сведений не проверишь smile

Автор: Mayk 9.9.2005, 14:02
Цитата(Metal_Heart @ 9.9.2005, 13:16)
Чтобы это значило?
Цитата (Mayk @ 9.9.2005, 07:27)
VS2003: Дебаг: 11016ms((*10 убрано) 11 СЕКУНД НАФИГ. 11 секунд явно длятся больше секунды. Я уж думал, повисла). Релиз: 0ms(!!!). Фтопку. Фигня какая-то.

VS2003. - запускаем новый сишный проект под vs2003.
Дебаг: 11016ms - время выполнение(11016ms) выведенное на экран в режиме Debug(а не Release) и запущенное через Start а не через Start without debugging. Если сделать Start without debugging, то время измениться не значительно. Что-то около плюс-минус 100 мс.
11 СЕКУНД НАФИГ. 11 секунд жизни Mayk'а потрачены зря smile
11 секунд явно длятся больше секунды - это не ошибка вывода на экран, прошло действительно 11 секунд
(*10 убрано) - в коде (t2-t1)*10 убрано умножение на 10, чтобы результат соответствовал действительности.
Я уж думал, повисла - мат по поводу тормознутости кода.
Релиз: - в конфигурации Release.
0ms - время, выведенное на экран.
(!!!) - удивился
Фтопку. - еще один мат, по поводу оптимизации кода(шибко умная)
Фигня какая-то - так нельзя тестировать и сравнивать. Очевидно, factorial() был выкинут из цикла.
Надеюсь понятно объяснил smile

Цитата(aquaserpent @ 9.9.2005, 14:13)
Ничего не смущает??

Смущает то, что код для мака был запущен на винде.

Цитата(aquaserpent @ 9.9.2005, 14:13)
А MSDN, в общем-то, является очень даже авторитетным справочником.

http://www.opengroup.org/onlinepubs/009695399/functions/clock.html авторитетам врознь-
Цитата

CLOCKS_PER_SEC is defined to be one million in <time.h>.


Цитата(aquaserpent @ 9.9.2005, 14:13)
А доку читать надо.

Согласен.

Автор: Metal_Heart 9.9.2005, 14:26
smile

Автор: aquaserpent 9.9.2005, 17:05
А что? Секундомер (обычные часики) при запуске на маке по-другому работает и Java-программа начинает работать быстрее сишной? smile
А тестить на скорость дебаг-версию... Это ж надо так себя не уважать...

Автор: Coocky 9.9.2005, 17:40
Да не, мужики, ну не верю, что "виртуальная" java быстрее "неуправляемого" С++ работала smile
Хоть тестите,хоть не тестите.

Автор: AntonSaburov 9.9.2005, 18:00
Цитата(Coocky @ 9.9.2005, 17:40)
Да не, мужики, ну не верю, что "виртуальная" java быстрее "неуправляемого" С++ работала

Да сколько раз можно рассказывать, что JIT на лету генерит нативный код для метода. И когда ты вызываешь этот метод снова, то он уже фактически в двоичном коде. На конференции разработчики говорили, что они сделали так, что даже научились переключаться при работе метода с байт-кода на нативный. Т.е. раньше JIT работал только при выходе из метода. А первый раз сидишь под байт-кодом. Так вот теперь JAVA будет переключаться даже без выхода из метода. И код оптимизирован может быть под процессор. Т.е. под конкретную можель. А exe уже не оптимизируешь. Какой код есть, такой будет на любой машине.
Добавлено @ 18:02
Понятно, что время на JIT теряется. На первое время. Но после него получаем фактически двоичный код. Нет уже никакого байт-кода. Забудь.

А если учитывать, что такого рода приложения крутятся круглосуточно, то понятно, что большая часть кода уже нативная.

На конференции вообще говорили про разработку Real Time Java.

Автор: LSD 9.9.2005, 19:15
Цитата(Coocky @ 9.9.2005, 18:40)
Да не, мужики, ну не верю, что "виртуальная" java быстрее "неуправляемого" С++ работала smile
Хоть тестите,хоть не тестите.

Это уже прям религия какая-то получается smile
Верую ибо С++...

Автор: Domestic Cat 9.9.2005, 21:46
Цитата(aquaserpent @ 9.9.2005, 04:40)
Дело не в том, на сколько программа на Java работает медленне, чем на С. Дело в том, что по вашим тестам она (программа на Java) работает БЫСТРЕЕ. А это неправильно. Элементарное правило треугольника: AB+BC <= AC.

По тестам получалось, что Java быстрее си после неоптимизированной компиляции, и медленнее оптимизированной компиляции. Да это и на глаз было видно при большом количестве итераций. О чем тут спорить непонятно.

Цитата(Coocky @ 9.9.2005, 08:40)
Да не, мужики, ну не верю, что "виртуальная" java быстрее "неуправляемого" С++ работала smile
Хоть тестите,хоть не тестите.

Сейчас все виртуальные машины используют JIT. Потому верить тут нечему - это тот же си. А там все зависит от того, насколько компилер умный.

Автор: batigoal 9.9.2005, 22:20
Цитата(AntonSaburov @ 9.9.2005, 19:00)
На конференции разработчики говорили, что они сделали так, что даже научились переключаться при работе метода с байт-кода на нативный.

Ты вчера был, да? Я не смог.

Автор: Се ля ви 24.9.2005, 18:19
Цитата(LSD @ 7.9.2005, 10:03)
После недавней дискусси с Се ля ви, решил поднять некоторые тесты которые мы гоняли на работе и прогнать их еще раз.


Цитата(LSD @ 7.9.2005, 10:03)
# Sun JVM build 1.5.0_01-b08, mixed mode
# Bea JRockit build dra-45238-20050523-2021-win-ia32

LSD, ну ты б ещё с JVM 1.0 95-го года сравнил! smile
Ну если уж пятёрку sun`овскую берёшь - бери и соответственно пятёрку BEA JRockit! Естественно, что с выходом новых версий кучу всего оптимизируют и сравнивать разные версии, IMHO, просто некорректно.

Если у тебя нет - можешь выложить исходник этого теста, я у себя прогоню-посмотрю.

P.S. Вообще же серверную JVM и клиентскую не очень хорошо сравнивать ещё и по вот какой причине - к серверной машине гораздо выше требования надёжности и долговечности. Например, sun`овская считается клиентской и не рассчитана на то, что треды живут очень долго. Если тред крутится уже целый месяц, он может взять и умереть. Если запускаешь программы и работаешь в них, то это не критично, а вот когда у тебя крутится на корпоративном сервере какая-нибудь зверская система автоматизации типа 24/7 - это очень даже критично!

Автор: LSD 24.9.2005, 18:37
Цитата
LSD, ну ты б ещё с JVM 1.0 95-го года сравнил!
Ну если уж пятёрку sun`овскую берёшь - бери и соответственно пятёрку BEA JRockit! Естественно, что с выходом новых версий кучу всего оптимизируют и сравнивать разные версии, IMHO, просто некорректно.

А это что по твоему???
Это JRockit 5.0 взято http://commerce.bea.com/products/weblogicjrockit/5.0/jr_50.jsp, последний релиз.

Цитата
Если у тебя нет - можешь выложить исходник этого теста, я у себя прогоню-посмотрю.

В том посте есть аттачмент, угадай что там smile


Цитата
Например, sun`овская считается клиентской и не рассчитана на то, что треды живут очень долго. Если тред крутится уже целый месяц, он может взять и умереть.

Считается кем? И вообще откуда такая информация насчет тредов?


Цитата
P.S. Вообще же серверную JVM и клиентскую не очень хорошо сравнивать ... а вот когда у тебя крутится на корпоративном сервере какая-нибудь зверская система автоматизации типа 24/7 - это очень даже критично!

Вообщем это конечно да, но гонять тесты непрерывно хотя бы месяц, нет возможности ни у меня, ни у тебя.

Автор: Се ля ви 24.9.2005, 19:53
Цитата(LSD @ 24.9.2005, 18:37)
Это JRockit 5.0 взято отсюда, последний релиз.

Сорри, чего-то я туплю, мне покзалось, что у тебя четвёрка была... smile Странно, почему такой номер версии?.. Кароче мой косяк, каюсь. smile

Цитата(LSD @ 24.9.2005, 18:37)
Цитата (Се ля ви @ 24.9.2005, 19:19)
Например, sun`овская считается клиентской и не рассчитана на то, что треды живут очень долго. Если тред крутится уже целый месяц, он может взять и умереть.

Считается кем? И вообще откуда такая информация насчет тредов?

Это мне препод из "Ланита" рассказывал, когда я ему соответствующий вопрос задал. С его слов информация.

Цитата(LSD @ 24.9.2005, 18:37)
Цитата (Се ля ви @ 24.9.2005, 19:19)
P.S. Вообще же серверную JVM и клиентскую не очень хорошо сравнивать ... а вот когда у тебя крутится на корпоративном сервере какая-нибудь зверская система автоматизации типа 24/7 - это очень даже критично!

Вообщем это конечно да, но гонять тесты непрерывно хотя бы месяц, нет возможности ни у меня, ни у тебя.

Ну вобщем, да...

Автор: Бонифаций 28.9.2005, 15:22
было бы интересно еще с gcj сравнить.


Автор: LSD 28.9.2005, 15:27
Цитата
было бы интересно еще с gcj сравнить.

Займись, а я может повторю твой тест smile
И кстати почему только GCJ?

Автор: Бонифаций 28.9.2005, 15:54
Цитата(LSD @ 28.9.2005, 15:27)
Цитата
было бы интересно еще с gcj сравнить.

Займись, а я может повторю твой тест smile
И кстати почему только GCJ?

потому что gcc и gcj это два frontend для одного backend. Так что по результатам проще было бы оценить влияние именно языка.

Автор: Guest 28.9.2005, 21:09
ну вот. Попробовал. В качестве теста взял решето Эратосфена.
Код для жабы:

Код

//  Eratosthenes Sieve prime number benchmark in Java

public class Sieve {

  static String results1, results2;

  public static void main(String[] args) {
     System.out.println("Running Sieve benchmark.");
     System.out.println("This will take about 10 seconds.");
     runSieve();
     System.out.println(results1);
     System.out.println(results2);
     // System.in.read();                        // InputStream
  }

  static void runSieve() {
     int SIZE = 8190;
     boolean flags[] = new boolean[SIZE+1];
     int i, prime, k, iter, count;
     int iterations = 0;
     double seconds = 0.0;
     int score = 0;
     long startTime, elapsedTime;

     startTime = System.currentTimeMillis();
     while (true) {
        count=0;
        for(i=0; i<=SIZE; i++) flags[i]=true;
        for (i=0; i<=SIZE; i++) {
           if(flags[i]) {
              prime=i+i+3;
              for(k=i+prime; k<=SIZE; k+=prime)
                 flags[k]=false;
              count++;
           }
        }
        iterations++;
        elapsedTime = System.currentTimeMillis() - startTime;
        if (elapsedTime >= 10000) break;
     }
     seconds = elapsedTime / 1000.0;
     score = (int) Math.round(iterations / seconds);
     results1 = iterations + " iterations in " + seconds + " seconds";
     if (count != 1899)
        results2 = "Error: count <> 1899";
     else
        results2 = "Sieve score = " + score;
  }
}



Для С

Код

void runSieve()
{
    int SIZE = 8190;
    char flags[SIZE + 1];
    register int i, prime, k, iter, count;
    register int iterations = 0;
    double seconds = 0.0;
    int score = 0;
    long startTime, elapsedTime;

    time(&startTime);
    while (1) {
    count = 0;
    for (i = 0; i <= SIZE; i++)
        flags[i] = 1;
    for (i = 0; i <= SIZE; i++) {
        if (flags[i]) {
        prime = i + i + 3;
        for (k = i + prime; k <= SIZE; k += prime)
            flags[k] = 0;
        count++;
        }
    }
    iterations++;
    time(&elapsedTime);
    elapsedTime -= startTime;
    if (elapsedTime >= 10)
        break;
    }
    seconds = elapsedTime;
    if (count != 1899)
    perror("Error: count <> 1899");
    else {
       score = (int) (iterations / seconds);
       printf("%d iterations in %f seconds\n", iterations,seconds);
       printf("Sieve score = %d\n", score);
    }
}

main(int argc, char *argv)
{
    puts("Running Sieve benchmark.");
    puts("This will take about 10 seconds.");
    runSieve();
}



Результаты - количество итераций за 10 секунд. По простому, чем больше число, тем круче:

Для явы получаем при

gcj --main=Sieve Sieve.java

3968 итераций в секунду.
С оптимизацией, то есть gcj --main=Sieve -O2 Sieve.java, - 8937 итераций в секунду.

Для gcc sieve.c (без оптимизации) 4870 ит/сек
С оптимизацией (gcc -O2 ) - 10503 ит/сек

Для сравнения на обычной яве - примерно 7026 ит/сек (java -Xms50M -Xmx200M --server, транслировалось с -g:none, java -version 1.5.0_04 от Sun )





Автор: Бонифаций 28.9.2005, 21:11
Это был я в предыдущем сообщении (под именем Guest почему-то получилось)

Автор: LSD 28.9.2005, 21:14
Интерестно, а под чем запускал и машина какая?

Автор: Coocky 29.9.2005, 10:36
Интересно, а если сортировку сделать и сравнить?

Автор: Бонифаций 29.9.2005, 16:31
Цитата(LSD @ 28.9.2005, 21:14)
Интерестно, а под чем запускал и машина какая?

машина пентиум 4, 2.4GHz 512M, linux slackware 10.

Автор: AntonSaburov 29.9.2005, 16:40
Цитата(Guest @ 28.9.2005, 21:09)
3968 итераций в секунду.
С оптимизацией, то есть gcj --main=Sieve -O2 Sieve.java, - 8937 итераций в секунду.

Для gcc sieve.c (без оптимизации) 4870 ит/сек
С оптимизацией (gcc -O2 ) - 10503 ит/сек


Даже если так - то все рвано разница составляет порядка 10%. А это вообщем-то вполне допустимый разброс. И вполне приличная скорость.

Автор: LSD 29.9.2005, 16:43
Цитата(Coocky @ 29.9.2005, 11:36)
Интересно, а если сортировку сделать и сравнить?

Давай. Напиши сишную часть.

Бонифаций
Все в тесте хорошо, кроме одного момента, ты на каждой итерации вызываешь функцию полученя времени. Корректно ли это? Ведь в Java эта функция требует преобразования из системного времени во внутренний формат Java и неизвестно сколько это занимает времени. Попробуй просто сделать фиксированное количество итераций, подбери их чтобы время было порядка 15-30 секунд. И сравнивать уже время выполнения.

Автор: Coocky 29.9.2005, 16:47
LSD
Цитата(LSD @ 29.9.2005, 16:43)
Давай. Напиши сишную часть

Ок..Какую(сортировку) будем использовать?
Только я не пойму условия-от меня текстовый код, что ли?
Тогда на каком С++ компиляторе будем тестить?

Добавлено @ 16:52

Быстрая сортировка..
Код

void QuickSort(int A[], int L, int R) 

  { 

  int i, j; 

  int x, t; 

  

  while (L < R) 

    { 

    x = A[L]; 

    i = L, j = R; 

    while (i <= j) 

      { 

      while (A[i] < x) i++; 

      while (x < A[j]) j--; 

      if (i <= j) 

        t = A[i], A[i] = A[j], A[j] = t, 

        i++, j--; 

      } 

    if ((j - L) > (R - i)) 

      QuickSort(A, i, R), R = j; 

    else 

      QuickSort(A, L, j), L = i; 

    } 

  } 



выполняет соpтиpовку части массива, огpаниченной

индексами L (слева) и R (спpава);

для соpтиpовки всего массива необходимо сделать вызов

QuickSort(A, 1, n);

глубина pекуpсии <= log n

Автор: LSD 29.9.2005, 16:56
Цитата(Coocky @ 29.9.2005, 17:47)
Какую(сортировку) будем использовать?

Без разницы, мы ведь не алгоритмы сравниваем. Главное чтобы код был простым (его ведь еще на Java надо перевести).

Цитата(Coocky @ 29.9.2005, 17:47)
Только я не пойму условия-от меня текстовый код, что ли?

Да. (посмотри примеры выше, как там народ делал)

Цитата(Coocky @ 29.9.2005, 17:47)
Тогда на каком С++ компиляторе будем тестить?

Да на всех GCC, GCJ, VC++, Intel C++ Compiller, у кого что есть

Автор: Бонифаций 29.9.2005, 18:10
Цитата(AntonSaburov @ 29.9.2005, 16:40)
Цитата(Guest @ 28.9.2005, )
3968 итераций в секунду.
С оптимизацией, то есть gcj --main=Sieve -O2 Sieve.java, - 8937 итераций в секунду.

Для gcc sieve.c (без оптимизации) 4870 ит/сек
С оптимизацией (gcc -O2 ) - 10503 ит/сек


Даже если так - то все рвано разница составляет порядка 10%. А это вообщем-то вполне допустимый разброс. И вполне приличная скорость.

Если делать выводы, то я бы сказал, что
  • Скорость sun java с hotspot находится на уровне С программы, (где-то между неоптимизированной и оптимизированной С программой). Это очень приличная скорость для виртуальной машины. К примеру та же программа на перле показала меньше 1000 ит/сек
  • gcj работает вполне достойно. Чуть быстрее сановской явы (на этом примере). но естественно, имеет достоинство, что для результирующей прграммы не нужен jre.


Автор: Coocky 30.9.2005, 12:23
Вот, сравните( у меня JAVA нет), осторожно-много памяти smile
Настройки по умолчанию.. VC 2003

Автор: Coocky 30.9.2005, 12:53
У кого нет VC, вот исполняемый файл.
Программа сортирует массив из 39999996 случайных элементов в диапазоне 999 до 32766*1000-1
На WinXP ОЗУ256, Celeron 1200MHz-сортировка с настройками компилятора по умолчанию
20.7400 секунд



Код




#include "stdafx.h"
#include <time.h>
#include <stdlib.h>


inline void QuickSort(long* A, long L, long R)


  long i, j; 

  long x, t; 

  

  while (L < R) 

    { 

    x = A[L]; 

    i = L, j = R; 

    while (i <= j) 

      { 

      while (A[i] < x) i++; 

      while (x < A[j]) j--; 

      if (i <= j) 

        t = A[i], A[i] = A[j], A[j] = t, 

        i++, j--; 

      } 

    if ((j - L) > (R - i)) 

      QuickSort(A, i, R), R = j; 

    else 

      QuickSort(A, L, j), L = i; 

    } 

  } 


int _tmain(int argc, _TCHAR* argv[])

{

srand( (unsigned)time( NULL ) );



const long size = 39999996;
    long *pa = new long [size];
    if (pa==0)

    {
         
        return 0;
    }

    for(long i=0;i<size;i++)

    {
        pa[i]=(rand()%32766+1)*1000-(rand()%32766+1);
        
    }



long t1 = clock();

QuickSort(pa,0,39999995);

long t2 = clock();

double duration = (double)(t2 - t1) / CLOCKS_PER_SEC;
   printf( "Sort array %.4f seconds\n", duration );

/*for(long i=0;i<39999996;i++)
  
{
//Для тех ,кто не верит:-)
    printf("\n Ups-s-s-s! %d \n", massiv[i]);


    }
*/
   delete[]pa;

    return 0;
}




Автор: maxim1000 30.9.2005, 13:34
Цитата
Программа сортирует массив из 39999996 случайных элементов в диапазоне 999 до 32766*1000-1

я бы советовал использовать одинаковые массивы для обоих версий
дело в том, что у быстрой сортировки есть не очень приятное свойство:
ее вычислительная сложность зависит от "удачного" выбора разделяющего элемента
если все время не будет везти (крайний случай), ее сложность пропорциональна N^2...

Автор: Coocky 30.9.2005, 13:55
Цитата(maxim1000 @ 30.9.2005, 13:34)
ее вычислительная сложность зависит от "удачного" выбора разделяющего элемента
если все время не будет везти (крайний случай), ее сложность пропорциональна N^2...


Согласен и знал об этом, но как же заполнить? smile

Автор: maxim1000 30.9.2005, 14:09
Цитата
но как же заполнить

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

если же не хочется добавлять сюда операции с диском, можно поступить иначе:
реализуем генератор случайных чисел, инициализируем его одним и тем же числом
запускаем кучу раз - получаем одну и ту же последовательность...
генератор можно взять простейший - типа x=(x*a+b)%m (у нас же не криптография, в конце концов)

конечно, можно было бы использовать встроенные генераторы, но я бы не советовал:
неизвестно, какой из них работает быстрее
даже если известно, то возможно, что он работает быстрее не из-за языка, а из-за пониженных требований к качеству случайных последовательностей (кто его знает, вдруг в Java встроен качественный генератор случайных чисел и это даст неоправданное преимущество для C++?)

Автор: LSD 30.9.2005, 14:15
Лучше файл smile

Автор: Coocky 30.9.2005, 14:16
Ну ладно, пусть сами исправят.. У меня все равно JAva нет, мне пофиг генератор...Не с чем сравнивать smile

Автор: maxim1000 30.9.2005, 14:16
параметры для генератора можно посмотреть в этой теме:
http://forum.vingrad.ru/index.php?showtopic=7465&view=all

Автор: LSD 30.9.2005, 14:19
Цитата(Coocky @ 30.9.2005, 15:16)
Ну ладно, пусть сами исправят..

Ты Сишную часть исправь и перекомпили, а то у меня VS нет.

Автор: Coocky 30.9.2005, 14:20
Ну кто нить сравнивал? Че молчите?
Или до сих пор прога на Java работает? smile
Добавлено @ 14:22
LSD
А че исправить-то генератор случайных чисел, или в файл записать "родной генератор"?

Автор: LSD 30.9.2005, 15:12
Цитата(Coocky @ 30.9.2005, 15:20)
А че исправить-то генератор случайных чисел, или в файл записать "родной генератор"?

Сделай заполнение массива из файла.

Автор: Coocky 30.9.2005, 15:34
Цитата(LSD @ 30.9.2005, 15:12)
Сделай заполнение массива из файла.

Давай полное имя файла....который нужно считать..(я ж должен в коде его "открыть")

Автор: Coocky 30.9.2005, 15:51
LSD
Ну у меня все готово!
имя файла давай!

Автор: LSD 30.9.2005, 15:59
Цитата(Coocky @ 30.9.2005, 16:51)
имя файла давай!

data.bin
А еще лучше пусть как параметр командной строки передается.

Только давай форматы согласуем, сортируем мы знаковые 4-х байтовые целые. В каком формате ты их будешь писать в файл (litle-endian или big-endian)?

Автор: Coocky 30.9.2005, 16:27
Значит я сделал вводимый путь, считывает файл ввиде бинарного из 39999996 значений 4 _х байтовых чисел

Автор: LSD 30.9.2005, 16:30
Порядок байт какой?

Автор: Coocky 30.9.2005, 16:34
Вот файл. Положи файл радом с прогой и задай относительный путь.
Думаю считывать будет долго.
Следуй инструкциям на экране smile
Для тех, кто шарит в С++
Код


#include "stdafx.h"
#include <time.h>
#include <stdlib.h>
#include <stdio.h>

using namespace std;
inline void QuickSort(long* A, long L, long R)


  long i, j; 

  long x, t; 

  

  while (L < R) 

    { 

    x = A[L]; 

    i = L, j = R; 

    while (i <= j) 

      { 

      while (A[i] < x) i++; 

      while (x < A[j]) j--; 

      if (i <= j) 

        t = A[i], A[i] = A[j], A[j] = t, 

        i++, j--; 

      } 

    if ((j - L) > (R - i)) 

      QuickSort(A, i, R), R = j; 

    else 

      QuickSort(A, L, j), L = i; 

    } 

  } 

int _tmain(int argc, _TCHAR* argv[])
{

//srand( (unsigned)time( NULL ) );

printf( "New memory...Please wait..\n" );

const long size = 39999996;
    long *pa = new long [size];
    if (pa==0)
    {
         
        return 0;
    }
   // for(long i=0;i<size;i++)
   // {
     //   pa[i]=(rand()%32766+1)*1000-(rand()%32766+1);
        
   // }
    printf( "New memory is Ok!!!\n" );
    printf( "insert path to file!!!\n" );
    char buf[100];
   cin.getline(&buf[0], 99);

FILE*stream;

if( ( stream= fopen( buf, "r+b" )) != NULL )

   {
     printf( "Please wait! Open your file!!!\n" );
     
       for(long i=0;i<size;i++)
    {
       int numwritten=fread( &pa[i], sizeof( long ), size, stream );
       
    }
      
      fclose( stream );
      printf( "Ok! I'm reading your file!!!\n" );

   }
else
{
printf( "I don't open your file!!!\n" );


}



long t1 = clock();

QuickSort(pa,0,39999995);

long t2 = clock();

double duration = (double)(t2 - t1) / CLOCKS_PER_SEC;
   printf( "Sort array %.4f seconds\n", duration );

/*for(long i=0;i<39999996;i++)
  
{
//Для тех ,кто не верит:-)
    printf("\n Ups-s-s-s! %d \n", massiv[i]);


    }
*/
   delete[]pa;
    return 0;
}




Добавлено @ 16:37
Цитата(LSD @ 30.9.2005, 16:30)
Порядок байт какой?

Не понял..
Считываю в массив, начиная с индекса 0 по 39999995, считываю построчно, вроде smile

Автор: Metal_Heart 30.9.2005, 16:44
порядок, как будто - старший-младший

Автор: Бонифаций 30.9.2005, 16:48
это конечно, не мое дело, но все же, почему не просто

fread(pa,sizeof(long),size,stream) ?

и если мы читаем в цикле все по очереди случайные значения, почему

int numwritten=fread( &pa[i], sizeof( long ), size, stream );

а не

int numwritten=fread( &pa[i], sizeof( long ), 1, stream );

?

и еще не лучше ли назвать numread а не numwritten? И еще бы какой-нибудь код чтобы сверять его с size, а то он как-то присваивается и нигде не используется.

а вот еще - почему не просто long pa[size] в стеке, а где-то в куче его выделяем, а потом удаляем? Хотя это конечно неважно

Автор: Metal_Heart 30.9.2005, 16:49
то, что каксаемо работы с файлом - совершенно не важно, так как не в этом суть

Автор: Coocky 30.9.2005, 16:54
Цитата
а вот еще - почему не просто long pa[size] в стеке, а где-то в куче его выделяем, а потом удаляем? Хотя это конечно неважно

У меня больше long pa[99999] вылетает прога в дебаг! smile
Добавлено @ 16:59
Цитата
и еще не лучше ли назвать numread а не numwritten? И еще бы какой-нибудь код чтобы сверять его с size, а то он как-то присваивается и нигде не используется.

Это случайная переменная. Она там ненужна. Это когда тестил-для дебагера использовал
Ребята, кто считает где ошибка-подправтеи выложите снова! Я давно в консоли не писал.Извините...Сишники smile
smile

Автор: LSD 1.10.2005, 22:32
Программу Coocky на Java я перевел:
Код
import java.io.*;
import java.nio.*;
import java.nio.channels.*;

public class Test
{
  public final static int ARRAY_SIZE = 39999996;
  public final static int ARRAY_SIZE_BYTES = ARRAY_SIZE * 4;

  private static int[] data;

  public static void main(String[] args)
  {
    if(args.length < 1)
    {
      System.out.println("usage: java Test <file_name>");
      System.exit(1);
    }
    
    data = new int[ARRAY_SIZE];
    
    long start = System.currentTimeMillis();
    loadData(args[0]);
    long stop = System.currentTimeMillis();
    
    double duration = ( (double) (stop - start)) / 1000.0;
    
    System.out.printf("Load array %.4f seconds\n", duration);

    start = System.currentTimeMillis();
    quickSort(0, ARRAY_SIZE - 1);
    stop = System.currentTimeMillis();
    
    duration = ( (double) (stop - start)) / 1000.0;
    
    System.out.printf("Sort array %.4f seconds\n", duration);
  }

  private static void loadData(String fileName)
  {
    try
    {
      FileInputStream in = new FileInputStream(fileName);
      FileChannel chanel = in.getChannel();
      if(chanel.size() < ARRAY_SIZE_BYTES)
      {
        System.out.println("File to small");
        chanel.close();
        System.exit(2);
      }
      IntBuffer buffer = chanel.map(FileChannel.MapMode.READ_ONLY, 0, ARRAY_SIZE_BYTES).order(ByteOrder.nativeOrder()).asIntBuffer();
      buffer.get(data);
      chanel.close();
      in.close();
      buffer = null;
      chanel = null;
      in = null;
    }
    catch(IOException ex)
    {
      System.out.println("Error reading file: " + ex);
      System.exit(2);
    }
    
    System.gc();
    System.gc();
    System.gc();
  }

  private static void quickSort(int L, int R)
  {
    int i, j;
    int x, t;

    while(L < R)
    {
      x = data[L];
      i = L;
      j = R;
      while(i <= j)
      {
        while(data[i] < x)
          i++;

        while(x < data[j])
          j--;

        if(i <= j)
        {
          t = data[i];
          data[i] = data[j];
          data[j] = t;

          i++;
          j--;
        }
      }

      if( (j - L) > (R - i) )
      {
        quickSort(i, R);
        R = j;
      }
      else
      {
        quickSort(L, j);
        L = i;
      }
    }
  }
}


А вот генератор тестовых данных:
Код
import java.security.SecureRandom;
import java.io.FileOutputStream;
import java.io.*;

public class TestDataGenerator
{
  private final static int BUFFER_SIZE = 8 * 1024;

  public static void main(String[] args)
  {
    if(args.length < 1)
    {
      System.out.println("usage: java Test <file_name>");
      System.exit(1);
    }
    
    SecureRandom rnd = new SecureRandom();
    
    byte[] buffer = new byte[BUFFER_SIZE];
    int leftToWrite = Test.ARRAY_SIZE_BYTES;
    try
    {
      FileOutputStream out = new FileOutputStream(args[0]);
      while(leftToWrite > 0)
      {
        rnd.nextBytes(buffer);
        out.write(buffer, 0, Math.min(leftToWrite, BUFFER_SIZE));
        leftToWrite -= BUFFER_SIZE;
      }
      out.close();
    }
    catch(IOException ex)
    {
      System.out.println("Error writeng file: " + ex);
      System.exit(2);
    }
  }
}


Теперь о тестах. Первый раунд Java выиграла нокаутом на первой секунде матча smile
Coocky ты чего там намудрил с загрузкой из файла? Запускаю программу и она у меня на этапе загрузки данных Please wait! Open your file!!! висит 5 минут, загрузка ядра по диспетчеру задач 100%?

З.Ы. Java загружает данные за 0,9690 секунды smile

Автор: Coocky 4.10.2005, 15:56
Цитата(LSD @ 1.10.2005, 22:32)
Java загружает данные за 0,9690 секунды

Интересно, а какой у тебя размер файла, в котором записано 39999996 элементов по 4 байта? smile

Автор: Бонифаций 4.10.2005, 16:50
примерно 156 мегабайт

Автор: LSD 4.10.2005, 17:03
Цитата(Coocky @ 4.10.2005, 16:56)
Интересно, а какой у тебя размер файла, в котором записано 39999996 элементов по 4 байта?

Если верить Windows: размер 159 999 984 bytes, на диске 160 002 048 bytes smile

Это время конечно не после первого запуска, данные сидят в кеше (столько данных, за такое время, диск не в состоянии прочитать). Но попробую сделать это после перезагрузки.

Автор: Бонифаций 4.10.2005, 17:08
я пробовал. Вот два запуска. первый после перемонтирования раздела (т.е. без кэша), второй соответсвенно уже с кешем

bash-2.05b$ /opt/java/bin/java -Xmx200m Test DT
We are here:
Load array 4.197 seconds

Sort array 13.562 seconds

bash-2.05b$ /opt/java/bin/java -Xmx200m Test DT
We are here:
Load array 0.646 seconds

Sort array 13.976 seconds

А вот что показала сишная программа (слегка модифицированная чтобы загрузка нормально работала)

./testcc DT
New memory...Please wait..
Please wait! Open your file!!!
Ok! I've eaten it!!!!!11
Sort array 9.43 seconds

Автор: LSD 4.10.2005, 17:13
Бонифаций
Попробуй запустить JVM как серверную (-server).

Автор: Бонифаций 4.10.2005, 17:22
bash-2.05b$ /opt/java/bin/java -Xmx200m -server Test DT
We are here:
Load array 4.559 seconds

Sort array 12.015 seconds

bash-2.05b$ /opt/java/bin/java -Xmx200m -server Test DT
We are here:
Load array 0.657 seconds

Sort array 12.277 seconds


Автор: Бонифаций 5.10.2005, 17:13
Цитата(LSD @ 1.10.2005, 22:32)
Программу Coocky на Java я перевел:
....
З.Ы. Java загружает данные за 0,9690 секунды smile

Я переделал С++ программу так, как мне кажется правильным. (приаттачено) Скажу сразу, я юниксовый житель и писал (и пробовал) под юниксы. Windows ветку я написал " исходя из здравого смысла и общей эрудиции", но не пробовал. У кого есть желание - welcome.


Автор: Дельф 24.11.2005, 21:09
http://weblogs.java.net/blog/opinali/archive/2005/11/mustangs_hotspo_1.html

Давайте по этому поводу прогоним тесты по новой. Выложите кто-нибудь .classы на www.ultrashare.net

Автор: mndkr 24.12.2005, 00:29
Уважаемые защитники Java, вы же понимаете, что претензии к Java-приложениям заключаются не столько в скорости вычислений, сколько в работе графического интерфейса пользователя. Работа Java-приложений с rich GUI на маломощных машинах ощутимо медленнее, чем работа приложений, откомпилированных в native код под конкретную ОС. (Эта пресловутая JIT-compilation тут не сильно, видимо, помогает). Тормозной интерфейс сильно портит впечатление от Java-программ. На ваших Р4 это, может быть, и незаметно, а в будущем эта проблема в связи с ростом производительности процессоров вообще исчезнет, но сейчас далеко не у каждого стоит проц с частотой в 3 ГГц.

Автор: Domestic Cat 24.12.2005, 10:39
Цитата(mndkr @ 23.12.2005, 15:29)
На ваших Р4 это, может быть, и незаметно, а в будущем эта проблема в связи с ростом производительности процессоров вообще исчезнет, но сейчас далеко не у каждого стоит проц с частотой в 3 ГГц.

Тогда приводи конкретные данные - на какой машине что и как тормозит. Потому что с P2 Java программы с гуем довольно трудно отличить от нативных.

Автор: Zandr 27.12.2005, 10:50
Domestic Cat, согласен

Автор: хочу работать с Java 12.1.2006, 23:50
Господа, хотелось бы услышать мнения о работе в Java с плавающей точкой. На рсдн, в тестах, приводятся просто потрясающие результаты Java по этому направлению - Java ставят в один ряд с VB. Неужели всё так плохо?

Автор: LSD 13.1.2006, 00:02
Цитата(хочу работать с Java @ 12.1.2006, 23:50 Найти цитируемый пост)

Господа, хотелось бы услышать мнения о работе в Java с плавающей точкой. На рсдн, в тестах, приводятся просто потрясающие результаты Java по этому направлению - Java ставят в один ряд с VB. Неужели всё так плохо?

Ха! А что ты хотел от этого оплота Майкрософта smile

Накидай пару тестиков и сравни, вопрос только с чем? С C++, C#, VB.NET или что еще?
Java код написать не проблема.

Автор: jer1 16.1.2006, 15:54
взял программу Коть и запустил у себя
Вот программы которые я использовал:
Код
#include <stdio.h>
#include <time.h>

const int N = 1000000;

unsigned int f;
unsigned int factorial (unsigned int a);
main()
{   
    clock_t t1 = clock();
    int i;
    for (i = 0; i < N; i++)
    {
        f = factorial(100);
    }
    clock_t t2 = clock();
    printf("\n Program execution time is %u milliseconds \n", (t2 - t1) * 10);

unsigned int factorial(unsigned int a)
{
    if (a == 1) return 1;
    else 
    {
        a *= factorial(a - 1);
        return a;
    }
}

Код

public class JavaSpeedTest {
    public static final int COMPUTE_COUNT = 1000000;

    public static void main(String [] args)
    {
        long t1 = System.currentTimeMillis();
        int f = 0;
        for (int i = 0; i < COMPUTE_COUNT; i++)
        {
            f = factorial(100);
        }

        System.out.println("\n Program execution time is " + (System.currentTimeMillis() - t1) + 
                                      "   milliseconds");    
    }

    public static int factorial(int a) 
    {
    if (a == 1) return 1;
        else 
        {
            a *= factorial(a - 1);
            return a;
        }
    }
}

Код

program DelphiSpeedTest; //Delphi 5.62
{$APPTYPE CONSOLE}
uses
  SysUtils;

const
    COMPUTE_COUNT: integer = 1000000;

    function factorial(a: integer): integer; begin
        if (a = 1) then factorial := 1
        else begin
            a := a * factorial(a - 1);
            factorial := a;
        end;
    end;

var
   i: integer;
   time0, time1 : TDateTime;
   Year, Month, Day, Hour, Min, Sec, MSec: Word;
   f: integer;
begin
   time0 := now;
   for i := 0 to COMPUTE_COUNT do f := factorial(100);
   time1 := now;
   DecodeTime(time1 - time0, Hour, Min, Sec, MSec);
   write('Program execution time is ');
   write(intToStr(1000*sec+mSec)); write(' in miliseconds');
end.

компьютер Celeron 1.2 256M os: XP Professional, Linux Slackware ядро 2.4.26
jdk:
java version "1.5.0_04"
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)
Java HotSpot™ Client VM (build 1.5.0_04-b05, mixed mode, sharing)

результаты в миллисекундах (три запуска):
delphi 5: 1141; 1140; 1156
java XP: 1187; 1203; 1187
java linux: 1201; 1189; 1203
java linux server: 685; 696; 705
c (gcc -o test2 CSpeedTest.c ): 19000000; 19000000; 19100000
c(gcc -O3 -o test CSpeedTest.c): 10800000; 11000000; 10800000
gcj (gcj -c -g -O JavaSpeedTest.java; gcj --main=JavaSpeedTest -o GCJSpeedTest JavaSpeedTest.o ): 2815; 2826; 2828

Автор: Бонифаций 25.1.2006, 15:47
Другими словами С получился в тысячи раз медленнее? smile не верю. При всем уважении к java.

Автор: erka 25.1.2006, 17:41
как по мне, clock() не миллисекунды выводит

Смотрим например сюда - http://www.phim.unibe.ch/comp_doc/c_manual/C/MAN/clock.htm

The value returned is the CPU time used so far as a clock_t; to get the number of seconds used, divide by CLOCKS_PER_SEC.

Автор: beartamer 20.3.2006, 16:18
Здравствуйте

Я только начал знакомиться с Java и у меня сразу возник вопрос относительно производительности типичных приложений (допустим Swing), связанный с расходом памяти.

Как я понимаю, для каждого процесса создается экземпляр виртуальной машины и память вместе с процессом-приложением и всеми используемыми библиотеками занимает и jvm. Даже 10 совершенно одинаковых GUI приложений занимают в памяти примерно столько, сколько одно приложение * 10, словно никакого совместного использования библиотек и быть не может.

Это нормально? Может быть я что-то делаю не так? Простейший Sample Swing App из поставки с NetBeans 5.0, будучи запущен в 10 экземплярах, занимает всю мою свободную память на рабочей станции... Трудно себе представить что на рабочей станции будет работать более 5 даже простейших приложений Java - каждое займет по 15-25 мб.

Как-то это отталкивает, что ли.. Скажите как справиться? Срочно требуется идеологическая поддержка smile

P.S. я тут первый раз заглянул, надеюсь никаких традиций древних постом не нарушу

Автор: batigoal 20.3.2006, 16:30
Цитата(beartamer @ 20.3.2006, 17:18 Найти цитируемый пост)
Это нормально? Может быть я что-то делаю не так?

Да, это нормально. Ведь запуском java ... порождается новый процесс, и так для каждого приложения. Если не ошибаюсь, есть возможность запустить несколько десктопных приложений и под одной виртуальной машиной, но как это сделать - не знаю.

Автор: Nobody 21.3.2006, 14:34
Lamer George, Написать свой запускатор, который будет жить в явамашине и дёргать main-методы? smile

Автор: batigoal 21.3.2006, 15:14
Цитата(Nobody @ 21.3.2006, 15:34 Найти цитируемый пост)
Написать свой запускатор, который будет жить в явамашине и дёргать main-методы? smile

А Бог его знает, почему бы и нет. smile

Кстати, вот только что наткнулся в мануале Анта на опцию fork таска java. Она как раз отвечает за запуск приложения в рамках той же JVM, что и Ant, или во внешней. По умолчанию - в одной.

Автор: beartamer 21.3.2006, 15:40
Так всё таки насколько это просто и естественно - запустить пару-тройку приложений разделяющих виртуальную машину и библиотеки классов? А то получается что писать простые пользовательские приложения на Java просто смысла нет - памяти не напасешься...
smile

Автор: kkorsakoff 21.3.2006, 15:49
Блин был какой-то продукт. Не могу вспомнить название. Суть в том, что он стартовал при запуске системы. При запуске java-приложения не создается новая виртуальная машина, а оно запускается внутри той единственной. Получаем большой выигрыш в скорости загрузки. Постараюсь вспомнить.

Автор: batigoal 21.3.2006, 16:18
Цитата(beartamer @ 21.3.2006, 16:40 Найти цитируемый пост)
А то получается что писать простые пользовательские приложения на Java просто смысла нет - памяти не напасешься...

В общем-то, так и есть, если нет необходимости в кросс-платформенности.

Автор: SaDFromSpb 2.6.2006, 18:27
Я в этом треде вычитал такую мысль, что sun'овская ява считается клиентской (потому что не достаточно сбоеустойчивая). Позвольте, господа, а чья же ява считается серверной тогда?

По поводу производительности джаги и си - тут мелькала уже разумная мысль, что в больших проектах критичным становится объем занимаемой памяти. Достаточно ли хорошо и быстро работает автоматический сборщик мусора?
К тому же джага больно жадная до памяти по мелочи. Вроде (хотя надо бы, конечно, проверить) аналоги сишных строк, контейнеров и т.д, на яве занимают больше памяти (хотя бы потому что у них иерархия аж от Object'a у всех).
Затем, при работе со всевозможными очень удобными классами в яве бывают накладные расходы по количеству операций (например объекты класса String во многих местах неявно копируются).
Графический интерфейс в яве очевидно медленнее, чем написанный на "нативном языке" (не надо меня убеждать в обратном, я уж насиделся в IntlliJ IDEA на втором пне).
В общем, я хочу сказать, что реальные работающие приложения не числа фибоначи считают. И интереснее посмотреть на результаты более приближенных к жизни тестов.

ЗЫ: Я против явы ничего против не имею. Ява - это такой "программистский рай", без отслеживания кусков не нужной более памяти и с огромной кучей готового и удобного (Особенно мне понравилось, как здорово в ней воплотили многие паттерны проектирования в графическом интерфейсе).  

Автор: batigoal 2.6.2006, 19:35
Что касается тех проектов, в которых участвовал я - Java-приложения вообще не становились узким местом системы. Как правило, нагрузка ложилась на базу (немалая часть логики находится в ней), и на сеть. А скорость выполнения ява-кода в оптимизации не нуждалась. Впрочем, я уверен, что существуют проекты, для которых именно этот пункт становится камнем преткновения. 

Автор: LSD 3.6.2006, 14:00
Цитата(SaDFromSpb @  2.6.2006,  19:27 Найти цитируемый пост)
Я в этом треде вычитал такую мысль, что sun'овская ява считается клиентской (потому что не достаточно сбоеустойчивая). Позвольте, господа, а чья же ява считается серверной тогда?

Ну во первых такую мысль культивируют ребята из BEA, противопоставля ей свою JRockit. По чистой производительности в вычислительных тестах, она проиграла Sun-овской JVM, а гонять стресс тесты длительностью в недели у меня нет возможности.
Во вторых есть действительно специфичные JVM, например Aurora от Oracle, там специфика в тесной интеграции с сервером. 

Автор: powerOn 14.7.2006, 19:08
Хм... стало жутко интересно, и я накатал тестик, смысл которого скорость создания объекта + вызов метода. 
Код С++ писал под Windows, с использованием MS Visual Studio 6.0 (поскольку другой не имею). На идеальность тест не претендует, поправьте меня если что нет так.

С++:
Код

#include <stdio.h>
#include <conio.h>
#include <windows.h>

class A {
public:
    double calculate(double p1, double p2) {
        return (p1 / p2)/(p1+p2);
    }
};

int main() {
    printf("start...\n");
    long t1 = GetTickCount();
    double res = 0;
    for(int i = 0; i < 10000000; i++) {
        A *a = new A();
        res +=  (a->calculate(i+1, 11));
        delete a;
    }
    long t2 = GetTickCount() - t1;
    printf("res = %f, time = %i \n", res, t2);
    getch();
    return 0;
}


Java: 
Код

public class NewClass {

    public NewClass() {
    }
    public static void main(String[] args) {
        System.out.println("start...");
        double res = 0;
        long t1 = System.currentTimeMillis();
    for(int i = 0; i < 10000000; i++) {
        res += (new A().calculate(i + 1, 11));
    }
        long t2 = System.currentTimeMillis() - t1;
        System.out.println("res = " + res + " time = " + t2);
    }
}

class A {
    public double calculate(double p1, double p2) {
        return (p1 / p2)/(p1+p2);
    }
}


С++: MSVS 6.0 (в настройках оптимизация поставлена на скорость)
Java: 1.5.0_07-b03 (client/server)

Время выполнения (миллисекунды): 
C++ (release) ~ 1297   
Java (client)    ~   422
Java (server)  ~   203


ОС Windows XP Professional sp2
Комп: AMD Athlon 64 X2 4200+ (2.2 гГц) RAM 2 GB

Так что можно сделать выводы, что Java местами даже побыстрее C++ будет  smile . 

Автор: Void 14.7.2006, 19:42
MoonCat, то что при частом создании маленьких объектов GC рулит по сравнению с кучей, было известно давно smile 

Автор: Alexandr87 14.7.2006, 19:44
Слабо вериться. Скорее всего java при компиляции высчитывает значение которое получиться (почему-то мне кажется, что именно так).
Код

    for(int i = 0; i < 10000000; i++) {
        res += (new A().calculate(i + 1, 11));
    }


и просто его выводит, или каким-то подобным макаром. Предлагаю сделать значение 11 случайным и посмотреть, что получиться, в сравнении с с++. 

Автор: powerOn 14.7.2006, 20:50
Цитата(Void @  14.7.2006,  20:42 Найти цитируемый пост)
MoonCat, то что при частом создании маленьких объектов GC рулит по сравнению с кучей, было известно давно smile 

Да я, вообще, еще тот любилеть Америки открывать.  smile 

Цитата(Alexandr87 @  14.7.2006,  20:44 Найти цитируемый пост)
Предлагаю сделать значение 11 случайным и посмотреть, что получиться, в сравнении с с++.  

Хорошо..., правим код:

Java
Код

public class NewClass {
    
    /** Creates a new instance of NewClass */
    public NewClass() {
    }
    public static void main(String[] args) {
        System.out.println("start...");
        double res = 0;
        Random rand = new Random();
        long t1 = System.currentTimeMillis();
    for(int i = 0; i < 10000000; i++) {
        res += (new A().calculate(i + 1, rand.nextFloat() * 100 ));
    }
        long t2 = System.currentTimeMillis() - t1;
        System.out.println("res = " + res + " time = " + t2);
    }
}

class A {
    public double calculate(double p1, double p2) {
        return (p1 / p2)/(p1+p2);
    }
}


C++:
Код

#include <stdio.h>
#include <conio.h>
#include <windows.h>

class A {
public:
    double calculate(double p1, double p2) {
        return (p1 / p2)/(p1+p2);
    }
};

int main() {
    printf("start...\n");
    long t1 = GetTickCount();
    double res = 0;

    for(int i = 0; i < 10000000; i++) {
        A *a = new A();
        res +=  a->calculate(i+1, ((double) rand()/ (double) RAND_MAX) * 100);
        delete a;
    }
    long t2 = GetTickCount() - t1;
    printf("res = %f, time = %i \n", res, t2);
    getch();
    return 0;
}


Время выполнения (миллисекунды): 
C++ (release) ~ 1453   
Java (client)    ~   937
Java (server)  ~   531

Может я в коде где ошибся? Но Java все равно быстрее... 

 

Автор: JUncle 17.7.2006, 20:19
Цитата(SaDFromSpb @  2.6.2006,  18:27 Найти цитируемый пост)
Графический интерфейс в яве очевидно медленнее, чем написанный на "нативном языке" (не надо меня убеждать в обратном, я уж насиделся в IntlliJ IDEA на втором пне).

Есть разумный компромисс - Eclipse SWT. Нативные графические библиотеки.  Собственно, GUI Eclipse на нем сделан.
В Java 6.0 Mustang обещали увеличить производительность GUI до уровня нативных приложений без всяких копромиссов в стиле SWT.

Цитата(SaDFromSpb @  2.6.2006,  18:27 Найти цитируемый пост)
К тому же джага больно жадная до памяти по мелочи. Вроде (хотя надо бы, конечно, проверить) аналоги сишных строк, контейнеров и т.д, на яве занимают больше памяти (хотя бы потому что у них иерархия аж от Object'a у всех).
Затем, при работе со всевозможными очень удобными классами в яве бывают накладные расходы по количеству операций (например объекты класса String во многих местах неявно копируются).


Цитата(SaDFromSpb @  2.6.2006,  18:27 Найти цитируемый пост)
ЗЫ: Я против явы ничего против не имею. Ява - это такой "программистский рай", без отслеживания кусков не нужной более памяти и с огромной кучей готового и удобного (Особенно мне понравилось, как здорово в ней воплотили многие паттерны проектирования в графическом интерфейсе).  

Ну раз против не имеете, и такие разумные доводы за приводите, что же жалуемся? 
Это как в пилотировании самолета - размен скорости на высоту (C - > Java) либо наоборот.
Ничего из ничего не получается. И ничто никуда не пропадает.

Цитата(MoonCat @  14.7.2006,  20:50 Найти цитируемый пост)
Может я в коде где ошибся? Но Java все равно быстрее... 

Вряд ли ошиблись. Все дело в технологии HotSpot. "Узкие места" компилируются в машинный код и оптимизируются по адаптивному алгоритму, включая оптимизацию под конкретно ВАШУ архитектуру процессора (note: если он известен на момент выхода JDK).
(А под какие процессоры может оптимизировать VS 6.0? - ритор. вопрос).
Так что ничего удивительного тут нет.
Кстати, попробуйте еще на VS 7.0 прогнать.  

Автор: Void 17.7.2006, 23:54
Цитата(JUncle @  17.7.2006,  22:19 Найти цитируемый пост)
Вряд ли ошиблись. Все дело в технологии HotSpot.

HotSpot, JIT и прочие радости управляемых сред здесь не при чем. Единственное узкое место в C++ коде здесь — это создание и удаление объекта. В Java это буквально пара инструкций, в C++ — проход по chunck'ам кучи.
В этом легко убедиться, заменив calculate в варианте на Java на статический метод, а в C++ — на свободную функцию. В этом случае VC 7.1 примерно равен Java, а Intel C++ 9.0 обгоняет процентов на 15–20.

Добавлено @ 23:57 
Цитата(JUncle @  17.7.2006,  22:19 Найти цитируемый пост)
Это как в пилотировании самолета - размен скорости на высоту (C - > Java) либо наоборот.

Странно, чего это межконтинентальные лайнеры забираются в стратосферу, а кукурзники летают в пределах 3–4 тыс. м smile 

Автор: JUncle 18.7.2006, 07:45
Цитата(Void @  17.7.2006,  23:54 Найти цитируемый пост)
Странно, чего это межконтинентальные лайнеры забираются в стратосферу, а кукурзники летают в пределах 3–4 тыс. м smile  

Не хочу оффтопить, но это утверждение верно при пилотировании одного конкретного самолета.  smile
Это размен кинетической энергии на потенциальную и наоборот. На этом весь пилотаж и основан, в принципе.
 

Автор: $tatic 16.11.2006, 12:00
Прогнал тест powerOn (без ГСЧ) на Sun Java 1.5.0_06-b05, VC++ 8.0 и .NET 2.0:
Код

using System;
using System.Diagnostics;

namespace SpeedSharp
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Start...");
            double res = 0;
            Stopwatch sw = new Stopwatch();
            sw.Start();
            for (int i = 0; i < 10000000; i++)
            {
                res += (new A().calculate(i + 1, 11));
            }
            sw.Stop();
            Console.WriteLine("res = {0} time = {1}", res, sw.ElapsedMilliseconds);
        }
    }

    class A
    {
        public double calculate(double p1, double p2)
        {
            return (p1 / p2) / (p1 + p2);
        }
    }
}


Результаты:
Java client ~ 800
Java server ~ 471
.NET (release) ~ 735
VC++ (release) ~ 3555

AMD Duron 1300 MHz, 512 Mb DDRAM, WinXP SP2.
У плюсов результат действительно такой - приложение работает ощутимо дольше, чем на остальных платформах.

Такой вопрос - почему существуют отдельно клиент и сервер для джавы? Или возможности серверной версии недостаточны для настольных приложений? Почему Sun не сделала универсальную версию на основе серверной?

Автор: LSD 16.11.2006, 12:06
Цитата($tatic @  16.11.2006,  12:00 Найти цитируемый пост)
Такой вопрос - почему существуют отдельно клиент и сервер для джавы? Или возможности серверной версии недостаточны для настольных приложений? Почему Sun не сделала универсальную версию на основе серверной?

Там разное поведение: для серверной ставится задача максимальной производительности, а для клиентской быстрый старт и минимизация потребления памяти. Например серверная JVM не отдает полученую память вообще, а клиентская отдаст когда в куче будет большой процент свободной памяти.

Автор: unkis 3.12.2006, 15:25
а говорят что java 6 будет только серверной?
Правда ли это?

Автор: powerOn 3.12.2006, 15:46
Цитата(unkis @  3.12.2006,  15:25 Найти цитируемый пост)
а говорят что java 6 будет только серверной?
Правда ли это? 

Нет.

Цитата

C:\Documents and Settings\root>java -version
java version "1.6.0-rc"
Java™ SE Runtime Environment (build 1.6.0-rc-b104)
Java HotSpot™ Client VM (build 1.6.0-rc-b104, mixed mode, sharing)

C:\Documents and Settings\root>java
Usage: java [-options] class [args...]
           (to execute a class)
   or  java [-options] -jar jarfile [args...]
           (to execute a jar file)

where options include:
    -client       to select the "client" VM
    -server       to select the "server" VM
    -hotspot      is a synonym for the "client" VM  [deprecated]

                  The default VM is client.

 smile 

Автор: unkis 3.12.2006, 15:55
Спасибо теперь все ясно.
 smile 
Извиняюсь за оффтоп.

но питаюсь запустить в серверном режиме мою программу а мне тут вот такую ошибку.

Код

C:\>java -server -jar screenClientApplet_1.jar
Error: no `server' JVM at `C:\Java\jre1.6.0\bin\server\jvm.dll'.
  

Проверил действительно такой папки с файлом там нет. Хотя установил JDK 1.6 RC.

Что же тогда устанавливать надо чтобы оно заработало в серверном режиме?

Автор: powerOn 3.12.2006, 17:06
Цитата(unkis @  3.12.2006,  15:55 Найти цитируемый пост)
Хотя установил JDK 1.6 RC.

Ты запуск делаешь на JRE-шной JVM. Запускай именно на JDK-шной java.exe.

Автор: cerf_machine 16.2.2007, 14:41
А в чем заключается принцип игры жизнь, про которую был разговор в начале?

Автор: batigoal 16.2.2007, 14:42
cerf_machine, посмотри пример: http://life.june.com.ua/

Автор: cerf_machine 16.2.2007, 16:57
О, забавно.
Меня совсем недавно друг просил это сделать. Он вычитал из какой-то фантастической книги. Я делал на c++, используя WinAPI, но приоритетная роль была отведена именно узору, который проявлялся в жизненном цикле организмов - пикселей серого цвета на черном фоне.
Если интересно, могу показать.

Автор: VOS 9.3.2007, 17:01
Прикольно все написано, только непонятно откуда такие цифры.

Тест с факториалами пробовал на довольно тормозном в мире C++ компиляторе Borland CBuilder
Код

unsigned  int factorial(unsigned int a)
{
   if (a == 1) return 1;
   else
   {
       a *= factorial(a - 1);
       return a;
   }
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
 unsigned int N = 1000000;
 unsigned int f;

  double d=GetTickCount();
   for (int i = 0; i < N; i++)
   {
       f = factorial(100);
   }
   double d1=(GetTickCount()-d)/1000;
   ShowMessage(d1);

}


У меня получилось 1,079 сек
Если всего лишь объявить вместо unsigned  int factorial(unsigned int a)
unsigned int __fastcall factorial(unsigned int a)
получилось уже 0,857 сек

Тест по созданию большого числа небольших объектов однозначно нечестный для С++. 
Потому что в С++ вы замеряете не только создание, но и удаление объектов (там есть delete a). 
А это минимум в 2 раза увеличивает время. 

Автор: devmstr 9.3.2007, 21:40
Цитата(VOS @  9.3.2007,  17:01 Найти цитируемый пост)
но и удаление объектов (там есть delete a).

А что Вы считаете что JVM объекты вообще не удаляет? У неё что безграничное пространство для действий без ограничений?

Автор: VOS 9.3.2007, 22:58
Я подозреваю, что объекты будут когда-нибудь удалены. Ключевой момент когда. Но очень сомневаюсь, что это происходит в момент замера теста. Я буду Вам благодарен, если Вы расскажите мне в какой момент происходит реальное удаление объектов в Java и как я могу это контролировать.  Замечу также, что показанный здесь способ создания объектов является самым медленным в С++. Обычно, когда Вам нужны часто создаваемые/уничтожаемые небольшие объекты их создают с помощью конструкции 

А a(i);
a.calculate(...);

В этом случае скорость вырастет на порядки, т.к. чтобы создать/уничтожить объект достаточно передвинуть указатель по стеку и все.
Понимаете, даже если поверить, что JIT компилятор неимоверно крут в Java или там в .Net, есть 
еще некоторые особенности этих языков.
Например массивы. И Java и там C# при каждом обращении к какому-нибудь элементу по любому будут проверять на допустимые границы и т.д. 
Я ни в коем случае не говорю, что это плохо в общем смысле. Но это не добавляет производительности в частности. Но именно из-за общего смысла, для мобил я пишу на Java smile И надо отдать должное, мне все больше нравится с Java работать. 

Автор: batigoal 10.3.2007, 10:14
Цитата(VOS @  9.3.2007,  23:58 Найти цитируемый пост)
Я буду Вам благодарен, если Вы расскажите мне в какой момент происходит реальное удаление объектов в Java и как я могу это контролировать.

Благодарности мы не дождёмся - это процесс непредсказуемый smile

Автор: maxim1000 10.3.2007, 12:03
Зато можно с увереностью отодвинуть процесс удаления smile
можно изменить тест так:
в C++ только создавать объекты
в Java создавать объекты и использовать их потом (чтобы сборщик мусора не удалил их сразу)
и замерить только время создания в обеих программах...

Добавлено @ 12:05 
а вот время удаления, скорее всего и не получится сравнить из-за этой самой непредсказуемости (хотя яслышал, что можно принудительно вызывать сборщик, но ведь он может начать собирать и другие какие-то вещи)

Автор: batigoal 10.3.2007, 12:12
Цитата(maxim1000 @  10.3.2007,  13:03 Найти цитируемый пост)
хотя яслышал, что можно принудительно вызывать сборщик, но ведь он может начать собирать и другие какие-то вещи

Можно попробовать, но без гарантий, что он действительно вызовется.

Автор: VOS 10.3.2007, 14:49
Еще несколько слов по поводу тестов. Мне кажется сам подход, который пытаются здесь применить - неверен. Вы сначала пишете тест на Java, а потом просто копируете его как код C++.
Не выполнив даже элементарные "косметические" действия как в примере с __fastcall 
Это в корне неверный подход. Хотите получить реальные тесты по производительности, пригласите специалиста в C++. Поставьте ему задачу и пусть он ее сделает любыми доступными ему средствами в C++, а Вы выполните ее любыми доступными средствами в Java. Естественно исходники должны быть открыты и доступны всем участникам. Возможно даже Вы сможете заинтересовать смежный форум по С++ и получится даже некое межфорумное соревнование  smile Ну и конечно, например 5-10 тестов должны быть от форумчан С++ и 5-10 от поклонников Java. 

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

Автор: LSD 10.3.2007, 17:49
Цитата(VOS @  10.3.2007,  14:49 Найти цитируемый пост)
Это в корне неверный подход. Хотите получить реальные тесты по производительности, пригласите специалиста в C++. Поставьте ему задачу и пусть он ее сделает любыми доступными ему средствами в C++, а Вы выполните ее любыми доступными средствами в Java. Естественно исходники должны быть открыты и доступны всем участникам. Возможно даже Вы сможете заинтересовать смежный форум по С++ и получится даже некое межфорумное соревнование   Ну и конечно, например 5-10 тестов должны быть от форумчан С++ и 5-10 от поклонников Java. 

Уже приглашали: Coocky и Chipset-а, до конца так и не довели. Если есть охота займись.
А вообще есть раздел "Наши тесты" там и тема соответсвующая есть.

Автор: $tatic 18.3.2007, 22:36
Вы уже, наверное, видели мою тему в тестах о бенчмарке OpenGL на Java и C++. Сейчас уже есть один человек, который согласился написать код на C++. Правда он копирует мой весьма неоптимизированный (в плане графики, да и обхода дерева мешей) код на Java. Если кто-то хочет присоединиться - пожалуйста. Правда лично мне кажется, что производительность реальных графических приложений будет примерно одинакова - графика сейчас больше видеокартой обсчитывается, а не процессором.
Да и еще, есть такие игры как ИЛ2-Штурмовик, Chrome, Xtreme Rally (неплохой автосимулятор кстати, даже на небыстром компе летал), Закон и порядок. В них логика (все кроме графики) делалась на яве, а графический движок на C++. И ничего, геймеры не заметили в принципе. ;)

Автор: SaDFromSpb 19.3.2007, 03:53
Цитата($tatic @  18.3.2007,  22:36 Найти цитируемый пост)
Да и еще, есть такие игры как ИЛ2-Штурмовик, Chrome, Xtreme Rally (неплохой автосимулятор кстати, даже на небыстром компе летал), Закон и порядок. В них логика (все кроме графики) делалась на яве, а графический движок на C++. И ничего, геймеры не заметили в принципе. ;) 

Вот удивил, так удивил!... Это достоверная инфа?

VOS, +1.  
Действительно, многие сравнения не честны. В серверной джаве наверняка политика менеджера памяти сильно отличается от С++сных реализаций. Там, например, память вполне может выделяться большими блоками, которые по-тихоньку заполняются, к тому же удаляется это все дело фиг знает кода. В си, во-первых у тебя есть выбор, какую память выделять, во-вторых есть замечательная возможность с легкостью создать собственный менеджер памяти (или просто взять альтернативный, например, из библиотеки <locki> ), который будет несоизмеримо эффективнее по сравнению со стандартной операцией new для маленьких объектов. Так же есть возможность явно рекомендовать компилятору хранить определенную переменную в регистре и т.д. и т.п. (хотя это уже тонкий напильник....)  В яве всех этих возможностей нет, скажем так, по определению.
Так что, абсолютно уверен, что при небольшом желании на сях можно обогнать серверную джаву в любой задаче, если руки растут откуда надо.

Автор: SaDFromSpb 19.3.2007, 07:55
Ну может быть, еще компилятор для с++ половчее поискать прийдется для этого  smile 

Автор: LSD 19.3.2007, 15:12
Цитата(SaDFromSpb @  19.3.2007,  03:53 Найти цитируемый пост)
Так что, абсолютно уверен, что при небольшом желании на сях можно обогнать серверную джаву в любой задаче, если руки растут откуда надо.

А при определенных усилиях на асме можно обогнать любой Си smile 

Вот только в больших проектах возможности вылизывать каждую строчку кода - нет.

Автор: Бонифаций 19.3.2007, 15:16
Цитата(SaDFromSpb @  19.3.2007,  03:53 Найти цитируемый пост)
Действительно, многие сравнения не честны. В серверной джаве наверняка политика менеджера памяти сильно отличается от С++сных реализаций


Я не согласен с таким определением честности. Если ява действует разумнее при распределении памяти, это ее достоинство. Так что если мы пишем один и тот-же алгоритм на C++/java и java обгоняет - то в этом тесте она победила. независимо от того, кто как управляет своими ресурсами.


Автор: SaDFromSpb 19.3.2007, 15:31
Цитата(Бонифаций @  19.3.2007,  15:16 Найти цитируемый пост)
Я не согласен с таким определением честности. Если ява действует разумнее при распределении памяти, это ее достоинство. Так что если мы пишем один и тот-же алгоритм на C++/java и java обгоняет - то в этом тесте она победила.

Как тут уже сказали, проблема в том, что во многих примерах код явы просто скопировали на с++ и изменили, чтоб скомпилиось. Именно это не честно, потому что если бы человек изначально "думал" на си++, он бы реализовал решение по другому. Эту мысль высказал VOS, а я с ней согласился и добавил свою догадку об одной из причин обгона джавой сей в случае этих примеров.




Цитата(LSD @  19.3.2007,  15:12 Найти цитируемый пост)

Вот только в больших проектах возможности вылизывать каждую строчку кода - нет. 


Чем ты профессиональнее в конкретном языке, тем ты лучше пользуешся его естестественными возможностями. Поэтому у профессионалов опереденная "вылизанность" получается автоматически. 

Автор: LSD 19.3.2007, 15:41
Цитата(SaDFromSpb @  19.3.2007,  15:31 Найти цитируемый пост)
Чем ты профессиональнее в конкретном языке, тем ты лучше пользуешся его естестественными возможностями. Поэтому у профессионалов опереденная "вылизанность" получается автоматически.

Особенно использование сторонних менеджеров памяти smile 

Автор: $tatic 19.3.2007, 19:57
Цитата(SaDFromSpb @  19.3.2007,  04:53 Найти цитируемый пост)
Вот удивил, так удивил!... Это достоверная инфа?

Это достоверная инфа, правда игру Закон и порядок я к сожалению "не щупал". Но Chrome и Xtreme Rally сделаны одной фирмой на одном и том же движке. А Chrome выиграл даже конкурс от Sun Microsystems.

Автор: JUncle 19.3.2007, 23:29
Цитата(LSD @  19.3.2007,  15:12 Найти цитируемый пост)
Вот только в больших проектах возможности вылизывать каждую строчку кода - нет. 

А особенно при использовании agile методологий,  где предпочтительнее прозрачный код чем мифическое ускорение на три наносекунды  smile 

Автор: SaDFromSpb 20.3.2007, 03:44
Цитата(LSD @  19.3.2007,  15:41 Найти цитируемый пост)
Особенно использование сторонних менеджеров памяти smile 

Если прийдешь к осознанию, что это нужно, то это дело пяти минут (если, конечно, не самому писать).

Цитата(JUncle @  19.3.2007,  23:29 Найти цитируемый пост)
А особенно при использовании agile методологий,  где предпочтительнее прозрачный код чем мифическое ускорение на три наносекунды

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

Тут у нас религиозная война не начинается, случаем?  smile 

Автор: VOS 20.3.2007, 10:23
В связи с тем, что дискуссия продолжилась, я все же решил переписать тест на создание большого кол-ва небольших объектов.
Времени особо раздумывать нет, поэтому вариант вряд ли самый быстрый.

Итак первоначальный тест:

Код

  //Первый, самый тормозной способ (6781 мс, без delete с - 2875 мс)
  double d = GetTickCount();
  A* c;
  double r=0;
   for (int i=0;i<10000000;i++)
    {
      c=new A;
      r+=c->TT(i,i+1);
     delete c;
    }
   d=(GetTickCount()-d);
   ShowMessage(d);
   ShowMessage®;


Код

//Слегка измененный.  

 //Другой способ. Кол-во объектов динамическое, время - 421 мс
  double d = GetTickCount();
    A* b;
   //Выделить сразу пул памяти под объекты
   //Теперь pull указывает на группу подряд расположенных объектов
    A* pull = new A[10000000];

   //<Отвлечение>
   //В более общем случае лучше переопределять new в классе A
   //тогда можно составить связной список и выделять память по мере надобности
   //сразу кусками по SIZE элементов. При этом оставив возможность "удалять" отдельные объекты.
   //Конечно, реальная память из пула удаляться не будет, но на то он и пул :)
   //Или вести списки с такими кусками объектов. Притом можно разных типов, главное чтобы они были от одного предка.
   //Возможно в Java используют примерно такой способ. А сборщик мусора "упаковывает"
   //объекты в эти "куски", по мере надобности освобождая память сразу целыми кусками.
   //Недаром он там че-то, где-то помечает и приоритеты расставляет.
   //Скорее всего указатели в списке перетыкает :) 
   //Но память при этом он расходует естественно больше. Более того, подозреваю что блоки он выделяет бинарно, т.е.
   //например 1024, израсходовал, то след. блок сразу 2048, потом 4096 и т.д. (Подчеркиваю это IMHO) 
   //</Отвлечение>

   //Если же объекты часто исчезают и появляются, то лучше всего через
   // A a;


  double r=0;
  for (int i=0;i<10000000;i++)
    {
      //Обращаться к элементам теперь можно так:
      r+=pull[i].TT(i,i+1);
      //или так
//      b = pull+i;
//      r+=b->TT(i,i+1);
     //Или так
//      r+=(pull+i)->TT(i,i+1);
    }
   d=(GetTickCount()-d);
   ShowMessage(d);
   ShowMessage®;
   delete [] pull;


Первый тест - 6781 мс
Второй         - 421 мс

Комп - P4  2,4 Ггц  512 МБ
На нем запущен CBuilder, NOD, MS SQL, Oracle, Firebird и т.д. (лень выгружать было)

Автор: LSD 20.3.2007, 12:05
Цитата(VOS @  20.3.2007,  10:23 Найти цитируемый пост)
Первый тест - 6781 мс
Второй         - 421 мс

Это сферический конь в вакуме. Смысл имеют только относительные результаты.

Что же касается кода, то второй пример ни разу не эквивалентен первому. Т.к. во втором случае мы не можем освобождать память по мере необходимости, и если из 10 000 000 объектов нам нужен будет только один, то мы будем держать всю память занятой.

P.S. Не верю я что на машине с 512 Мб памяти и такой толпой запущенных программ:
Цитата(VOS @  20.3.2007,  10:23 Найти цитируемый пост)
На нем запущен CBuilder, NOD, MS SQL, Oracle, Firebird и т.д.

можно комфортно работать. Те же MS SQL и Oracle, памяти жрут немерянно.

Автор: VOS 20.3.2007, 14:52
Цитата

Это сферический конь в вакуме. Смысл имеют только относительные результаты


Изволите за ЦСКА болеть?
Согласен конечно. Но относительные результаты думаю очевидны.

Цитата

Что же касается кода, то второй пример ни разу не эквивалентен первому. Т.к. во втором случае мы не можем освобождать память по мере необходимости, и если из 10 000 000 объектов нам нужен будет только один, то мы будем держать всю память занятой.


Я не претендую на это. Всего лишь показал как решить конкретную задачу - быстро создать в куче много небольших объектов.
Реализация механизма, о котором я упомянул во втором примере, позволит и удалять отдельные объекты, но 
его реализовывать только ради теста у меня нет времени.

Цитата

 Не верю я что на машине с 512 Мб памяти и такой толпой запущенных программ...

Это если их активно юзать. Если только хранимки править, то не особо напрягает. А вот когда еще среда разработки для Java запускается, вот тогда не сладко smile Но на Java я пока только под мобилы пишу. Впечатления самые положительные. 

Автор: alexsolo 5.4.2007, 19:32
Цитата(VOS @ 10.3.2007,  14:49)
Это в корне неверный подход. Хотите получить реальные тесты по производительности, пригласите специалиста в C++. Поставьте ему задачу и пусть он ее сделает любыми доступными ему средствами в C++, а Вы выполните ее любыми доступными средствами в Java. Естественно исходники должны быть открыты и доступны всем участникам. 

Вот шикарный тест из LZMA SDK и Java и C# и оптимизтрованный C++ и Delphi:

http://www.mycoolfotos.com/lzma/lzma443_test.zip Данные прогона на моих компах smile

Код


           Compression                Decompression  

P4 2.6 GHz
~~~~~~~~~~
C++        918 KB/s   1081 MIPS       10261 KB/s   1034 MIPS
Delphi7    645 KB/s    759 MIPS        6410 KB/s    629 MIPS
Java 1.6   608 KB/s    716 MIPS        7026 KB/s    690 MIPS
C#         588 KB/s    692 MIPS        9230 KB/s    930 MIPS

AMD64 3000+ 2 Ghz
~~~~~~~~~~~~~~~~~
C++       1369 KB/s   1612 MIPS       18505 KB/s   1865 MIPS
Java 1.6   890 KB/s   1048 MIPS       11013 KB/s   1082 MIPS
Delphi10F  796 KB/s    937 MIPS        9961 KB/s    978 MIPS
Delphi7    770 KB/s    906 MIPS        9466 KB/s    930 MIPS
C#         757 KB/s    891 MIPS       13833 KB/s   1394 MIPS

INTEL M760 2 Ghz
~~~~~~~~~~~~~~~~
C++       1346 KB/s   1585 MIPS       18831 KB/s   1898 MIPS
Java 1.6   873 KB/s   1028 MIPS        9888 KB/s    971 MIPS
Delphi7    820 KB/s    966 MIPS        7895 KB/s    775 MIPS
C#         784 KB/s    924 MIPS       12307 KB/s   1240 MIPS

Core Duo E6600 2.4 GHz - 1 Core
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
C++       1970 KB/s    2320 MIPS      20490 KB/s   2065 MIPS 
Java 1.6  1224 KB/s    1442 MIPS      13315 KB/s   1308 MIPS
Delphi10F 1142 KB/s    1345 MIPS      10745 KB/s   1055 MIPS
C#        1087 KB/s    1280 MIPS      15465 KB/s   1559 MIPS
Delphi7   1063 KB/s    1252 MIPS       9817 KB/s    964 MIPS

Автор: LSD 5.4.2007, 21:04
alexsolo

1. Откуда исходники и под какой лицензией они распространяются?
2. Кто писал код?

Автор: Void 5.4.2007, 21:08
LSD, http://www.7-zip.org/sdk.html
Try for yourself smile

Автор: _Nikolas_ 12.4.2007, 18:38
Не вижу ничего удивительного что жава работает с обычными числами по скорости как С/С++.
По моему основные тормаза по сравнению с С/С++ жаве добавляет ядреное ООП. Всетки большинство реальных приложений на жаве работают заметно медленее их аналогов на С++ и едят больше памяти.

Автор: Се ля ви 20.4.2007, 17:01
В продолжение спора о BEA JRockit. Я продолжаю утверждать, что эта JVM лучше подходит для production-mode J2EE - приложений, даже если они крутятся не на WebLogic`е.

Вот, буквально на днях они http://forum.vingrad.ru/forum/topic-146750/anchor-entry1103225/0.html.

В качестве примера я взял на своём рабочем компе (P4, 2.8 GHz, 1GB  RAM, WinXP sp2) и протестировал старт сервера JBoss 4.0.5 под последними 5-ми и 6-ми версиями на данный момент. Ничего не настраивал, просто скачал и развернул архив. Результаты такие:

JRockit 6:
Цитата
17:34:22,776 INFO  [ServerInfo] Java VM: BEA JRockit® R27.2.0-131-78843-1.6.0-20070320-1457-windows-ia32,BEA Systems, Inc.
...
17:34:42,344 INFO  [Server] JBoss (MX MicroKernel) [4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)] Started in 20s:499ms


JRockit 5
Цитата
17:43:19,878 INFO  [ServerInfo] Java VM: BEA JRockit® R27.2.0-131-78843-1.5.0_10-20070320-1457-windows-ia32,BEA Systems, Inc.
...
17:43:42,060 INFO  [Server] JBoss (MX MicroKernel) [4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)] Started in 23s:323ms


Sun JDK 5:
Цитата
17:49:49,147 INFO  [ServerInfo] Java VM: Java HotSpot™ Server VM 1.5.0_11-b03,Sun Microsystems Inc.
...
17:50:29,275 INFO  [Server] JBoss (MX MicroKernel) [4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)] Started in 40s:849ms


А Sun JDK 6 почему-то вообще с ошибкой свалилась:
Цитата
18:00:17,501 INFO  [ServerInfo] Java VM: Java HotSpot™ Server VM 1.6.0_01-b06,Sun Microsystems Inc.
...
18:00:30,289 ERROR [MainDeployer] Could not create deployment: file:/C:/Java/JBoss4/server/default/conf/jboss-service.xml
org.jboss.deployment.DeploymentException: - nested throwable: (java.lang.reflect.UndeclaredThrowableException)
        at org.jboss.system.ServiceConfigurator.install(ServiceConfigurator.java:196)
        at org.jboss.system.ServiceController.install(ServiceController.java:226)
        at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
        at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
...

Сейчас, разберусь с 6-й JDK - ещё напишу...

Автор: LSD 20.4.2007, 21:55
Как лицензируется JRockit?

Автор: Се ля ви 20.4.2007, 23:28
Дома тоже эта ошибка наблюдалась. Переставил - вроде пошло. Но машина другая (P4 3GHz, 2Gb RAM), так что - всё по-новой:

Sun JDK 6: 
Цитата
00:04:20,359 INFO  [ServerInfo] Java VM: Java HotSpot™ Server VM 1.6.0_01-b06,Sun Microsystems Inc.
...
00:04:42,265 INFO  [Server] JBoss (MX MicroKernel) [4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)] Started in 22s:453ms


Sun JDK 5: 
Цитата
00:11:31,781 INFO  [ServerInfo] Java VM: Java HotSpot™ Server VM 1.5.0_11-b03,Sun Microsystems Inc.
...
00:11:57,562 INFO  [Server] JBoss (MX MicroKernel) [4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)] Started in 26s:328ms


BEA JRockit 6: 
Цитата
00:13:54,047 INFO  [ServerInfo] Java VM: BEA JRockit® R27.2.0-131-78843-1.6.0-20070320-1457-windows-ia32,BEA Systems, Inc.
...
00:14:10,953 INFO  [Server] JBoss (MX MicroKernel) [4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)] Started in 17s:984ms


BEA JRockit 5: 
Цитата
00:16:29,562 INFO  [ServerInfo] Java VM: BEA JRockit® R27.2.0-131-78843-1.5.0_10-20070320-1457-windows-ia32,BEA Systems, Inc.
...
00:16:45,938 INFO  [Server] JBoss (MX MicroKernel) [4.0.5.GA (build: CVSTag=Branch_4_0 date=200610162339)] Started in 17s:422ms


Тоесть у пятёрочки JRockit при избытке памяти производительность даже возросла...


Цитата(LSD @  20.4.2007,  21:55 Найти цитируемый пост)
Как лицензируется JRockit?

http://bea.com/framework.jsp?CNT=index.htm&FP=/content/products/jrockit/ сопровождается текстом: 
Цитата
Freely Available! BEA JRockit is available for free download for evaluation and production use.

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

Я думаю, дело в том, что к JRockit идут дополнительные инструменты для диагностики memory leak`ов  и тюнинга - вот их использование уже вроде бы платно, хотя их тоже можно и скачивать и юзать - но уже в права на них я не вникал...

Автор: Се ля ви 21.4.2007, 02:22
Вот по поводу Tools`овин информация:
Цитата(http://dev2dev.bea.com/jrockit/tools.html)
JRockit Mission Control is currently included in BEA JRockit R27.1 JDK. BEA JRockit can be downloaded from the JRockit Product Center on Dev2Dev. To use the included Mission Control tools, you need to download a suitable license. There are two types of licenses:
    * Developer License - The Developer License is free and allows the tools to be used for 1 hour, after which JRockit must be restarted before running the tools again.
    * Enterprise License - The Enterprise License allows unlimited use of the tools.

Автор: w1nd 22.4.2007, 21:21
Цитата(Се ля ви @  20.4.2007,  17:01 Найти цитируемый пост)
Я продолжаю утверждать, что эта JVM лучше подходит для production-mode J2EE - приложений, даже если они крутятся не на WebLogic`е.

Не считая одной малости: по словам ведущего системного инженера BEA Systems (Мачей Грушка), JRockit стоит использовать только при наличии глубоких знаний о её внутреннем устройстве и способах её настройки. Я могу прокомментировать: эта jmv может на совершенно ровном месте упасть не пискнув или намертво зависнуть, причём частота таких падений/зависаний удручает.

Короче, господа, есть только одна jvm и делают её в sun ;)

Автор: Се ля ви 23.4.2007, 10:20
Цитата(w1nd @  22.4.2007,  21:21 Найти цитируемый пост)
по словам ведущего системного инженера BEA Systems (Мачей Грушка), JRockit стоит использовать только при наличии глубоких знаний о её внутреннем устройстве и способах её настройки.

В следующий раз, когда он приедет в Москву, я его расспрошу об этом по-подробней.


Цитата(w1nd @  22.4.2007,  21:21 Найти цитируемый пост)
могу прокомментировать: эта jmv может на совершенно ровном месте упасть не пискнув или намертво зависнуть, причём частота таких падений/зависаний удручает.

Ну, бывало несколько раз такое дело... Сервак на прошлой работе падал в среднем раз в 2-3 месяца без записей в логах и прочих следов и совершенно независимо от нагрузки. Но это не так уж часто...

А ты уверен, что Sun`овская не упадёт, активно работая в режиме 24/7 через 2-3 месяца без перерыва?

Цитата(w1nd @  22.4.2007,  21:21 Найти цитируемый пост)
Короче, господа, есть только одна jvm и делают её в sun ;)

IBM`овская есть ещё, к примеру...

Автор: w1nd 23.4.2007, 21:20
Цитата(Се ля ви @  23.4.2007,  10:20 Найти цитируемый пост)
А ты уверен, что Sun`овская не упадёт, активно работая в режиме 24/7 через 2-3 месяца без перерыва?

На моей памяти не падала.

Цитата(Се ля ви @  23.4.2007,  10:20 Найти цитируемый пост)
IBM`овская есть ещё, к примеру...

Не поминай всуе, а то ышшо явится smile Её ещё толком не юзал, но приконнектиться к ней из sun'овской по корбе... это такая гимнастика для всех частей тела, что я молчу smile 

Автор: alexsolo 25.4.2007, 00:35
Возвращаясь к бенчмаркам. Сегодня тестируется следующий код:

Код


import java.util.Date;

public class Main {
 
    public static void main(String[] args) {

        int razmer = 12;
        int[] b = new int [30];
 
        long Time1, Time2;
        
        int d,m,min,obmen;
        int nomvar;

        for (d=1; d<=20; d++) b[d] = d;
        
        nomvar = 0;

        Time1 = (new Date()).getTime();

        while (true){
         nomvar++;
         for ( m = razmer; m > 1; m-- ) 
           if (b[m]>b[m-1]) break;
         if (m==1) break;
         obmen = m-1;
         for (min = obmen+1; min <= razmer; min++)
       if ((b[min]<b[m]) && (b[min]>b[obmen])) m = min;
         
         min = b[obmen];
         b[obmen] = b[m];
         b[m] = min;
         
         for (d = obmen+1; d < razmer; d++)
         {
            m = d;
            for ( min = d + 1; min <= razmer; min++ )
              if ( b[min] < b[m] ) m = min;
            
            min = b[m];
            b[m] = b[d];
            b[d] = min;
         };
            
            
        }
    
     System.out.println("Count: " + nomvar );   
     Time2 = (new Date()).getTime();
     System.out.println("Time: " + (Time2 - Time1) + " (ms)" );   
        
    }
}


Результаты забегов:
Код


Intel Core Duo E6600 (3.1 Ghz)

Intel C++      3531 ms
Delphi10 proc      3625 ms
C++Builer         4360 ms
VC++ 2005      4469 ms
Delphi10 goto      4519 ms
Delphi10 repeat   5172 ms
C#                5300 ms
Java 1.6         10234 ms


AMD Athlon 64 3000+ (2 Ghz)

Intel C++      8328 ms
Delphi10 proc      8875 ms
Delphi10 goto      9157 ms
C++Builer         9400 ms
VC++ 2005     10656 ms
C#               11375 ms
Delphi10 repeat  11391 ms
Java 1.6         16000 ms


INTEL M760 (2 Ghz)

Intel C++      7187 ms
Delphi10 goto      7344 ms
Delphi10 proc      8046 ms
Delphi10 repeat   8500 ms
C++Builer         8550 ms
VC++ 2005      8640 ms
Java 1.6         20900 ms


P4 (2.6 Ghz)

Intel C++     7484 ms
Delphi10 goto     7813 ms
C++Builer        7907 ms
Delphi10 proc     9141 ms
Delphi10 repeat  9422 ms
VC++ 2005    10344 ms
C#              12031 ms
Java 1.6        17312 ms


Исходники + бинарники:
http://www.mycoolfotos.com/lzma/repeat_goto.zip (371 KB)


Автор: nornad 25.4.2007, 01:55
Цитата(alexsolo @  25.4.2007,  03:35 Найти цитируемый пост)
Результаты забегов:

Не понял, к чему это? то должны показать эти результаты?
То, что мобильный проц медленнее? И так понятно. То, что одноядерный АМД 2ГГц медленне двуядерного интела 3ГГц?

Просветите уж, для выявления чего сделан тест. И причём тут медленность жабы.

Автор: LSD 25.4.2007, 14:25
А что вообще за алгоритм, то? И почему такая странная инициализация массива?

Автор: NotGonnaGetUs 25.4.2007, 18:18
Источником этих тестов служит обсуждение на http://sql.ru/forum/actualthread.aspx?tid=412782&pg=8.

Один и тот же алгоритм генерации перестановок копировался один в один с языка на язык и замерялось время работы.

Из этих замеров видно, что java сильно проигрывает другим языкам, когда нужно проводить неочевидные манипуляции с элементами массивов.

Увидив это, я предложил другой алгоритм решения той же самой задачи и протестировал его на java/c#.
Оказлось, что теперь java в полтора раза быстрее с#. Это довольно занимательный факт.

Ну и, к слову говоря, модифицированный алгоритм выполянется на java в несколько раз быстрее, чем исходный алгоритм на с++ собранный компилятором от интелл.

Автор: VOS 25.4.2007, 19:51
Полагаю, что в конечном счете код, сгенерированный JIT-компилятором будет более быстрым, чем код сгенерированный классическим компилятором. В классике код генерируется один раз и, соответственно, остается постоянным.
JIT-компилятор же может в зависимости от внешних условий генерировать "изменяемый" код, а значит теоретически и более быстрый. 
Думаю особенно заметно это может быть в приложениях, которые должны работать в режиме 24X7 с надежностью не менее 99,99%
(не более нескольких часов в год простоя).
Там будет возможность собрать статистику вызовов и т.д., чтобы сгенерировать более оптимальный код для часто вызываемых функций, заменить их на inline, параметры не через стек, а в регистах , перегенерить так, чтобы часто отрабатываемый код целиком помещался во внутренний кеш конкретного проца, корректировать механизм выделения памяти и т.д. 

Аналогию можно провести с хранимыми процедурами. Работают быстро, потому что хранимка вроде как "скомпилирована". По большому счету это значит, что уже построен и сохранен план запроса. Соответственно выбраны индексы и т.д. Но это не всегда здорово, т.к. например на момент создания хранимки таблица A, участвующая в запросе содержала всего 15 записей, и план запроса оптимизатором строился исходя из этого. После месяца работы таблицу A раздуло и все, сохраненный план может быть уже далеко не оптимален.

Я это к тому, чтобы не удивлялись поклонники Delphi, а потом и С++ " как это интерпретируемый Java обогнал по скорости компилируемый
Delphi/C++/...".  Это вполне возможно для некоторых классов задач.

Автор: batigoal 25.4.2007, 21:39
В теории это звучит заманчиво, но реализуют ли сейчас интерпретаторы такую функциональность?

Автор: Platon 27.10.2007, 17:50
Подолью огонька в диалог.
Стоит ли использовать технологию, которую потом приходится обвешивать всяческого рода native библиотеками (мягко намекая на GUI Swing и SWT), тогда уж действительно слогон "compile once - run everywhere" становится не актуальным, более того начинает проигрывать девизу "write once - compile everywhere", хотя справедливости ради замечу, что в 1.5 версии отрисовка GUI становится сносной, а в 1.6 даже шустрой.

Автор: w1nd 27.10.2007, 18:47
Цитата(Platon @  27.10.2007,  17:50 Найти цитируемый пост)
Стоит ли использовать технологию, которую потом приходится обвешивать всяческого рода native библиотеками (мягко намекая на GUI Swing и SWT), тогда уж действительно слогон "compile once - run everywhere" становится не актуальным, более того начинает проигрывать девизу "write once - compile everywhere", хотя справедливости ради замечу, что в 1.5 версии отрисовка GUI становится сносной, а в 1.6 даже шустрой.

Честно говоря, не осилил. Что вы хотели сказать?

Автор: nornad 28.10.2007, 05:54
Platon, не надо нас переманивать с Java на другие платформы. smile
GUI даже на 1.4 можно было нарисовать так, чтобы он особенно не тормозил. Просто, большинство программистов знало, как что-то реализовать в принципе, но не знало, как именно это лучше сделать, чтобы не добавлять лишних тормозов.

Автор: Platon 28.10.2007, 12:21
w1nd, другими словами хочу сказать, что проще программировать на C++ с помощью Qt, иметь абсолютно родное приложение, при этом написать код один раз и скомпилировать его посредством разных компиляторов.


nornad, в поисках истины прибегаю и к критике. Не могу сказать, что переманиваю, скорее сказать,  прошу, чтоб успокоили и переубедили.
Цитата(nornad @  28.10.2007,  05:54 Найти цитируемый пост)
GUI даже на 1.4 можно было нарисовать так, чтобы он особенно не тормозил.

На это могу сказать так, что даже если ты плохо программируешь, в родном приложении тормозов можно не заметить, но на Java у тебя постоянная необходимость в том, чтобы весь код был максимально оптимизирован. Это изречение безусловно двояко, можно сказать, что код и так должен быть оптимизированным, НО и можно сказать, что GUI приложения завоевали себе неважную славу. 

ЗЫ: Используя метод от противного. Если принять за истину, что GUI-приложения на Java работают быстро, то нет необходимости в разработке родных GUI-библиотек, что противоречит действительности. => GUI-приложения медленные. ЧТД

Автор: nornad 28.10.2007, 16:21
Цитата(Platon @  28.10.2007,  15:21 Найти цитируемый пост)
хочу сказать, что проще программировать на C++ с помощью Qt, иметь абсолютно родное приложение, при этом написать код один раз и скомпилировать его посредством разных компиляторов.

А ты в курсе, сколько стоит Qt?  smile 

Цитата(Platon @  28.10.2007,  15:21 Найти цитируемый пост)
ЧТД

Малость абстрактно и притянуто за уши, но я скорее согласен, чем нет. smile

Автор: Platon 28.10.2007, 16:26
Цитата(nornad @  28.10.2007,  16:21 Найти цитируемый пост)
А ты в курсе, сколько стоит Qt?  smile 

В курсе, но там есть некоммерческие релизы + мы же в России живем )))

Цитата(nornad @  28.10.2007,  16:21 Найти цитируемый пост)
Малость абстрактно и притянуто за уши

Можно узнать в каком месте притянуто?

Автор: nornad 28.10.2007, 19:03
Цитата(Platon @  28.10.2007,  19:26 Найти цитируемый пост)
В курсе, но там есть некоммерческие релизы + мы же в России живем )))

Как-то глядел у них на сайте и не видел некоммерческого. Хотя, мог и проглядеть.
А подстрекать к нарушению прав на интеллектуальную собственность не стоит. smile 
Работать же приходится нередко и с зарубежными партнёрами. Ну и ещё. Если твоя программа написана с использованием украденного Qt (или чего другого), то на рынок США, например, соваться с нею проблематично - если будет установлен факт нарушения прав, это грозит кучей неприятностей и штрафов.
Конечно, если пишешь под себя (блин, классная фраза получилась - можно не только ходить под себя, но и писАть smile) или маленькой компании в небольшом городе - можно и ворованый код использовать. Всё равно никто не узнает, а если и узнает - не так страшно.

Цитата(Platon @  28.10.2007,  19:26 Найти цитируемый пост)
Можно узнать в каком месте притянуто?

Можно. Ты сознательно не учёл многие факторы. А эти факторы в определённых условиях могут повлиять на итог.

Автор: w1nd 28.10.2007, 19:48
Цитата(Platon @  28.10.2007,  12:21 Найти цитируемый пост)
w1nd, другими словами хочу сказать, что проще программировать на C++ с помощью Qt, иметь абсолютно родное приложение, при этом написать код один раз и скомпилировать его посредством разных компиляторов.

Platon, если бы на C++ было бы проще программировать, то не было бы ни java, ни .net, ни delphi. Если бы Qt предоставляла бы больше возможностей, чем java runtime, то они не делали бы jambi.

Цитата(Platon @  28.10.2007,  12:21 Найти цитируемый пост)
На это могу сказать так, что даже если ты плохо программируешь, в родном приложении тормозов можно не заметить, но на Java у тебя постоянная необходимость в том, чтобы весь код был максимально оптимизирован. 

Неверно с обоих сторон. Во-первых, многие нативные приложения потормознее будут, во-вторых, на java достаточно не совершать грубых ошибок. Точнее, одной грубой ошибки - исполнения кода в гуёвом потоке.

Цитата(Platon @  28.10.2007,  12:21 Найти цитируемый пост)
ЗЫ: Используя метод от противного. Если принять за истину, что GUI-приложения на Java работают быстро, то нет необходимости в разработке родных GUI-библиотек, что противоречит действительности. => GUI-приложения медленные. ЧТД

А необходимости в альтернативных гуях действительно нет. Попробуйте провести тесты - вы удивитесь ;)

[hr]
В любом случае, будущее не за компилируемым кодом.

Автор: Platon 28.10.2007, 20:09
w1nd, действительно на C++ сложнее программировать, поэтому вечеринки устраиваю в форуме Java ^_^ но, думаю, если бы java производил родное приложение, то все бы занимались этим...


Цитата(w1nd @  28.10.2007,  19:48 Найти цитируемый пост)
Точнее, одной грубой ошибки - исполнения кода в гуёвом потоке.

И без этого тормозов хватает, исключая пожалуй 1.6, интересно 1.7. совсем выйдет на скорость родных приложений?

Добавлено через 9 минут и 51 секунду
Цитата(w1nd @  28.10.2007,  19:48 Найти цитируемый пост)
Неверно с обоих сторон. Во-первых, многие нативные приложения потормознее будут, во-вторых, на java достаточно не совершать грубых ошибок.

Вспомним понятие "теория игр", где оба игрока играют максимально оптимально.

Автор: Platon 28.10.2007, 21:43
Цитата(w1nd @  28.10.2007,  19:48 Найти цитируемый пост)
Если бы Qt предоставляла бы больше возможностей, чем java runtime, то они не делали бы jambi.

Факт коверкается. jambi сделан как раз для того, чтобы была возможность писать по возможности более родные приложения, так же как и SWT.

Ах, да, у Java же есть такой прекрасный механизм, как сборка мусора, и перед этим стоит преклонить колено ^_^

Автор: powerOn 28.10.2007, 23:20
Понятия "быстро" и "медленно" весьма относительны. smile Мне больше нравится понятие "достаточно".
Ну вот, допустим, выполняется отрисовка на С++ за 0,001 секунды, а на Java за 0,003. И работает Java (допустим) в 3 раза медленнее.... Ну и что? Пользователю то оно без разницы, он все равно этого не заметит... Этой скорости достаточно (при определенной "прямости рук" программиста), что бы реализовать отзывчивый пользовательский интерфейс. Плюс еще развитие железа идет полным ходом, что серьезно сглажвает разницу.
Что касается игрушек, так тут конечно дело за OpenGL и т.п. 

P.S.: Раньше-то (а может и сейчас) частенько на ассемблере куски кода писали, считали, что код после С++ компиляции медленно работал... тоже наверное воевали, что мол С++ сакс, а Asm рулез... smile Но в итоге пришли к мнению, что достаточно того что С++ выдает. 

Автор: Platon 28.10.2007, 23:38
Цитата(powerOn @  28.10.2007,  23:20 Найти цитируемый пост)
Ну вот, допустим, выполняется отрисовка на С++ за 0,001 секунды, а на Java за 0,003.

Несложно подсчитать, что программисту C++ можно быть в 3 раза криворукей чем Java программисту ^_^

Цитата(powerOn @  28.10.2007,  23:20 Найти цитируемый пост)
что мол С++ сакс, а Asm рулез...

Ну, тут тоже надо разделять понятия "необходимый" и "достаточный"

В общем, ждем семерки с ее improved code, а там можно и поговорить далее.

Автор: nornad 29.10.2007, 05:03
Цитата(Platon @  29.10.2007,  02:38 Найти цитируемый пост)
Несложно подсчитать, что программисту C++ можно быть в 3 раза криворукей чем Java программисту ^_^

Ну, если программисту пофигу, что за Г он выдаёт - да, можно. Только вот хорошие программисты обычно стараются писать хороший код.  smile 
Цитата(Platon @  29.10.2007,  02:38 Найти цитируемый пост)
Ну, тут тоже надо разделять понятия "необходимый" и "достаточный"

Раньше бывали случаи, когда было просто необходимо делать вставки на асме. Компилятор С/С++ вставлял кучу лишних действий, что сильно замедляло код. Плюс, мощности машин были ниже. Сейчас компиляторы стали поумнее, а мощности выросли. Поэтому сейчас вставки на асме делают намного реже. Потому как необходимости нет.

Автор: Platon 29.10.2007, 09:41
Не люблю я экстенсивный способ развития  smile   но видимо тоже веяние времени.
Тогда поставим вопрос так: почему Java не может включить в стандартную поставку одну из родных библиотек?

Автор: powerOn 29.10.2007, 10:11
Цитата(Platon @  29.10.2007,  10:41 Найти цитируемый пост)
почему Java не может включить в стандартную поставку одну из родных библиотек?

В каком смысле "родных"? Если в смысле "нативных", то она поставляет... поищите в подпапках JRE по маске *.dll

Автор: w1nd 29.10.2007, 12:23
Цитата(Platon @  28.10.2007,  20:09 Найти цитируемый пост)
думаю, если бы java производил родное приложение, то все бы занимались этим...

Использование jvm приносит бенефиции, недостижимые для родных приложений.

Цитата(Platon @  28.10.2007,  21:43 Найти цитируемый пост)
 jambi сделан как раз для того, чтобы была возможность писать по возможности более родные приложения, так же как и SWT.

Да ну? А не для того, чтобы приобрести новых пользователей? Приложения QT ничуть не роднее приложений на java для любой из систем.


Автор: Platon 12.1.2008, 12:17
Подкину дров:
http://en.wikipedia.org/wiki/Javolution
Цитата

Javolution is a real-time library aiming to make Java applications faster and more time predictable.

Какого черта это имеет место быть?!
Цитата

Latest release  5.2 / August 19, 2007

Совсем недавно, значит вещь актуальная.

Если бы java не была такой нерасторопной, никаких real time specifications выдумывать не нужно было бы, я так думаю.

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

Автор: batigoal 12.1.2008, 12:25
Platon, real-time системы - это не более быстрые системы, это более предсказуемые системы. Возможно, речь идёт именно об этом?

Хотя Сановцы уже сделали свою реализацию Java Real-Time, так что не знаю.

Добавлено через 6 минут
Да, похоже так и есть. Плюс ещё какие-то оптимизации.

Автор: LSD 12.1.2008, 17:47
Цитата
"Real-Time", as used in the context of the Sun Java Real-Time System product, means predictable. Real-time does not, in this context, have the sort of "in the moment" meaning that you hear in, for example, gaming circles. Real-Time Java means a version of Java that can support predictable responses to real-world events as defined by the RTSJ (Real-Time Specification for Java).

http://java.sun.com/javase/technologies/realtime/faq.jsp#1.

Автор: batigoal 12.1.2008, 18:07
Ну, это, конечно, не единственное отличие RTJ от обычной Явы, но главное.

Автор: LSD 12.1.2008, 18:27
Я говорил, про то что подразумевается под понятием ситемы реального времени.

Автор: Platon 17.2.2008, 12:28
Еще меня расстраивает размеры программы в памяти! Простая программка-чат с возможностью предачи файлов и сообщений, занимает 50 М, тогда как полноценная программка, к примеру QIP занимает всего 5(!)М. Согласитесь, программисту, пишущему на Object Pascal (qip написан на нем) спокойно можно быть минимум в 10 раз криворучей, чем Java программисту!

Возьмем к примеру браузер Opera : средний размер программы в памяти 20-30М, при этом ясно куда уходят метры, большой функционал. При этом программа выполнена на Qt, высокоуровневом фреймворке на C++, тем не менее результат много лучше, чем простая программка на Java.

Вопрос: Сколько таких Java программ можно одновременно запустить на своем PC? ясно дело что в 10 раз меньше. Очень печально.

Автор: Maksym 17.2.2008, 13:33
Platon
Тенденция -- аппаратные ресурсы дешевеют, сложность софта растет. Java предлагает большие возможности для создания архитектурно-стройных решений за счет меньшей эффективности использования аппаратных ресурсов.
Точно такое же сравнение как ты привел для Java vs Object Pascal можно сделать для пары Object Pascal vs Asm. Как только сложность превосходит некий порог употреблять Asm становится нерационально и выгоднее начинать жертвовать ресурсы переходя на новый уровень абстракции.
Если речь идет о мессанджере типа QIP, то порог еще не преодолен и Java действительно невыгодна в соотношении (усилия на разработку)/(расход аппаратных ресурсов), потому как усилия приблизительно равны, а расход ресурсов нет. Но когда сложность софта велика и достигает промышленного уровня -- необходим переход на следующий уровень абстракции, чтобы мозги программистов могли охватить систему и при этом не перегореть  smile 
Так что не так все и печально.
В названых факторах не упомянута финансовая составляющая, а ведь она тоже участвует в этом уравнении, причем на первом месте. Стоимость разработки понижается при использовании высокоуровневых средств, и понижается значительно быстрее, чем растут аппаратные запросы софта.

Автор: Platon 17.2.2008, 14:20
Цитата(Maksym @  17.2.2008,  14:33 Найти цитируемый пост)
и достигает промышленного уровня

Вот, это мне больше всего не нравится. Т.е. Java + десктоп маст дай?

Автор: LSD 17.2.2008, 14:36
Цитата(Platon @  17.2.2008,  12:28 Найти цитируемый пост)
Вопрос: Сколько таких Java программ можно одновременно запустить на своем PC? ясно дело что в 10 раз меньше. Очень печально.

50 экземпляров qip бывает нужно крайне редко smile 

Автор: Platon 17.2.2008, 14:49
LSD, я же не о именно кипах говорю, а, вообще, о полноценном обмундировании ПК Java ПО.
Я соглашусь что 6-я версия сделала многое для десктопа, надеюсь что 7-я версия откроет нам новые горизонты!

Автор: Maksym 17.2.2008, 14:54
Platon
Ну так 4 гига памяти на десктопе уже становятся нормой. Java сейчас лишь немного опережает события

Автор: Platon 17.2.2008, 15:07
Не знаю у кого как, а у меня на ноуте 1 гиг, на ПК было 256м, с недавних пор 768м.

Автор: Bozo 17.2.2008, 16:58
smile 
Цитата
Еще меня расстраивает размеры программы в памяти! Простая программка-чат с возможностью предачи файлов и сообщений, занимает 50 М, тогда как полноценная программка, к примеру QIP занимает всего 5(!)М. Согласитесь, программисту, пишущему на Object Pascal (qip написан на нем) спокойно можно быть минимум в 10 раз криворучей, чем Java программисту!

Возьмем к примеру браузер Opera : средний размер программы в памяти 20-30М, при этом ясно куда уходят метры, большой функционал. При этом программа выполнена на Qt, высокоуровневом фреймворке на C++, тем не менее результат много лучше, чем простая программка на Java.

Вопрос: Сколько таких Java программ можно одновременно запустить на своем PC? ясно дело что в 10 раз меньше. Очень печально. 
 smile  Ура! Ты молодец. Срочно позвони в Гугле Сергею и скажи, чтобы они одумались, пока еще не поздно! Простой русский парень спасйод Гугл от банкротства! Так и вижу весь интернет, бурлящий в обсуждении этой новости. Надо срочно убедить их, чтобы они писали программы на Object Pascal для своего гуглофона aka Android. А то ведь что удумали, собираются на телефон жабу впихнуть и все программы писать на ней, а не телефоне никогда не будет 4Гб оперативной памяти, как на десктопе. И максимум что смогут покупатели этого телефона это запустить список контактов и GoogleMaps на этом телефоне, и всйо smile . А дальше память кончится, жаба съесд smile 

Автор: Platon 17.2.2008, 17:56
-1
Вовсе даже не смешно. Здесь не место для насмешек, а место для рассеивания сомнений.

Автор: Bozo 17.2.2008, 19:40
Platon, сомнений в чем? Скажи, ты думаешь, в Гугл работают идиоты? И именно поэтому они выбрали Java, хотя правильнее и выгоднее было бы писать ПО под мобильник на Object Pascal? А может быть Object Pascal чья-то собственность и все, кто пишет на нем программы, должны кому-то %? Вот этого я не знаю, вполне возможно чьи-то хитрозагребущие руки хотят копейку с каждой строки кода, написанного на Object Pascal, и тогда никаких сомнений не будет, на нем смело можно ставить крест.

Автор: Kangaroo 17.2.2008, 19:59
Bozo
свои мысли надо выкладывать спокойно и аргументировано, а не сатиристическо-невнятным-неформатированным набором букф.

По сабжу Maksym хорошо написал, где-то так я себе ситуацию и представлял )

Автор: nornad 18.2.2008, 03:55
Цитата(Platon @  17.2.2008,  17:20 Найти цитируемый пост)
Т.е. Java + десктоп маст дай?

Хм... а что есть десктоп? Машина/железо или среда окружения? Если второе, то в качестве примера можно рассмотреть явно десктопное приложение IntelliJ IDEA. Я пока не видел другого настолько же удобного редактора. Особенно это касается C++/Object Pascal. Навороченных - уйма. Удобных - не видел. Эклипс мне не нравится - мне он неудобен. Но у него тоже есть немало поклонников именно в плане удобства. Но давай вспомним, что и он писан на Java. И что же нам остаётся? Остаётся признать, что эти предложения достаточно сложны, чтобы перейти упомянутый порог. Теоретически написать их можно на любом языке (ну, со своей спецификой, конечно). Но почему-то IDEA и Eclipse уже существуют несколько лет, а подобного для того же С++ до сих пор не появилось. Visual C++?.. Не... она на порядок-два отстаёт по добству.  smile 
Цитата(Bozo @  17.2.2008,  19:58 Найти цитируемый пост)
Надо срочно убедить их, чтобы они писали программы на Object Pascal для своего гуглофона aka Android. А то ведь что удумали, собираются на телефон жабу впихнуть и все программы писать на ней, а не телефоне никогда не будет 4Гб оперативной памяти, как на десктопе.

а) 4 Гб на телефонах (или чём-то, что будет выполнять их функции) будет и явно ещё при нашей жизни
б) все программы гугль на джаве под андроид писать не будет точно. Андроид - линукс, а значит часть программ будет на С. Потому что так оно лучше/проще/удобнее/надёжнее. Большинство - да, на джаве. Потому что сторонним разработчикам-одиночкам это удобнее. Но пока что джава-приложения на телефонах приживаются плохо. В первую очередь из-за того, что разные производители делают свои реализации свинга под телефоны, из-за чего становится неудобно делать приложение, которое работает везде - оно либо убогое, либо тянет кучу лишнего кода.
И я бы попросил высказываться попроще, без резких наездов. Платон мне друг, но истина дороже. Его я знаю более или менее, а вы, уважаемый, здесь только появились. В общем, не стоит начинать знакомство с резкости.

Kangaroo - одобрямс. smile

Автор: Platon 18.2.2008, 09:11
Цитата(nornad @  18.2.2008,  04:55 Найти цитируемый пост)
Но почему-то IDEA и Eclipse уже существуют несколько лет, а подобного для того же С++ до сих пор не появилось. Visual C++?

Могу связать это лишь с тем, что код C++ тянется с давних времен, уровень ОО мышления был не так остр как сейчас, и на железки смотрели по-другому, и видимо разработчикам лень менять ядро программы. Приведу доругой пример софта Компании-разработчика IDEA: JetBrains Omea Pro 2.2. Выполнена на ЯВУ(предположительно C++) вещь радует своей гибкостью - работать удобно и быстро.

Бесспорно на стороне Java программиста явное удобство синтаксиса и правил языка, которые ускоряют разработку продукта. Сам же не забываю, что Java - язык не привязанный к конкретному типу компилятора и благо, для Java есть даже native компиляторы.


Цитата(Bozo @  17.2.2008,  20:40 Найти цитируемый пост)
Platon, сомнений в чем?

сомнений эффективности технологии.


Цитата(Bozo @  17.2.2008,  20:40 Найти цитируемый пост)
Скажи, ты думаешь, в Гугл работают идиоты? И именно поэтому они выбрали Java

Гениальный шовинистический аргумент. 

Автор: Bozo 18.2.2008, 20:54
Цитата(Platon @ 18.2.2008,  09:11)
Выполнена на ЯВУ(предположительно C++) вещь радует своей гибкостью - работать удобно и быстро.

Она на C#. В нее они вложили опыт, накопленный с Resharper и IDEA.

На остальное отвечать - нарываться на замечания и бан.  smile 

Автор: LSD 19.2.2008, 12:44
Цитата(nornad @  18.2.2008,  03:55 Найти цитируемый пост)
значит часть программ будет на С. Потому что так оно лучше/проще/удобнее/надёжнее

Крайнеспорный аргумент.

Автор: nornad 19.2.2008, 18:05
Аргумент - да, спорный. Но часть программ на сях точно там будет. Большей частью тех, где сложность не слишком высока (хотя, откуда сегодня на сотке очень сложные программы?).

Автор: Bozo 19.2.2008, 21:13
Цитата

все программы гугль на джаве под андроид писать не будет точно. Андроид - линукс, а значит часть программ будет на С. Потому что так оно лучше/проще/удобнее/надёжнее. Большинство - да, на джаве.
http://www.linux.org.ru/view-message.jsp?msgid=2500357#2501958 
Цитата
, плюс мощная надстройка над стандартной Java, собственно Android SDK
 где там таки место для "программ на C", риторический вопрос

Автор: LSD 20.2.2008, 12:18
Android еще не вышел, и пока нет гарантий что выйдет. Google свою ОС тоже хотел сделать, хотел-хотел - да передумал.

Автор: batigoal 20.2.2008, 16:09
Цитата(LSD @  20.2.2008,  13:18 Найти цитируемый пост)
Android еще не вышел

Девайсы уже демонстрировались.

Автор: LSD 20.2.2008, 16:37
Цитата(batigoal @  20.2.2008,  16:09 Найти цитируемый пост)
Девайсы уже демонстрировались.

Так и ОС существует (и продолжает развиваться до сих пор), но проект-то они забросили.

Тем более, что они просят не ассоциировать андроид с брендом гугла.

Автор: Maksym 21.2.2008, 15:31
[offtopic]LSD, что за ОС, где почитать?[/offtopic]

Автор: devmstr 21.2.2008, 15:40
Maksym
лови http://code.google.com/android/

Автор: LSD 22.2.2008, 12:42
Maksym, http://www.haiku-os.org/, http://forum.vingrad.ru/forum/topic-137430.html.

Автор: Maksym 22.2.2008, 14:13
Цитата(devmstr @  21.2.2008,  14:40 Найти цитируемый пост)
Maksym, лови android 

Сенк, андроид я в курсе. Гугловскую десктопную ось имел в виду.
Цитата(LSD @  22.2.2008,  11:42 Найти цитируемый пост)
Maksym, Haiku OS, обсуждение на Винграде. 

Спасиб.

Автор: w1nd 7.3.2008, 01:57
Всё не доходят руки самому поразбираться:

Код
#include <bitset>
#include <iostream>
#include <ctime>
#include <conio.h>

using namespace std;

int _main(int argc, char* argv[])
{
    const int N = 2000000;
    clock_t cstart = clock();
    int count;
    for(int xxx = 0;xxx<=100;xxx++)
    {
        bitset<N + 1> b;
        count = 0;
        int i;
        for(i=2;i<=N;i++)
            b.set(i);
        i=2;
        while(i*i<=N)
        {
            if(b.test(i))
            {
                count++;
                int k = 2*i;
                while(k <= N)
                {
                    b.reset(k);
                    k += i;
                }
            }
            i++;
        }

        while(i<=N)
        {
            if(b.test(i))
                count++;

            i++;
        }
    }
    clock_t cend = clock();
    double millis = 1000.0*(cend-cstart)/CLOCKS_PER_SEC;
    cout << count << " primes\n" << millis << " millisecond\n";

    getch();
    return 0;
}


Код
package test;
import java.util.*;
/**
 *
 * @author impik777
 */
public class Main {
    public static void main(String[] args) {
        int n = 2000000;
        long start = System.currentTimeMillis();
       int count = 0;
        for(int xxx = 0;xxx<=100;xxx++)
        {
            BitSet b = new BitSet(n+1);
            count = 0;
            int i;
            for(i=2;i<=n;i++)
                b.set(i);
            i=2;
            while(i*i<=n)
            {
                if(b.get(i))
                {
                    count++;
                    int k = 2*i;
                    while(k<=n)
                    {
                        b.clear(k);
                        k += i;
                    }
                }
                i++;
            }

            while (i <= n)
            {
                if(b.get(i))
                    count++;

                i++;
            }
        }
        
        long end = System.currentTimeMillis();
        System.out.println(count + " primes");
        System.out.println((end - start) + " milliseconds");  
    }
}

В приложении бинарники варианта на C++, собранные GCC и VS2005. Примеры на C++ выполняются в среднем на порядок быстрее.

Автор: Platon 7.3.2008, 10:02
А вот мне интересно, на сколько ускорится ваш пример на Java если его скомпилировать с помощью gcj?

Автор: w1nd 7.3.2008, 12:38
Цитата(Platon @  7.3.2008,  10:02 Найти цитируемый пост)
А вот мне интересно, на сколько ускорится ваш пример на Java если его скомпилировать с помощью gcj?

Нет, это как раз совсем не интересно smile Отставание на порядок в такой простой задаче - это нетипично. Интересно найти, в чём подвох.

Автор: w1nd 9.3.2008, 14:28
Немного поковырялся с реализацией BitSet; в java для хранения бит в нём используются long'и, в c++ - unsigned long, ЕМНИП, в c++ это 32 бита, а не 64. Замена стандартного BitSet на свой (реализация аналогичная) даёт увеличение производительности java-примера в два раза.

Код
public class BitSet {
        
    private final int[] ints;
        
    public BitSet(int count) {
        ints = new int[(count / 32) + ((count % 32) != 0 ? 1 : 0)];
    }
        
    public boolean get(int number) {
        return (ints[(number / 32)] & (1 << (number % 32))) != 0;
    }
        
    public void set(int number) {
        ints[(number / 32)] |= (1 << (number % 32));
    }

    public void clear(int number) {
        ints[(number / 32)] &= ~(1 << (number % 32));
    }
        
}

А замена деления на более простые операции даёт почти ту же, что для примеров c++ скорость:

Код
public class BitSet {
        
    private final int[] ints;
        
    public BitSet(int count) {
        ints = new int[(count >> 5) + ((count & 0x1f) != 0 ? 1 : 0)];
    }
        
    public boolean get(int number) {
        return (ints[(number >> 5)] & (1 << (number & 0x1f))) != 0;
    }
        
    public void set(int number) {
        ints[(number >> 5)] |= (1 << (number & 0x1f));
    }

    public void clear(int number) {
        ints[(number >> 5)] &= ~(1 << (number & 0x1f));
    }
        
}

Не так давно я кому-то говорил, что использование битовых операций вместо сложения/вычитания/деления по модулю не даст никакого прироста. И это должно быть так. Но, как видите, замена деления даёт огромный прирост производительности даже на современных процессорах. Печально, но факт - не наблюдается более чем уместной оптимизации ещё на стадии компиляции.

Автор: Platon 9.3.2008, 14:35
http://forum.vingrad.ru/index.php?showtopic=189783&view=findpost&p=1368269
Не эта ли темка?
Надо заметить, что вы не только о сложении/вычитании говорили.

Автор: w1nd 9.3.2008, 14:40
Цитата(Platon @  9.3.2008,  14:35 Найти цитируемый пост)
Не эта ли темка?

 smile 

Самое смешное, что перед как раз перед
Цитата(w1nd @  6.1.2008,  07:59 Найти цитируемый пост)
В кроссплатформенной среде оптимизация кода под конкретную архитектуру (процессор/ОС/jvm) бессмысленна и вредна.

я производил некоторые тесты, в которых мне не удалось выявить пользу подобной оптимизации. Вероятно, я не учёл ещё каких-то факторов...

Добавлено через 1 минуту и 46 секунд
Цитата(Platon @  9.3.2008,  14:35 Найти цитируемый пост)
Надо заметить, что вы не только о сложении/вычитании говорили.

Да; исправил сообщение.

Добавлено через 5 минут
В любом случае, я не откажусь от ранее сделанных выводов о вреде оптимизации java-кода под конкретные типы процессоров. Но очень печалит пренебрежение оптимизациями разработчиков jre... JIT на этом примере точно успевает отработать, поэтому странно видеть такой плачевный результат...

Автор: Platon 9.3.2008, 21:48
А меня в Java расстраивает только GUI. Видимо придется брать на вооружение Jambi.

Автор: w1nd 9.3.2008, 21:52
Цитата(Platon @  9.3.2008,  21:48 Найти цитируемый пост)
А меня в Java расстраивает только GUI. Видимо придется брать на вооружение Jambi.

Уж где-где, а в гуях по мне всё нормально. Посмотрите на OpenOffice или Adobe Reader 9 - поводов для расстройств станет значительно меньше.

Автор: Platon 9.3.2008, 22:06
Мне достаточно глянуть на свою программку с несколькими текстовыми полями (7 полей) расставленных в BoxLayout. Сравнивая с Opera или JetBrains Omea, и последний довод  (но, не могу утверждать, не нашел подтверждения) - Intellij IDEA, использует родные библиотеки для рисования. Очень насыщенная и быстрая отрисовка.

Всегда восхищался гибкостью, скоростью и аккуратностью Qt, а в паре с Java это будет просто божественный дуэт.

Автор: w1nd 10.3.2008, 07:08
Цитата(Platon @  9.3.2008,  22:06 Найти цитируемый пост)
Всегда восхищался гибкостью, скоростью

Насчёт скорости у меня имеются сомнения... Есть какие-нибудь тесты и сравнительные характеристики? 

Автор: Platon 10.3.2008, 08:28
Чисто визуальные ощущения, причем вполне объективные. Не буду же я, любя и уважая Java, подсуживать другим.

Автор: Platon 10.3.2008, 10:20
Вот был пример из туториала Qt Jambi

Код

import com.trolltech.qt.core.Qt;
import com.trolltech.qt.gui.*;

public class LineEdits extends QWidget {

    private QLineEdit echoLineEdit;
    private QLineEdit validatorLineEdit;
    private QLineEdit alignmentLineEdit;
    private QLineEdit inputMaskLineEdit;
    private QLineEdit accessLineEdit;

    public LineEdits() {
        this(null);
    }

    public LineEdits(QWidget parent) {
        super(parent);
        QGroupBox echoGroup = new QGroupBox(tr("Echo"));

        QLabel echoLabel = new QLabel(tr("Mode:"));
        QComboBox echoComboBox = new QComboBox();
        echoComboBox.addItem(tr("Normal"));
        echoComboBox.addItem(tr("Password"));
        echoComboBox.addItem(tr("No Echo"));

        setWindowIcon(new QIcon("classpath:com/trolltech/images/qt-logo.png"));

        echoLineEdit = new QLineEdit();
        echoLineEdit.setFocus();
        //////////////////

        QGroupBox validatorGroup = new QGroupBox(tr("Validator"));

        QLabel validatorLabel = new QLabel(tr("Type:"));
        QComboBox validatorComboBox = new QComboBox();
        validatorComboBox.addItem(tr("No validator"));
        validatorComboBox.addItem(tr("Integer validator"));
        validatorComboBox.addItem(tr("Double validator"));

        validatorLineEdit = new QLineEdit();
        ////////////////////

        QGroupBox alignmentGroup = new QGroupBox(tr("Alignment"));

        QLabel alignmentLabel = new QLabel(tr("Type:"));
        QComboBox alignmentComboBox = new QComboBox();
        alignmentComboBox.addItem(tr("Left"));
        alignmentComboBox.addItem(tr("Centered"));
        alignmentComboBox.addItem(tr("Right"));

        alignmentLineEdit = new QLineEdit();

        ///////////////////////////////////////

        QGroupBox inputMaskGroup = new QGroupBox(tr("Input mask"));

        QLabel inputMaskLabel = new QLabel(tr("Type:"));
        QComboBox inputMaskComboBox = new QComboBox();
        inputMaskComboBox.addItem(tr("No mask"));
        inputMaskComboBox.addItem(tr("Phone number"));
        inputMaskComboBox.addItem(tr("ISO date"));
        inputMaskComboBox.addItem(tr("License key"));

        inputMaskLineEdit = new QLineEdit();

        ///////////////////////////////////////

        QGroupBox accessGroup = new QGroupBox(tr("Access"));

        QLabel accessLabel = new QLabel(tr("Read-only:"));
        QComboBox accessComboBox = new QComboBox();
        accessComboBox.addItem(tr("False"));
        accessComboBox.addItem(tr("True"));

        accessLineEdit = new QLineEdit();

        ////////////////////////////////////////////

        echoComboBox.activatedIndex.connect(this, "echoChanged(int)");
        validatorComboBox.activatedIndex.connect(this, "validatorChanged(int)");
        alignmentComboBox.activatedIndex.connect(this, "alignmentChanged(int)");
        inputMaskComboBox.activatedIndex.connect(this, "inputMaskChanged(int)");
        accessComboBox.activatedIndex.connect(this, "accessChanged(int)");

        /////////////////////////////////////////////

        QGridLayout echoLayout = new QGridLayout();
        echoLayout.addWidget(echoLabel, 0, 0);
        echoLayout.addWidget(echoComboBox, 0, 1);
        echoLayout.addWidget(echoLineEdit, 1, 0, 1, 2);
        echoGroup.setLayout(echoLayout);

        //////////////////////////////////////////

        QGridLayout validatorLayout = new QGridLayout();
        validatorLayout.addWidget(validatorLabel, 0, 0);
        validatorLayout.addWidget(validatorComboBox, 0, 1);
        validatorLayout.addWidget(validatorLineEdit, 1, 0, 1, 2);
        validatorGroup.setLayout(validatorLayout);

        QGridLayout alignmentLayout = new QGridLayout();
        alignmentLayout.addWidget(alignmentLabel, 0, 0);
        alignmentLayout.addWidget(alignmentComboBox, 0, 1);
        alignmentLayout.addWidget(alignmentLineEdit, 1, 0, 1, 2);
        alignmentGroup.setLayout(alignmentLayout);

        QGridLayout inputMaskLayout = new QGridLayout();
        inputMaskLayout.addWidget(inputMaskLabel, 0, 0);
        inputMaskLayout.addWidget(inputMaskComboBox, 0, 1);
        inputMaskLayout.addWidget(inputMaskLineEdit, 1, 0, 1, 2);
        inputMaskGroup.setLayout(inputMaskLayout);

        QGridLayout accessLayout = new QGridLayout();
        accessLayout.addWidget(accessLabel, 0, 0);
        accessLayout.addWidget(accessComboBox, 0, 1);
        accessLayout.addWidget(accessLineEdit, 1, 0, 1, 2);
        accessGroup.setLayout(accessLayout);

        //////////////////////////////////////////////

        QGridLayout layout = new QGridLayout();
        layout.addWidget(echoGroup, 0, 0);
        layout.addWidget(validatorGroup, 1, 0);
        layout.addWidget(alignmentGroup, 2, 0);
        layout.addWidget(inputMaskGroup, 0, 1);
        layout.addWidget(accessGroup, 1, 1);
        setLayout(layout);

        setWindowTitle(tr("Line Edits"));
    }

    public void echoChanged(int index) {
        switch (index) {
            case 0:
                echoLineEdit.setEchoMode(QLineEdit.EchoMode.Normal);
                break;
            case 1:
                echoLineEdit.setEchoMode(QLineEdit.EchoMode.Password);
                break;
            case 2:
                echoLineEdit.setEchoMode(QLineEdit.EchoMode.NoEcho);
        }
    }

    public void validatorChanged(int index) {
        switch (index) {
            case 0:
                validatorLineEdit.setValidator(null);
                break;
            case 1:
                validatorLineEdit.setValidator(new QIntValidator(validatorLineEdit));
                break;
            case 2:
                validatorLineEdit.setValidator(new QDoubleValidator(-999.0, 999.0, 2, validatorLineEdit));
        }

        validatorLineEdit.setText("");
    }

    public void alignmentChanged(int index) {
        switch (index) {
            case 0:
                alignmentLineEdit.setAlignment(new Qt.Alignment(Qt.AlignmentFlag.AlignLeft));
                break;
            case 1:
                alignmentLineEdit.setAlignment(new Qt.Alignment(Qt.AlignmentFlag.AlignCenter));
                break;
            case 2:
                alignmentLineEdit.setAlignment(new Qt.Alignment(Qt.AlignmentFlag.AlignRight));
        }
    }

    public void inputMaskChanged(int index) {
        switch (index) {
            case 0:
                inputMaskLineEdit.setInputMask("");
                break;
            case 1:
                inputMaskLineEdit.setInputMask("+99 99 99 99 99;_");
                break;
            case 2:
                inputMaskLineEdit.setInputMask("0000-00-00");
                inputMaskLineEdit.setText("00000000");
                inputMaskLineEdit.setCursorPosition(0);
                break;
            case 3:
                inputMaskLineEdit.setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#");
        }
    }

    public void accessChanged(int index) {
        switch (index) {
            case 0:
                accessLineEdit.setReadOnly(false);
                break;
            case 1:
                accessLineEdit.setReadOnly(true);
        }
    }

    public static void main(String args[]) {
        QApplication.initialize(args);

        LineEdits lineedits = new LineEdits();
        lineedits.show();

        QApplication.exec();
    }
}


Вот недоделанный аналог на SWING

Код

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

public class JavaLineEdits extends JFrame {
    private JTextField echoLineEdit;
    private JTextField validatorLineEdit;
    private JTextField alignmentLineEdit;
    private JTextField inputMaskLineEdit;
    private JTextField accessLineEdit;

    public JavaLineEdits() {
        JPanel echoGroup = new JPanel(new GridBagLayout());
        echoGroup.setBorder(BorderFactory.createTitledBorder("Echo"));
        echoGroup.setLayout(new BoxLayout(echoGroup, BoxLayout.Y_AXIS));
        JLabel echoLabel = new JLabel("Mode:");
        final JComboBox echoComboBox = new JComboBox();
        echoComboBox.addItem("Normal");
        echoComboBox.addItem("Password");
        echoComboBox.addItem("No Echo");

        echoLineEdit = new JTextField();
        //////////////////

        JPanel validatorGroup = new JPanel(new GridBagLayout());
        validatorGroup.setBorder(BorderFactory.createTitledBorder("Validator"));
        validatorGroup.setLayout(new BoxLayout(validatorGroup, BoxLayout.Y_AXIS));
        JLabel validatorLabel = new JLabel("Type:");
        final JComboBox validatorComboBox = new JComboBox();
        validatorComboBox.addItem("No validator");
        validatorComboBox.addItem("Integer validator");
        validatorComboBox.addItem("Double validator");

        validatorLineEdit = new JTextField();
        ////////////////////

        JPanel alignmentGroup = new JPanel(new GridBagLayout());
        alignmentGroup.setBorder(BorderFactory.createTitledBorder("Alignment"));
        JLabel alignmentLabel = new JLabel("Type:");
        final JComboBox alignmentComboBox = new JComboBox();
        alignmentComboBox.addItem("Left");
        alignmentComboBox.addItem("Centered");
        alignmentComboBox.addItem("Right");

        alignmentLineEdit = new JTextField();

        ///////////////////////////////////////

        JPanel inputMaskGroup = new JPanel();
        inputMaskGroup.setBorder(BorderFactory.createTitledBorder("Input mask"));
        inputMaskGroup.setLayout(new BoxLayout(inputMaskGroup, BoxLayout.Y_AXIS));
        JLabel inputMaskLabel = new JLabel("Type:");
        final JComboBox inputMaskComboBox = new JComboBox();
        inputMaskComboBox.addItem("No mask");
        inputMaskComboBox.addItem("Phone number");
        inputMaskComboBox.addItem("ISO date");
        inputMaskComboBox.addItem("License key");

        inputMaskLineEdit = new JTextField();

        ///////////////////////////////////////

        JPanel accessGroup = new JPanel(new GridBagLayout());
        accessGroup.setBorder(BorderFactory.createTitledBorder("Access"));
        JLabel accessLabel = new JLabel("Read-only:");
        final JComboBox accessComboBox = new JComboBox();
        accessComboBox.addItem("False");
        accessComboBox.addItem("True");

        accessLineEdit = new JTextField();

        ////////////////////////////////////////////

        echoComboBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                echoChanged(echoComboBox.getSelectedIndex());
            }
        });

        validatorComboBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                validatorChanged(validatorComboBox.getSelectedIndex());
            }
        });

        alignmentComboBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                alignmentChanged(alignmentComboBox.getSelectedIndex());
            }
        });

        inputMaskComboBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                inputMaskChanged(inputMaskComboBox.getSelectedIndex());
            }
        });

        accessComboBox.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                accessChanged(accessComboBox.getSelectedIndex());
            }
        });

        /////////////////////////////////////////////
        GridBagConstraints gbc = new GridBagConstraints();

        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        echoGroup.add(echoLabel, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1;
        echoGroup.add(echoComboBox, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 2;
        gbc.gridheight = 1;
        gbc.weightx = 1;
        echoGroup.add(echoLineEdit, gbc);

        //////////////////////////////////////////
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        validatorGroup.add(validatorLabel, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.weightx = 1;
        validatorGroup.add(validatorComboBox, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.gridwidth = 1;
        gbc.gridheight = 2;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        validatorGroup.add(validatorLineEdit, gbc);
        /////////////////////////////////////////////////
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        alignmentGroup.add(alignmentLabel, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1;
        alignmentGroup.add(alignmentComboBox, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 2;
        gbc.gridheight = 1;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        alignmentGroup.add(alignmentLineEdit, gbc);

        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        inputMaskGroup.add(inputMaskLabel, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1;
        inputMaskGroup.add(inputMaskComboBox, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 2;
        gbc.gridheight = 1;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        inputMaskGroup.add(inputMaskLineEdit, gbc);


        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        accessGroup.add(accessLabel, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1;
        accessGroup.add(accessComboBox, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.gridwidth = 2;
        gbc.gridheight = 1;
        gbc.weighty = 1;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        accessGroup.add(accessLineEdit, gbc);

        //////////////////////////////////////////////
        getContentPane().setLayout(new GridBagLayout());
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.BOTH;
        getContentPane().add(echoGroup, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 1;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.BOTH;
        getContentPane().add(validatorGroup, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 0;
        gbc.gridy = 2;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.BOTH;
        getContentPane().add(alignmentGroup, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 0;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.BOTH;
        getContentPane().add(inputMaskGroup, gbc);
        gbc = new GridBagConstraints();
        gbc.gridx = 1;
        gbc.gridy = 1;
        gbc.weightx = 1;
        gbc.fill = GridBagConstraints.BOTH;
        getContentPane().add(accessGroup, gbc);
        setTitle("Line Edits");
    }

    public void echoChanged(int index) {
        /*switch (index) {
            case 0:
                echoLineEdit.setEchoMode(QLineEdit.EchoMode.Normal);
                break;
            case 1:
                echoLineEdit.setEchoMode(QLineEdit.EchoMode.Password);
                break;
            case 2:
                echoLineEdit.setEchoMode(QLineEdit.EchoMode.NoEcho);
        }*/
    }

    public void validatorChanged(int index) {
        /*switch (index) {
            case 0:
                validatorLineEdit.setValidator(null);
                break;
            case 1:
                validatorLineEdit.setValidator(new QIntValidator(validatorLineEdit));
                break;
            case 2:
                validatorLineEdit.setValidator(new QDoubleValidator(-999.0, 999.0, 2, validatorLineEdit));
        }

        validatorLineEdit.setText("");*/
    }

    public void alignmentChanged(int index) {
        /*switch (index) {
            case 0:
                alignmentLineEdit.setAlignment(new Qt.Alignment(Qt.AlignmentFlag.AlignLeft));
                break;
            case 1:
                alignmentLineEdit.setAlignment(new Qt.Alignment(Qt.AlignmentFlag.AlignCenter));
                break;
            case 2:
                alignmentLineEdit.setAlignment(new Qt.Alignment(Qt.AlignmentFlag.AlignRight));
        }*/
    }

    public void inputMaskChanged(int index) {
        /*switch (index) {
            case 0:
                inputMaskLineEdit.setInputMask("");
                break;
            case 1:
                inputMaskLineEdit.setInputMask("+99 99 99 99 99;_");
                break;
            case 2:
                inputMaskLineEdit.setInputMask("0000-00-00");
                inputMaskLineEdit.setText("00000000");
                inputMaskLineEdit.setCursorPosition(0);
                break;
            case 3:
                inputMaskLineEdit.setInputMask(">AAAAA-AAAAA-AAAAA-AAAAA-AAAAA;#");
        }*/
    }

    public void accessChanged(int index) {
        switch (index) {
            case 0:
                accessLineEdit.setEditable(true);
                break;
            case 1:
                accessLineEdit.setEditable(false);
        }
    }

    public static void main(String args[]) {
        try {
            UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
        } catch (ClassNotFoundException e) {
            e.printStackTrace();
        } catch (InstantiationException e) {
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        } catch (UnsupportedLookAndFeelException e) {
            e.printStackTrace();
        }
        JFrame.setDefaultLookAndFeelDecorated(true);
        JFrame f = new JavaLineEdits();
        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        f.pack();
        f.setLocationByPlatform(true);
        f.setVisible(true);
    }
}


Терпения не хватило работать с GridBagLayout, но смысл примерно тот же, может у Java задача проще, ибо приходится меньше изменять размеры.
1. В Qt все отступы уже продуманы, не надо работать с Insets
2. В Qt сложную GUI сетку можно сделать проще чем в SWING

Теперь диагноз: в целом после растягиваний Qt программки остаются приятные ощущения, усталости не наблюдается. При работе с SWING программой весь экран содрагается в очень частой перерисовке (перерисовывается не только окно программы, но и весь рабочий стол и его приложения), остается ощущение неполноценности и ущербности, хочется быстрей бежать от такоо приложения.

Автор: ochnev 10.3.2008, 12:16
Я заметил, что после перехода с JDK 5 на 6 стал быстрее запускаться Tomcat.

Автор: Platon 11.3.2008, 08:20
JDK 6 продвинулся и в SWING, но всё равно недостаточно.
Пожалуй, Всё таки не буду торопиться осваивать Jambi, дождусь Семерки.

Автор: Platon 18.3.2008, 19:22
http://www.jelovic.com/articles/why_java_is_slow.htm

Автор: LSD 18.3.2008, 20:09
Цитата(Platon @  18.3.2008,  19:22 Найти цитируемый пост)
Burn, Burn!!!

1. Замечание верное, но в свете принципа 10/90 этот эффект можно нивелировать.
2. Есть такой момент, но приведение вниз можно делать без того алгоритма который том описан. Да и пользы от проверки явно больше.
3. Согласен с тем что больше, но вот насчет свопа он загнул. Из реальных приложений пожалуй только IDE могут сожрать столько памяти.
4. Общие рассуждения без конкретики.
5. Пусть для начала покаже компилятор C++ который сможет провести такую оптимизацию.

Автор: Bozo 21.3.2008, 22:46
Цитата
Burn, Burn!!! 

Последнее изменение страницы было 20 июля 2005 г. 17:35:22 А написано толи в 2001 толи в 2003 году, инфа давно устарела

Автор: Platon 3.4.2008, 12:18
Еще подкину дров не столько по скорости, сколько вообще о целесообразности в целом.
Open Office как известно разрабатывается Солнышком, но вот вопрос, dll библиотек там более чем на 100 метров, jar файлов - на 8, и как это понять, смысл вообще писать на Java если несмотря на окрещение ОО как кросплатформенное ПО, он таким не является?

Автор: w1nd 4.4.2008, 08:16
Цитата(Platon @  3.4.2008,  12:18 Найти цитируемый пост)
Open Office как известно разрабатывается Солнышком, но вот вопрос, dll библиотек там более чем на 100 метров, jar файлов - на 8, и как это понять, смысл вообще писать на Java если несмотря на окрещение ОО как кросплатформенное ПО, он таким не является? 

OO - не java-приложение.

Автор: Zandr 5.6.2008, 12:54
Platon, попробуй TableLayout и будет тебе счастье

Автор: serger 5.6.2008, 13:04
Кстати, мне кажется, хоть ОО не java-приложение работа с памятью реализована аналогично.. ?! никому так не кажется?

Автор: Lotrex 19.8.2008, 08:06
По теме:
http://www.jopdesign.com - пусть вас не смущает аббревиатура smile

Идея в том, что можно создать аппаратную java - машину, которая будет непосредственно выполнять байт-код, и сделать это можно на существующей элементной базе - на http://en.wikipedia.org/wiki/Field-programmable_gate_array.

Возможно, тут получится существенное увеличение производительности.

Автор: Temdegon 20.1.2009, 21:11
Вопрос по использованию памяти в java. Есть такой линк http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=java&lang2=php, где можно сравнить производительность и использование памяти межу разными языками. Сколько не тыркался, java всегда проигрывает по использованию памяти, практически любому языку. Причем не только всяким компилиуемым языкам, но и интерпретаторам, например PHP (Хотя по скорости рвет его в тряпки). Почему так получается? Вроди ПХП лет пять уже не могут 6-ю версию зарелизить, все пользуются пятым, и все нормально работает. А java чуть ли не каждый день выходит новая подверсия, а по управлению памятью проигрывает ПХП? Чем это вызвано? В чем особенности java от тех же rubi, python, C#, PHP? 

Автор: kamre 27.1.2009, 00:34
Предлагаю к рассмотрению "очередные данные о прожорливости и тормозах Java" в GUI приложениях  smile 

Прожорливость и тормоза будем сравнивать относительно Qt4 на довольно простом http://doc.trolltech.com/4.4/layouts-basiclayouts.html. Смысл сравнения именно с Qt4 состоит в том, что и Qt4 и Java/Swing полностью сами отрисовывают интерфейс внутри окна без использования каких-либо нативных компонент (нативное только главное окно).

Был написан аналогичный код на Java с использованием Swing (код см. ниже). Получилось вот так:
user posted image
Насчет Look&Feel: сразу можно записать в минус Java неправильный default шрифт в JTextArea и неправильную отрисовку меню в неактивном окне.

Но самое интересное происходит при ресайзе этих окошек: Qt все делает просто моментально и плавно, а в Java все происходит рывками и с заметным шлейфом от перерисовки рамки окна:
user posted image
Очевидно, что Java тормозит и явно не успевает перерисовывать содержимое окна при изменении его размеров. В Qt4 таких проблем не наблюдается, рамка окна сразу следует за мышкой и интерфейс внутри окна всегда успевает отрисовываться.

Также интересно посмотреть на потребление памяти для такого простого окошка:
user posted image
Результаты поразительные: Java прожорливее почти в 10 раз чем Qt4, и для отображения этого окна и изменения его размеров позволила себе отожрать больше 100Мб! Неужели это можно назвать разумным потреблением памяти?

А вот мой код на Java (возможно я что-то делаю не правильно, укажите на это):
Код

import static java.awt.GridBagConstraints.BOTH;
import static java.awt.GridBagConstraints.CENTER;
import static java.awt.GridBagConstraints.HORIZONTAL;
import static java.awt.GridBagConstraints.NONE;

import java.awt.Component;
import java.awt.Container;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import java.awt.event.ActionEvent;
import java.awt.event.KeyEvent;

import javax.swing.AbstractAction;
import javax.swing.Box;
import javax.swing.GroupLayout;
import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSpinner;
import javax.swing.JTextArea;
import javax.swing.JTextField;
import javax.swing.SwingUtilities;
import javax.swing.UIManager;
import javax.swing.GroupLayout.ParallelGroup;
import javax.swing.GroupLayout.SequentialGroup;
import javax.swing.border.CompoundBorder;
import javax.swing.border.EmptyBorder;
import javax.swing.border.TitledBorder;

@SuppressWarnings("serial")
public class BasicLayouts extends JFrame {
  public BasicLayouts() {
    super("Basic layouts");
    // create components of window
    createMenuBar();
    Container horizontalLayout = createHorizontalGroupBox();
    Container gridLayout = createGridLayout();
    Container formLayout = createFormLayout();
    Container textArea = createTextArea();
    Container dialogButtons = createDialogButtons();
    // set group layout to content pane
    Container contentPane = getContentPane();
    GroupLayout mainLayout = new GroupLayout(contentPane);
    contentPane.setLayout(mainLayout);
    mainLayout.setAutoCreateContainerGaps(true);
    mainLayout.setAutoCreateGaps(true);
    // add components of window to group layout
    mainLayout.setHorizontalGroup(mainLayout.createParallelGroup()
        .addComponent(horizontalLayout).addComponent(gridLayout).addComponent(
            formLayout).addComponent(textArea).addComponent(dialogButtons));
    mainLayout.setVerticalGroup(mainLayout.createSequentialGroup()
        .addComponent(horizontalLayout).addComponent(gridLayout).addComponent(
            formLayout).addComponent(textArea).addComponent(dialogButtons));
    //
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    pack();
    setMinimumSize(getSize());
    setVisible(true);
  }

  private void createMenuBar() {
    JMenuBar menuBar = new JMenuBar();
    JMenu fileMenu = new JMenu("File");
    fileMenu.setMnemonic(KeyEvent.VK_F);
    JMenuItem exitItem = new JMenuItem(new AbstractAction() {
      {
        putValue(NAME, "Exit");
        putValue(MNEMONIC_KEY, KeyEvent.VK_X);
      }

      @Override
      public void actionPerformed(ActionEvent e) {
        System.exit(0);
      }
    });
    fileMenu.add(exitItem);
    menuBar.add(fileMenu);
    setJMenuBar(menuBar);
  }

  private Container createHorizontalGroupBox() {
    JPanel panel = new JPanel();
    GroupLayout groupLayout = new GroupLayout(panel);
    groupLayout.setAutoCreateGaps(true);
    final int nButtons = 4;
    SequentialGroup horizontalGroup = groupLayout.createSequentialGroup();
    ParallelGroup verticalGroup = groupLayout.createParallelGroup();
    for (int i = 1; i <= nButtons; i++) {
      JButton button = new JButton("Button " + i);
      horizontalGroup.addComponent(button, GroupLayout.DEFAULT_SIZE,
          GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE);
      verticalGroup.addComponent(button);
    }
    groupLayout.setHorizontalGroup(horizontalGroup);
    groupLayout.setVerticalGroup(verticalGroup);
    panel.setLayout(groupLayout);
    Insets insets = new Insets(2, 2, 2, 2);
    panel.setBorder(new CompoundBorder(new TitledBorder("Horizontal layout"),
        new EmptyBorder(insets)));
    return panel;
  }

  private Container createGridLayout() {
    JPanel panel = new JPanel();
    panel.setLayout(new GridBagLayout());
    JLabel label1st = new JLabel("Line 1:");
    JLabel label2nd = new JLabel("Line 2:");
    JLabel label3rd = new JLabel("Line 3:");
    JTextField textField1st = new JTextField();
    JTextField textField2nd = new JTextField();
    JTextField textField3rd = new JTextField();
    JTextArea textArea = new JTextArea(
        "This widget takes up about two thirds of the grid layout.");
    textArea.setLineWrap(true);
    textArea.setWrapStyleWord(true);
    JScrollPane scrollPane = new JScrollPane(textArea);
    Insets insets = new Insets(2, 2, 2, 2);
    panel.setBorder(new CompoundBorder(new TitledBorder("Grid layout"),
        new EmptyBorder(insets)));
    Component glue = Box.createGlue();
    panel.add(glue, new GridBagConstraints(0, 0, 2, 1, 0.5, 1.0, CENTER, BOTH,
        insets, 0, 0));
    panel.add(label1st, new GridBagConstraints(0, 1, 1, 1, 0.0, 0.0, CENTER,
        NONE, insets, 0, 0));
    panel.add(label2nd, new GridBagConstraints(0, 2, 1, 1, 0.0, 0.0, CENTER,
        NONE, insets, 0, 0));
    panel.add(label3rd, new GridBagConstraints(0, 3, 1, 1, 0.0, 0.0, CENTER,
        NONE, insets, 0, 0));
    panel.add(textField1st, new GridBagConstraints(1, 1, 1, 1, 0.5, 0.0,
        CENTER, HORIZONTAL, insets, 0, 0));
    panel.add(textField2nd, new GridBagConstraints(1, 2, 1, 1, 0.5, 0.0,
        CENTER, HORIZONTAL, insets, 0, 0));
    panel.add(textField3rd, new GridBagConstraints(1, 3, 1, 1, 0.5, 0.0,
        CENTER, HORIZONTAL, insets, 0, 0));
    panel.add(scrollPane, new GridBagConstraints(2, 0, 1, 4, 1.0, 1.0, CENTER,
        BOTH, insets, 0, 0));
    Dimension zeroSize = new Dimension(0,
        textField1st.getPreferredSize().height);
    textField1st.setPreferredSize(zeroSize);
    textField2nd.setPreferredSize(zeroSize);
    textField3rd.setPreferredSize(zeroSize);
    scrollPane.setPreferredSize(zeroSize);
    return panel;
  }

  private Container createFormLayout() {
    JPanel panel = new JPanel();
    GroupLayout groupLayout = new GroupLayout(panel);
    groupLayout.setAutoCreateGaps(true);
    JLabel label1st = new JLabel("Line 1:");
    JLabel label2nd = new JLabel("Line 2, long text:");
    JLabel label3rd = new JLabel("Line 3:");
    JTextField textField = new JTextField();
    JComboBox comboBox = new JComboBox();
    JSpinner spinner = new JSpinner();
    groupLayout.setHorizontalGroup(groupLayout.createSequentialGroup()
        .addGroup(
            groupLayout.createParallelGroup().addComponent(label1st)
                .addComponent(label2nd).addComponent(label3rd)).addGroup(
            groupLayout.createParallelGroup().addComponent(textField)
                .addComponent(comboBox).addComponent(spinner)));
    groupLayout.setVerticalGroup(groupLayout.createSequentialGroup().addGroup(
        groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
            .addComponent(label1st).addComponent(textField)).addGroup(
        groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
            .addComponent(label2nd).addComponent(comboBox,
                GroupLayout.DEFAULT_SIZE, GroupLayout.PREFERRED_SIZE,
                GroupLayout.PREFERRED_SIZE)).addGroup(
        groupLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
            .addComponent(label3rd).addComponent(spinner)));
    panel.setLayout(groupLayout);
    Insets insets = new Insets(2, 2, 2, 2);
    panel.setBorder(new CompoundBorder(new TitledBorder("Form layout"),
        new EmptyBorder(insets)));
    return panel;
  }

  private Container createTextArea() {
    JTextArea textArea = new JTextArea(
        "This widget takes up all the remaining space "
            + "in the top-level layout.");
    textArea.setLineWrap(true);
    textArea.setRows(4);
    return new JScrollPane(textArea);
  }

  private Container createDialogButtons() {
    JPanel panel = new JPanel();
    JButton ok = new JButton("OK");
    JButton cancel = new JButton("Cancel");
    GroupLayout groupLayout = new GroupLayout(panel);
    groupLayout.setAutoCreateGaps(true);
    groupLayout.setHorizontalGroup(groupLayout.createSequentialGroup().addGap(
        0, 0, Short.MAX_VALUE).addComponent(ok).addComponent(cancel));
    groupLayout.setVerticalGroup(groupLayout.createParallelGroup()
        .addComponent(ok).addComponent(cancel));
    groupLayout.linkSize(ok, cancel);
    panel.setLayout(groupLayout);
    return panel;
  }

  public static void main(String[] args) {
    try {
      UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
    } catch (Exception e) {
      e.printStackTrace();
    }
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        new BasicLayouts();
      }
    });
  }
}


Автор: Temdegon 27.1.2009, 02:42
По-моему, цифры на скриншоте говорят о том, сколько потребляет виртуальная машина. А сколько памяти использует само приложение можно посмотреть с помощью входящих в JDK jvisualvm.exe или jconsole.exe. У меня эти утилиты показывают примерно 2.5 метра. Хотя я могу заблуждаться по неопытности...
Не поленился, влючил "отображение содержимого окна при перетаскивании". У меня окно ведет себя абсолютно нормально, как и все остальные окна в системе. Не лагает при перетаскивании и во время разворачивания во весь экран и изменения размеров. Хотя я точно помню, что раньше такие проблемы у меня были и меня это жутко раздражало. Скорее всего у меня не лагает из-за того что в винде использую оформление "Windows Classic". Недавно возился с DB-менеджером SQuirreL, написанном на Java. Там тоже ооочень сильно влияло то, какой L&F выбран.

Автор: kamre 27.1.2009, 09:51
Цитата(Temdegon @ 27.1.2009,  02:42)
По-моему, цифры на скриншоте говорят о том, сколько потребляет виртуальная машина. А сколько памяти использует само приложение можно посмотреть с помощью входящих в JDK jvisualvm.exe или jconsole.exe. У меня эти утилиты показывают примерно 2.5 метра. Хотя я могу заблуждаться по неопытности...

Конечно, цифры говорят именно о том, сколько у системы было забрано ресурсов. Также как и в случае с Qt4, память учтена с ее довольно толстыми загруженными библиотеками. И какая разница сколько потребляет сама JVM, а сколько именно Java программа? В итоге получается какой-то дикий overhead на JVM. Причем для Metal LAF потребление за пределы 35Мб не выходит (это уже нормально при изначальных 30Мб при старте программы).

Цитата(Temdegon @ 27.1.2009,  02:42)
Не поленился, влючил "отображение содержимого окна при перетаскивании". У меня окно ведет себя абсолютно нормально, как и все остальные окна в системе. Не лагает при перетаскивании и во время разворачивания во весь экран и изменения размеров. Хотя я точно помню, что раньше такие проблемы у меня были и меня это жутко раздражало. Скорее всего у меня не лагает из-за того что в винде использую оформление "Windows Classic". Недавно возился с DB-менеджером SQuirreL, написанном на Java. Там тоже ооочень сильно влияло то, какой L&F выбран.

Конечно, содержимое окна при перетаскивании должно быть включено. И, конечно, с оформлением "Windows Classic" будет работать быстрее, т.к. там рисовать нужно меньше. А вот на стандартных "Windows XP (Blue/Silver/Olive)" темах именно такое поведение как я и описал.

Автор: kemiisto 27.1.2009, 12:45
kamre, для начала ответьте на несколько вопросов.
1. Какая версия Qt: OpenSource или Comercial? Каким компилятором собран пример: VC+ или gcc из MinGW.
2. Какая версия Java? 
3. Почему сравниваете только под Windows? Я вот сейчас на MacOS запускал, оба примера смотряться как надо (в плане шрифты там, нативные виджеты, ...). Qt - 11 МБ, Java - 45 МБ. Думается мне, что и на Linux будет примерно тоже самое (вечерком проверу, если время будет). А то, что Java не ахти как работает под Windows - так я абсолютно уверен, что тут без MS не обошлось. 

Автор: kamre 27.1.2009, 13:40
Цитата(kemiisto @ 27.1.2009,  12:45)

1. Какая версия Qt: OpenSource или Comercial? Каким компилятором собран пример: VC+ или gcc из MinGW.

А какая разница, исходники же одни? Использовалась OpenSource Qt 4.4 собранная MSVC 2008 Express.

Цитата(kemiisto @ 27.1.2009,  12:45)

2. Какая версия Java? 

Код

java version "1.6.0_11"
Java(TM) SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot(TM) Client VM (build 11.0-b16, mixed mode, sharing)


Цитата(kemiisto @ 27.1.2009,  12:45)

3. Почему сравниваете только под Windows? Я вот сейчас на MacOS запускал, оба примера смотряться как надо (в плане шрифты там, нативные виджеты, ...). Qt - 11 МБ, Java - 45 МБ. Думается мне, что и на Linux будет примерно тоже самое (вечерком проверу, если время будет). А то, что Java не ахти как работает под Windows - так я абсолютно уверен, что тут без MS не обошлось.

Потому что Windows XP пока самая распространненая платформа на десктопах и ноутах (да и я буду ее использовать как минимум до тех пор пока новый комп не куплю, чтобы Vista/Win7 нормально ворочались). 
Про MacOS - ничего не скажу, не видал в живую. А там Java от SUN или от Apple (это совсем разные вещи вроде бы)? 
А на Linux c моей NVIDIA 7600GS дела с 2D графикой настолько плохи (тормоза-тормоза-тормоза), что он вообще в полном пролете (просто не юзабельно по сравнению с XP). Да и в нем "родной" GTK LAF тоже весьма косячный в SUN JRE. И кстати OpenJDK даже еще больше тормозит, чем SUN.

Автор: kemiisto 27.1.2009, 15:46
Цитата(kamre @  27.1.2009,  11:40 Найти цитируемый пост)
Потому что Windows XP пока самая распространненая платформа на десктопах и ноутах (да и я буду ее использовать как минимум до тех пор пока новый комп не куплю, чтобы Vista/Win7 нормально ворочались). 

Я к тому, что если писать под Windows - то уж лучше .NET. А если сравнивать Qt и Swing приложения, то уж тогда на всех платформах.

Цитата(kamre @  27.1.2009,  11:40 Найти цитируемый пост)
java version "1.6.0_11"
Java™ SE Runtime Environment (build 1.6.0_11-b03)
Java HotSpot™ Client VM (build 11.0-b16, mixed mode, sharing)

Очень жаль... У меня возможности сейчас посмотреть нету... Но если так дела обстоят, то плохо... smile 

Цитата(kamre @  27.1.2009,  11:40 Найти цитируемый пост)
Про MacOS - ничего не скажу, не видал в живую. А там Java от SUN или от Apple (это совсем разные вещи вроде бы)? 

От Apple.

Цитата(kamre @  27.1.2009,  11:40 Найти цитируемый пост)
Да и в нем "родной" GTK LAF тоже весьма косячный в SUN JRE. И кстати OpenJDK даже еще больше тормозит, чем SUN. 

Да, есть такое... Спору нет.

Автор: Kallikanzarid 9.2.2009, 16:36
Почитал тему маленько. ИМХО, хорошо бы проверять в тестах не только простые вычислительные задачи, но и, например, задачи по буфферизованному вводу-выводу, по коллекциям/контейнерам. Особенно меня интересует последний пункт, так как он по-разному реализован в JDK и STL.

Далее, почему в качестве компилятора C++ часто выступает VS6, в то время, как JVM используется последней версии? Давайте использовать либо ICC11, либо VS9, либо GCC.

Наконец, любопытно было бы сравнить производительность JVM и LLVM - как разные подходы конкурируют в плане потребления ресурсов.

Автор: EJack 10.2.2009, 12:19
Неправильно сравнивать платформу (Java) и библиотеку (Qt) непонятно что конкретно мерим. Это как сравнивать теплое с мягким.
И еще если Java взяла память это далеко не значит что вся память используется - скорее всего это оптимизация в плане для более быстрого выделения памяти и ухот от ее фрагментивности в памяти. Кроме того необходима память для работы сборщика мусора (за удобства надо платить).

Добавлено через 1 минуту и 4 секунды
А у меня дома ваш пример вообще не тормозит все летает - и работает все на висте все красиво!

Добавлено через 7 минут и 51 секунду
Да и посмотрите на IDEA достаточно приятная вещь и работает шустро - да там у них вроде свой L&F

Автор: LSD 10.2.2009, 13:19
Цитата(Kallikanzarid @  9.2.2009,  16:36 Найти цитируемый пост)
Далее, почему в качестве компилятора C++ часто выступает VS6, в то время, как JVM используется последней версии? Давайте использовать либо ICC11, либо VS9, либо GCC.

Почему люди только советуют, как надо проводить тесты, но при этом никто их сам не желает создавать? Ну или хотя бы пересобрать уже существующие и прогнать заново?

Автор: Kallikanzarid 10.2.2009, 17:27
Как черновой вариант (на С++):

Код

#include <fstream>
#include <complex>
#include <list>
#include <algorithm>
#include <iterator>

using namespace std;
    
inline bool abs_less( const complex<double> &x, const complex<double> &y ) {
    return abs(x) < abs(y);
}

int main() {
    
    ifstream in( "in.txt" );
    ofstream out( "out.txt" );
    
    list< complex< double > > lst;
    copy( istream_iterator< complex< double > >( in ),
          istream_iterator< complex< double > >(),
          back_inserter( lst ) );
    lst.sort( &abs_less );
    copy( lst.begin(), lst.end(), ostream_iterator< complex< double > >( out, " " ) );
}



Пример in.txt:
Код

(1) (3) (2) (0.5, 100)


Если кто сделает что-то подобное на Java, используя стандартную библиотеку (не важно, как именно там выводится Complex), можем проверить производительность.

Автор: LSD 10.2.2009, 17:36
Хотелось бы описание алгоритма:
- входные данные ...
- требуется сделать ...
- на выходе должны получить ...

Автор: Kallikanzarid 10.2.2009, 17:47
Простой бенчмарк:
1) Читаем комплексные числа в двойной список из файла.
2) Сортируем
3) Выводим отсортированный список в другой файл.

Автор: v2v 10.2.2009, 20:56
в JDK нету класс комплексных чисел. 

Автор: Shaggie 10.2.2009, 21:11
В http://commons.apache.org/math/ есть реализация, можно взять её.

Автор: v2v 10.2.2009, 21:53
не, так либу целую надо тащить ... прое самому класс написать ... в любом случае эксперимент будет не совсем чистый.

Автор: Kallikanzarid 10.2.2009, 22:15
Достаточно написать имитацию std::complex из C++ - с двумя членами, аксессорами, функцией abs(x) и методом toString(). Ну или как вам лучше - я вопросами производительности Java раньше не интересовался.

Цитата

в любом случае эксперимент будет не совсем чистый.

ИМХО, основная потеря производительности джавы заключается именно в инженерных решениях при разработке коллекций, большое число метаданных, из-за которых не так эффективен кэш, использовании большого числа уровней абстракции при вводе-выводе и т. д. В бенчмарках вроде "вызови простой метод 10000 раз" или "перемножь две матрицы" это никогда не проявится. Так что такие "нечистые" эксперименты - ИМХО, единственный способ получить представление о том, как соотносится производительность реальных приложений на джаве с производительностью реальных приложений на более низкоуровневых языках.

Автор: kamre 10.2.2009, 23:47
Цитата(EJack @ 10.2.2009,  12:19)
Неправильно сравнивать платформу (Java) и библиотеку (Qt) непонятно что конкретно мерим. Это как сравнивать теплое с мягким.

Почему же неправильно то? Сравнивал именно скорость отрисовки для простого окна, а также то насколько хорошо поддерживается System Look And Feel (в моем случае это Windows XP LAF). 

Кстати, вот еще сравнивал скорость Java2D и Qt: http://trac-hg.assembla.com/jgears  В принципе Java2D не так уж и сильно тормозит, правда не поддерживает полноценное hardware acceleration.

Цитата(EJack @ 10.2.2009,  12:19)

И еще если Java взяла память это далеко не значит что вся память используется - скорее всего это оптимизация в плане для более быстрого выделения памяти и ухот от ее фрагментивности в памяти. Кроме того необходима память для работы сборщика мусора (за удобства надо платить).

А у меня дома ваш пример вообще не тормозит все летает - и работает все на висте все красиво!

Ну вот при запуске того самого окошка, Java взяла примерно 30Мб памяти, это нормально. А вот то, что при ресайзе окошка она постоянно аллоцирует новые объекты (похоже что картинки для кэширования) и потребление памяти за 100Мб переваливает (при этом еще и сборщик мусора постоянно подчищает эти объекты и все еще больше тормозит) - не нормально. Хотя к скорости и потреблению памяти для Metal LAF у меня претензий нет, все работает достаточно быстро и не жрет память. Но зато есть претензии в виду самого Metal LAF...

Цитата(EJack @ 10.2.2009,  12:19)

Да и посмотрите на IDEA достаточно приятная вещь и работает шустро - да там у них вроде свой L&F

Eclipse побыстрее работает (именно в плане интерфейса вроде прокрутки окна с кодом), хотя на современной машинке это почти и не заметно. А на счет LAF - в IDEA по умолчанию Alloy LAF, и он половину шрифтов не сглаживает в интерфейсе почему-то. 

Автор: EJack 11.2.2009, 06:49
Цитата(kamre @  10.2.2009,  23:47 Найти цитируемый пост)
Почему же неправильно то? Сравнивал именно скорость отрисовки для простого окна, а также то насколько хорошо поддерживается System Look And Feel (в моем случае это Windows XP LAF). 

Кстати, вот еще сравнивал скорость Java2D и Qt: http://trac-hg.assembla.com/jgears  В принципе Java2D не так уж и сильно тормозит, правда не поддерживает полноценное hardware acceleration.


Потому что платформа потребляет всегда больше ресурсов по определению. Есть такая вещь как мета данные - их много, под них нужна память.


Цитата(kamre @  10.2.2009,  23:47 Найти цитируемый пост)
Ну вот при запуске того самого окошка, Java взяла примерно 30Мб памяти, это нормально. А вот то, что при ресайзе окошка она постоянно аллоцирует новые объекты (похоже что картинки для кэширования) и потребление памяти за 100Мб переваливает (при этом еще и сборщик мусора постоянно подчищает эти объекты и все еще больше тормозит) - не нормально. Хотя к скорости и потреблению памяти для Metal LAF у меня претензий нет, все работает достаточно быстро и не жрет память. Но зато есть претензии в виду самого Metal LAF...


Тут конечно стоит вопрос реализации самого L&F, кроме того сборщик работает не постоянно - а только когда решает что пора. Например зачем чистить 50 метров, если в системе еще свободно 2 гига, поэтому память и растет.

Цитата(kamre @  10.2.2009,  23:47 Найти цитируемый пост)
Eclipse побыстрее работает (именно в плане интерфейса вроде прокрутки окна с кодом), хотя на современной машинке это почти и не заметно. А на счет LAF - в IDEA по умолчанию Alloy LAF, и он половину шрифтов не сглаживает в интерфейсе почему-то. 


Вот не очень то я уверен что в эклипсе прокрутка быстрее - спорить не буду. На згляд у всех по разному будет, у меня вообще на поймешь (машинка зверь), но вот отчего я с эклипса перелез на НетБинс а теперь и идею осваиваю (покупать собрался) так это по стабильности работы. Да и 8 версия вообще лапочка smile

Автор: LSD 11.2.2009, 12:46
Цитата(Kallikanzarid @  10.2.2009,  17:47 Найти цитируемый пост)
1) Читаем комплексные числа в двойной список из файла.

Формат записи числа? Как разделяются отдельные числа?


Цитата(Kallikanzarid @  10.2.2009,  17:47 Найти цитируемый пост)
2) Сортируем

Множество комплексных чисел неупорядоченное. Как сортируем?


Цитата(Kallikanzarid @  10.2.2009,  17:47 Найти цитируемый пост)
3) Выводим отсортированный список в другой файл. 

Формат такой же как и во входном файле?

Автор: Kallikanzarid 11.2.2009, 13:20
Цитата

Формат записи числа? Как разделяются отдельные числа?


Числа записываются как два числа в скобках через запятую или одно число в скобках, если мнимая часть равна нулю:
(1) (0, 1), (0.000001, 3414)

Числа разделены пробелом.

Цитата

Множество комплексных чисел неупорядоченное. Как сортируем?

Сорри  smile Сортируем по модулю по убыванию. Реализацию можно взять стандартную, а можно ручную (так как стандартная написана на С  smile )

Цитата

Формат такой же как и во входном файле? 

Да.

Автор: Kallikanzarid 11.2.2009, 14:46
Немного переделал:
Код

#include <iostream>
#include <fstream>
#include <complex>
#include <list>
#include <algorithm>
#include <iterator>
#include <boost/lambda/lambda.hpp>
#include <boost/lambda/bind.hpp>
#include <cstdlib>

using namespace std;
using namespace boost::lambda;

int main() {
    clock_t before;
    
    ifstream in( "in.txt" );
    ofstream out( "out.txt" );
    
    before = clock();
    list< complex< double > > lst;
    copy( istream_iterator< complex< double > >( in ),
          istream_iterator< complex< double > >(),
          back_inserter( lst ) );
    cout << "Reading file -- " << double( clock() - before ) / CLOCKS_PER_SEC << " secs." << endl;
    
    before = clock();
    lst.sort( bind( &norm<double>, _1 ) < bind( &norm<double>, _2 ) );
    cout << "Sorting -- " << double( clock() - before ) / CLOCKS_PER_SEC << " secs." << endl;
    
    before = clock();
    copy( lst.begin(), lst.end(), ostream_iterator< complex< double > >( out, " " ) );
    cout << "Writing file -- " << double( clock() - before ) / CLOCKS_PER_SEC << " secs." << endl;
}



Добавлено через 10 минут и 53 секунды
Протестировал на файле из 10000 чисел (~10 мб):

Код

Reading file -- 3.144 secs.
Sorting -- 0.267 secs.
Writing file -- 2.604 secs.


Машина - Pentium D 2.80, 1024 MB, Windows Vista.

Автор: Kallikanzarid 12.2.2009, 19:27
Люди, ау smile

Автор: Temdegon 13.2.2009, 00:34
У меня такой вопрос. Есть к примеру сервер вооруженный 4-мя двухъядерными процами. Если запустить на этом сервере Java-приложение, которое будет что-то длительное время делать, будут ли использоваться все процессоры или система ограничится одним? Приложение на Cи,  решающее эту задачу (Автоматическое составление расписания для студентов) выполняется около 40 минут, но при этом используется только один процессор. Переписать эту программу так, что бы она использовала остальные процесоры никто не может по многим причинам. Вот у меня и возник этот вопрос, есть ли с этим делом какие-то сложности у Java? Насколько она эффективна на многопроцессорных системах? Должен ли сам код быть многопоточным для этого? Есть ли какие-то тонкости в установке и насторойке jre на многопроцессорных серверах? Есть ли особенности в написании кода для таких систем?

Автор: v2v 13.2.2009, 00:52
Переделать приложение в многопоточное. В вашем случае будет достаточным разделить нагрузку между 4мя паралельными потоками, и производительность возростёт ровно в 4 раза.

Добавлено через 2 минуты и 47 секунд
Цитата(Temdegon @  13.2.2009,  00:34 Найти цитируемый пост)
Есть ли какие-то тонкости в установке и насторойке jre на многопроцессорных серверах? Есть ли особенности в написании кода для таких систем? 

нет, реализовать многопоточность будет достаточно, об остальном позаботится ОС.

Добавлено через 4 минуты и 29 секунд

Можете проследить за загрузкой ЦПУ на разных ядрах при выполнении следующего врагмента кода.

Код


public class ThreadTest extends Thread {

    public void run(){
        int k = 0;
        while (true){
            k++;
            if (k > 1000) {
                k /= 2;
            }
        }
    }

    public static void main(String[] args) {
        Thread thread1 = new ThreadTest();
        thread1.start();
        Thread thread2 = new ThreadTest();
        thread2.start();
/*        Thread thread3 = new ThreadTest();
        thread3.start();
        Thread thread4 = new ThreadTest();
        thread4.start();
*/    }

}


Автор: Cr@$h 13.2.2009, 08:57
 smile 
Цитата(Temdegon @  13.2.2009,  01:34 Найти цитируемый пост)
Если запустить на этом сервере Java-приложение, которое будет что-то длительное время делать, будут ли использоваться все процессоры или система ограничится одним?

Операционная система ничем не ограничится и ничем не расширится. Сколько потоков есть, столько и будет.
Цитата(Temdegon @  13.2.2009,  01:34 Найти цитируемый пост)
Переписать эту программу так, что бы она использовала остальные процесоры никто не может по многим причинам.

Одной из причин являются невозможностью распараллелить сам алгоритм?
Цитата(Temdegon @  13.2.2009,  01:34 Найти цитируемый пост)
Вот у меня и возник этот вопрос, есть ли с этим делом какие-то сложности у Java? Насколько она эффективна на многопроцессорных системах?

Распараллеливаешь в ручную, используя потоки. Такая программа будет написана только на N-ядерные/процессорные платформы. Каждый раз придётся переписывать для нового числа ядер.
Цитата(Temdegon @  13.2.2009,  01:34 Найти цитируемый пост)
Должен ли сам код быть многопоточным для этого?

Управляемый код уже содержит в себе многопоточность, но лишь служебного характера.
Цитата(v2v @  13.2.2009,  01:52 Найти цитируемый пост)
разделить нагрузку между 4мя паралельными потоками, и производительность возростёт ровно в 4 раза.

Так говорить нельзя. За такое можно сразу банить.  smile 

Автор: v2v 13.2.2009, 09:40
Цитата(Cr@$h @  13.2.2009,  08:57 Найти цитируемый пост)

Так говорить нельзя. За такое можно сразу банить.  smile  

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

Автор: batigoal 13.2.2009, 10:27
Цитата(Cr@$h @  13.2.2009,  09:57 Найти цитируемый пост)
Распараллеливаешь в ручную, используя потоки. Такая программа будет написана только на N-ядерные/процессорные платформы. Каждый раз придётся переписывать для нового числа ядер.

Ммм. Почему? Достаточно сделать число потоков конфигурируемым, насколько я понимаю.

Автор: Neox_GeForce 3.7.2009, 11:10
Цитата(jer1 @ 16.1.2006,  15:54)
взял программу Коть и запустил  у себя
 Вот программы которые я использовал:
Код
#include <stdio.h>
#include <time.h>

const int N = 1000000;

unsigned int f;
unsigned int factorial (unsigned int a);
main()
{   
    clock_t t1 = clock();
    int i;
    for (i = 0; i < N; i++)
    {
        f = factorial(100);
    }
    clock_t t2 = clock();
    printf("\n Program execution time is %u milliseconds \n", (t2 - t1) * 10);

unsigned int factorial(unsigned int a)
{
    if (a == 1) return 1;
    else 
    {
        a *= factorial(a - 1);
        return a;
    }
}

Код

public class JavaSpeedTest {
    public static final int COMPUTE_COUNT = 1000000;

    public static void main(String [] args)
    {
        long t1 = System.currentTimeMillis();
        int f = 0;
        for (int i = 0; i < COMPUTE_COUNT; i++)
        {
            f = factorial(100);
        }

        System.out.println("\n Program execution time is " + (System.currentTimeMillis() - t1) + 
                                      "   milliseconds");    
    }

    public static int factorial(int a) 
    {
    if (a == 1) return 1;
        else 
        {
            a *= factorial(a - 1);
            return a;
        }
    }
}

Код

program DelphiSpeedTest; //Delphi 5.62
{$APPTYPE CONSOLE}
uses
  SysUtils;

const
    COMPUTE_COUNT: integer = 1000000;

    function factorial(a: integer): integer; begin
        if (a = 1) then factorial := 1
        else begin
            a := a * factorial(a - 1);
            factorial := a;
        end;
    end;

var
   i: integer;
   time0, time1 : TDateTime;
   Year, Month, Day, Hour, Min, Sec, MSec: Word;
   f: integer;
begin
   time0 := now;
   for i := 0 to COMPUTE_COUNT do f := factorial(100);
   time1 := now;
   DecodeTime(time1 - time0, Hour, Min, Sec, MSec);
   write('Program execution time is ');
   write(intToStr(1000*sec+mSec)); write(' in miliseconds');
end.

компьютер Celeron 1.2  256M  os: XP Professional, Linux Slackware ядро 2.4.26
 jdk:
java version "1.5.0_04"
Java™ 2 Runtime Environment, Standard Edition (build 1.5.0_04-b05)
Java HotSpot™ Client VM (build 1.5.0_04-b05, mixed mode, sharing)

результаты в миллисекундах (три запуска):
delphi 5: 1141; 1140; 1156
java XP: 1187; 1203; 1187
java linux: 1201; 1189; 1203
java linux server: 685; 696; 705
c (gcc -o test2 CSpeedTest.c ): 19000000; 19000000; 19100000
c(gcc -O3 -o test CSpeedTest.c): 10800000; 11000000; 10800000
gcj (gcj -c -g -O JavaSpeedTest.java; gcj --main=JavaSpeedTest -o GCJSpeedTest JavaSpeedTest.o ): 2815; 2826; 2828

код на шарпе 
Код

using System;
using System.Diagnostics;

namespace CsharpSpeed
    {
    class Program
        {
        public const int N=1000000;
        public static uint factorial(uint a)
{
    if (a == 1) return 1;
    else 
    {
        a *= factorial(a - 1);
        return a;
    }
}
        static void Main(string[] args)
            {
            Stopwatch timer=new Stopwatch();
            int i;
            uint f;
            timer.Start();
            for (i = 0; i < N; i++)
                {
                f = factorial(100);
                }
                timer.Stop();
             Console.WriteLine("\n Program execution time is {0} milliseconds \n",timer.ElapsedMilliseconds);
            Console.ReadLine();
            }
        }
    }



Результаты(3 запуска):
 1071 ms
 1068 ms 
 1068 ms

Потом скомпилил в среде Dev-C++  с найлутшей оптимизацией
Код

#include <stdio.h>
#include <time.h>
#include <iostream>
const int N = 1000000;
unsigned int f;
unsigned int factorial (unsigned int a);
main()
{   
    clock_t t1 = clock();
    int i;
    for (i = 0; i < N; i++)
    {
        f = factorial(100);
    }
    clock_t t2 = clock();
    printf("\n Program execution time is %u milliseconds \n", (t2 - t1) * 10);
    system("Pause");

unsigned int factorial(unsigned int a)
{
    if (a == 1) return 1;
    else 
    {
        a *= factorial(a - 1);
        return a;
    }
}



Результаты:
5620 ms
5620 ms
5460 ms

Машина: Intel core 2 duo 1.86 . RAM 1GB.




Автор: kamre 3.7.2009, 16:12
Цитата(Neox_GeForce @ 3.7.2009,  11:10)
Потом скомпилил в среде Dev-C++  с найлутшей оптимизацией
Код

...
    printf("\n Program execution time is %u milliseconds \n", (t2 - t1) * 10);
...


Результаты:
5620 ms
5620 ms
5460 ms

Для начала неплохо перемерять с корректным подсчетом времени:
Код

printf("\n Program execution time is %u milliseconds \n", (t2 - t1) * 1000 / CLOCKS_PER_SEC);


И использовать современный компилятор (MSVC9/IntelCPP11/GCC4), а не престарелый MinGW из Dev-C++.

Автор: LSD 3.7.2009, 17:09
1. Этот тест меряет в первую очередь затраты на вызов метода. И в том что C# в это тесте быстрее C++ нет ничего удивительного.

2. Этот топик все таки посвящен Java, а не C# vs C++, так что не увлекайтесь. smile 

Автор: serger 21.8.2009, 09:34
Ну ОЧЕНЬ давно хотел упомянуть про аллокацию в java.
Руки таки дошли...

http://www.ibm.com/developerworks/ru/library/j-jtp09275/index.html

Автор: Vitaly333 12.10.2009, 22:39
Вот и я решил внести свою лепту... Сегодня будем сравнивать какой же язык/компилятор лучше всего оптимизирует циклы и быстрее производит арифметические операции над числами с плавающей точкой или запятой, кому как угодно. Как гласит золотое правило 80% времени выполнения программы уходит на 20% кода. Чаще всего как раз эти 20%  состоят из большого кол-ва вложенных циклов и арифметических вычислений. От того как оптимизирован "циклический" алгоритм зависит многое. Но сегодня, в большинстве случаев,  за оптимизацию циклов  отвечает не программист а компилятор.От того как последний выполнит эту работу  также зависит очень многое.  Одни компиляторы очень хорошо справляются с этой задачей, другие намного хуже.  Основной вопрос заключается в следующем: стоит ли оптимизировать циклы вручную, если современные компиляторы могут сделать это за вас? И какой копилятор на сегодня лучше всего делает это? Я попытаюсь ответить на эти вопросы  в этой теме. 
Для сравнений я взял, на мой взгляд, самый подходящий в этом случае численный алгоритм - алгоритм умножения матриц (С = С + A*B). Во первых он довольно прост в реализации. Во вторых это фундаментальный алгоритм линейной алгебры, который реально способен показать производительность программно-аппаратной системы, её приемущества и недостатки. В третьих, существует различные варианты его программной реализации, а значит есть несколько возможных путей его оптимизации для компиляторов и программистов. Поэтому здесь я привожу три программные реализации этого алгоритма:
1)  Классический (иногда ещё его называют наивным) ijk-алгоритм, использующий для вычисления c[i,j] элемента скалярное произведение i-ой строки матрицы A и j-ого столбца матрицы B.
2) Уже более хитрый чем первый ikj-алгоритм, умножающий i-строку матрицы A на j-ю строку матрицы B, для того чтобы вычислить каждый элемент матрицы C.
3) Блочный алгоритм, в котором квадратные матрицы A,B,C разбиваются на квадратные  блоки, размером bsizexbsize и потом перемножаются между собой так же как и элементы матриц, при обычном не блочном умножении.
Note: для простоты реализации матрицы A,B,C берутся квадратными одной и той же размерности. Используется арифметика двойной точности. 
Реализации этих алгоритмов на трех языках (Java, С++ и Fortran) приведены ниже:
Код

public class MatrixMultiply {

public static double[][] classicalMult(double[][] A, double[][] B,double[][] C, int N){
        
        int i,j,k;        
        for (i=0;i<N;i++)
            for (j=0;j<N;j++)
                for (k=0;k<N;k++)
                    C[i][j] +=A[i][k]*B[k][j];                                                                                    
return C;    
}


public static double[][] optimizeMult(double[][] A, double[][] B,double[][] C, int N){
        
        int i,j,k;        
        transpose(B);
        for (i=0;i<N;i++)
            for (j=0;j<N;j++)
                for (k=0;k<N;k++)
                    C[i][j] +=A[i][k]*B[j][k];

                transpose(B);                                                                                    
return C;    
}

 public static double[][] blockMult(double[][]A, double[][] B,double[][]C, int N,int bsize){
        
        
        int n,m,iter,i,j,k;                
        int ibeg,iend,jbeg,jend,kbeg,kend;
        
        double A0=0.0,A1=0.0,B0=0.0,B1=0.0,r,r0,r1,r2,r3;
        transpose(B);
        
        int gridSize = N/bsize;
        for (n=0; n<gridSize; n++){
            ibeg = n*bsize;
            iend = ibeg+bsize;
            for (m=0; m<gridSize; m++){
                jbeg = m*bsize;
                jend = jbeg+bsize;
                for (iter=0; iter<gridSize; iter++)    {
                    kbeg = iter*bsize;
                    kend = kbeg+bsize;
                    for (i=ibeg;i<iend;i+=2){                        
                        for(j=jbeg;j<jend;j+=2) {
                            r = 0.0;
                            r0 = 0.0;
                            r1 = 0.0;
                            r2 = 0.0;
                            r3 = 0.0;
                            for (k=kbeg; k<kend; k++){                            
                                A0 = A[i][k];
                                A1 = A[i+1][k];
                                B0 = B[j][k];
                                B1 = B[j+1][k];                                
                                r0 =r0+A0*B0;                                
                                r1=r1+A0*B1;                                
                                r2 =r2+A1*B0;
                                r3 =r3+A1*B1;                                                            
                            }
                            
                        C[i][j] +=r0;
                        C[i][j+1]+=r1;
                        C[i+1][j]+=r2;
                        C[i+1][j+1]+=r3;
                                            
                        }                            
                    }
                }                
            }
                
        }

        transpose(B);    
                
return C;        
}

 public static void transpose(double[][] A){
        double tmp = 0.0;
        int N = A[0].length;
        for (int i=0;i<N;i++){
            for (int j=0;j<i;j++){
                tmp = A[i][j];
                A[i][j] = A[j][i];
                A[j][i] = tmp;
            }
        }
    }

public static void fillMatrices(double[][] A, double[][] B, double[][] C,int N){
        
    int i,j;        
        for (i = 0; i < N; i++) {
        for (j = 0; j < N; j++) {
                   A[i][j] = Math.random()*10;    
                   B[i][j] = Math.random()*10;
                   C[i][j] = 0.0; 
         }
        }
        
    }

public static void main(String[] args) {
        
        final int N = 512;
        final int bSIZE = 64;
        
        System.out.println("Allocate memory");
        double[][] A = new double[N][N];
        double[][] B = new double[N][N];
        double[][] C = new double[N][N];
                System.out.println("Fill matrices");
        fillMatrices(A, B,C,N);
                
                System.out.println("Matrix multiplicaton...");                                            
        long t1,t2;
        t1 = System.currentTimeMillis();
        classicalMult(A, B, C,N);    
        //optimizeMult(A, B, C,N);    
        //blockMult(A, B, C, N,bSIZE);
        t2 = System.currentTimeMillis()-t1;
               System.out.println("Computation time = " + t2 + " millisec");
               if (t2==0) t2 = 0.000001;
               float perform = (float)(2*Math.pow(N/100.0,3.0)/t2);
               System.out.println("Performance = " + perform + " MFlops");
        
    }


}



Код

#include "conio.h"
#include "math.h"
#include <iostream>
#include "time.h"

using namespace std;


double** classicalMult(double** A, double** B,double** C,int N){

    int i,j,k;
        for (i=0;i<N;i++)
            for (j=0;j<N;j++)
                for (k=0;k<N;k++)
                    C[i][j] +=A[i][k]*B[k][j];                                    
        return C;
}

double** optimizeMult(double** A, double** B,double** C,int N){

      transpose(B,N);
    int i,j,k;
        for (i=0;i<N;i++)
            for (j=0;j<N;j++)
                for (k=0;k<N;k++)
                    C[i][j] +=A[i][k]*B[j][k];                                    
        return C;
}


double** blockMult(double**A, double** B,double**C, int N,int bsize){


        int n,m,iter,i,j,k;
        int ibeg,iend,jbeg,jend,kbeg,kend;

        double r,r0,r1,r2,r3;
        double A0=0.0,A1=0.0,B0=0.0,B1=0.0;
        transpose(B,N);

        int gridSize = N/bsize;
        for (n=0; n<=gridSize; n++){
            ibeg = n*bsize;
            iend = ibeg+bsize;
            for (m=0; m<gridSize; m++){
                jbeg = m*bsize;
                jend = jbeg+bsize;
                for (iter=0; iter<gridSize; iter++)    {
                    kbeg = iter*bsize;
                    kend = kbeg+bsize;
                    for (i=ibeg; i<iend; i+=2){
                        for (j=jbeg; j<jend; j+=2){
                            r0 = 0.0;
                            r1 = 0.0;
                            r2 = 0.0;
                            r3 = 0.0;
                            for (k=kbeg; k<kend;k++){
                                A0 = A[i][k];
                                A1 = A[i+1][k];
                                B0 = B[j][k];
                                B1 = B[j+1][k];
                                r0 = r0+A0*B0;
                                r1 = r1+A0*B1;
                                r2 = r2+A1*B0;
                                r3 = r3+A1*B1;
                            }

                            C[i][j] +=r0;
                            C[i][j+1]+=r1;
                            C[i+1][j]+=r2;
                            C[i+1][j+1]+=r3;

                        }
                    }
                }
            }

        }
                transpose(B,N);

        return C;

    }




void fillMatrices(double** A,double** B,double** C, int N){

        int i,j;
         for (i = 0;i < N; i++) {
            for (j = 0;j<N;j++){
                A[i][j] = rand()*10;
                B[i][j] = rand()*10;
                C[i][j] = 0;
            }
         }
 }


void transpose(double** A, int N){
        double tmp = 0.0;
        for (int i=0;i<N;i++){
            for (int j=0;j<i;j++){
                tmp = A[i][j];
                A[i][j] = A[j][i];
                A[j][i] = tmp;
            }
        }
    }


int main() {

    int const N = 512;
    int const BSIZE = 64;

    std::cout <<"Allocate memory..."<<endl;
 
    double** A = new double*[N];
    double** B = new double*[N];
    double** C = new double*[N];

    for (int i=0;i<N;i++){
        A[i] = new double[N];
        B[i] = new double[N];
        C[i] = new double[N];
    }

       std::cout <<"Fill matrices..."<<endl;
       fillMatrices(A,B,C,N);

       std::cout <<"Matrix multiplication..."<<endl;
       float t1,t2;
       t1 = clock();
       //classicalMult(A,B,C,N);
       //optimizeMult(A,B,C,N);
       //blockMult(A,B,C,N,BSIZE);
       t2 = (float)(clock()-t1)/CLOCKS_PER_SEC;
       std::cout <<"Computation time = "<<t2<<" sec. "<<endl;
       if (t2==0.0) t2 = 0.000000000001;
       float perform = 2*pow(N/100,3)/t2;
       std::cout<<"Performance = "<<perform<<" MFlops "<<endl;
       //getch();

 return 0;
}



Код


   FUNCTION CLASSICALMULT(A,B,C,N)
       INTEGER N
       DOUBLE PRECISION A(N,N),B(N,N),C(N,N)
       do i = 1,N
         do j = 1,N
           do k = 1,N
           C(j,i) = C(j,i) + A(j,k)*B(k,i)
           enddo
         enddo
       enddo
   END FUNCTION

   FUNCTION OPTIMIZEMULT(A,B,C,N)
       INTEGER N
       DOUBLE PRECISION A(N,N),B(N,N),C(N,N)
       call TRANS(A,N,N)
       do i = 1,N
         do j = 1,N
           do k = 1,N
           C(j,i) = C(j,i) + A(k,j)*B(k,i)
           enddo
         enddo
       enddo
   END FUNCTION

FUNCTION BLOCKMULT(A,B,C,N,BSIZE)
      INTEGER N,BSIZE
      DOUBLE PRECISION A(N,N),B(N,N),C(N,N)
      INTEGER GRIDSIZE
      GRIDSIZE = N/bsize-1
      call TRANS(A,N,N)

        do h=0,GRIDSIZE
            ibeg = h*bsize+1
            iend = ibeg+bsize-1
            do m=0,GRIDSIZE
                jbeg = m*bsize+1
                jend = jbeg+bsize-1
                do iter=0,GRIDSIZE
                    kbeg = iter*bsize+1
                    kend = kbeg+bsize-1
                    i = ibeg
                    do while (i<=iend)
                        j = jbeg
                        do while (j<=jend)
                            r0 = 0.
                                r1 = 0.
                                r2 = 0.
                                r3 = 0.
                                 r =  0.
                            do k=kbeg,kend
                                                             A0 = A(k,j)
                                                             A1 = A(k,j+1)
                                                             B0 = B(k,i)
                                                             B1 = B(k,i+1)
                                                             r0=r0+A0*B0
                                                             r1=r1+A0*B1
                                                             r2=r2+A1*B0
                                                             r3=r3+A1*B1
                            enddo
                            C(j,i) =C(j,i)+ r0
                            C(j,i+1)=C(j,i+1)+r1
                            C(j+1,i)=C(j+1,i)+r2
                            C(j+1,i+1)=C(j+1,i+1)+r3
                            j = j + 2
                        enddo
                        i = i + 2
                    enddo
                enddo
            enddo
        enddo
      END FUNCTION

       FUNCTION TRANS(A,N,M)
        INTEGER N,M
        DOUBLE PRECISION A(N,M)
         tmp = 0.
         do i=1,N
           do j=i+1,M
            tmp = A(i,j)
            A(i,j) = A(j,i)
            A(j,i) = tmp
           enddo
         enddo
        END FUNCTION

       FUNCTION FILLMATRICES(A,B,C,N,M)
      INTEGER N,M
      DOUBLE PRECISION A(N,M),B(N,M),C(N,M)
       k  = 0.
      do i = 1,N
        do j = 1,M
         A(i,j) = k
         B(i,j) = k
         C(i,j) = 0.
         k = k + 1.
         enddo
      enddo
      END

    PROGRAM MAIN
       Integer N,BSIZE
      Parameter(N=512,BSIZE=64)
      double precision A(N,N),B(N,N),C(N,N)
      real start, finish

      call FILLMATRICES(A,B,C,N,N)

      print *,'Matrix multiplication... '
      call cpu_time(start)

        call classicalMult(A,B,C,N)
!        call optimizeMult(A,B,C,N)
!         call BLOCKMULT(A,B,C,N,BSIZE)

      call cpu_time(finish)
      time = finish-start
      print *,'Computation time = ', time ,' millisec.'
      N = N/100;
      N3 = N*N*N 
      if (time.EQ.0.) time = 0.000001
      perform = 2*N3/time
      print *,'Performance = ', perform ,' MFlops.'
      END



В забеге участвовали след. компиляторы/интерпретаторы:
• GNU FORTRAN v 4.4.0
• INTEL VISUAL FORTRAN v 11.1.038
• GNU C++ v 4.4.0
• INTEL C++ v 11.1.035
• MSVS C++ v 8.00.50727.42 (из MSVS 2005)
• SUN CLIENT JVM 1.6_16
• SUN SERVER JVM 1.6_16
• EXCELSIOR JET 4.6
• GNU JAVA v 4.4.0    

Для тестов брались квадратные вещественные матрицы размерноcтью 512,1024,2048 и 4096. Каждый компилятор тестировался с разными ключами оптимизации.
Тестовая машина: OS Windows XP, CPU AMD Athlon64x2 2.41GHZ L1 = 64KB L2 = 512KB,400MHZ DDR 1GB
Вот результаты проведенного тестирования:
В каждой из таблиц приведено время, затраченное на выполнение умножения матриц.

Классический алгоритм:

user posted image

Оптимизированный алгоритм:

user posted image

Блочный алгоритм:

user posted image

Лучшие результаты для каждого компилятора я вынес в гистограммы производительности:

user posted image
user posted image
user posted image

Итак, как и ожидалось, самый быстрый код создают компиляторы от Интел. Пока им нет равных. Особенно это заметно на классическом варианте умножения матриц. В этом алгоритме изначально порядок следования циклов далеко не оптимальный. Это скорее всего улавливают компиляторы от Интел и располагает его нужным образом, а также задействуют векторизацию и др. оптимизации. Всё это позволяет "нихрена не делая" сделать почти безнадежный классический алгоритм очень эффективным. Другие компиляторы этого пока не могут. Поэтому приходится оптимизировать алгоритмы вручную. Блочный и ikj-алгоритмы за счет более эффективной работы с кэш памятью процессора позволяют несколько приблизится к результатам, полученным интелом. Что же касается Java, то серверная JVM от Sun на некоторых тестах выглядит достаточно достойно, почти на уровне MSVS C++ и GNU G++. Клиентская версия конечно ещё сильно отстает от своих конкурентов. Компиляторы из Java напямую в машинный код не везде так быстры как ожидалось. Того же касается и GNU Fortran. От него я ожидал большего. 
Вывод: Если нет времени на оптимизацию программы то стоит взять компилятор от Интел, включив по возможности высокий уровень оптимизации (ключи /O3  /fast). Если результат не удовлетворителен или если есть время, то стоит повозится с оптимизацией циклов. Можно применить след. способы оптимизации: блокирование циклов, разворот самого внутреннего цикла, если он короткий, заюзать векторизацию и регистры. Кстати говоря благодяря последним двум мне удалось обогнать компилятор от Интел, но здесь уже нужно писать на ASM-е.
Было бы не плохо узнать какие результаты получатся на процессоре Intel.


Автор: Xaker88 3.11.2009, 16:11
Код

using System;


namespace Project1
{
    class MainClass
    {
        public static void Main(string[] args)
        {
            int N=1000000;
            int Dt=DateTime.Now.Millisecond;
            
            
            int f;
            for (int i = 0; i < N; i++)
            {
             f = factorial(100);
            }
            
            Console.WriteLine("\n Program execution time is " + (DateTime.Now.Millisecond - Dt) +  "   milliseconds");
        }
         public static int factorial(int a)
         {
            if (a == 1) return 1;
            else
            {
                a *= factorial(a - 1);
                return a;
            }
        }
    }
}


Код

package javaapplication1;


public class Main
{

    
    public static void main(String[] args)
    {
        int N=1000000;
        long t1 = System.currentTimeMillis();
        int f;
        for (int i = 0; i < N; i++)
        {
            f = factorial(100);
        }
       System.out.println("\n Program execution time is " + (System.currentTimeMillis() - t1) +  "   milliseconds");

    }
    public static int factorial(int a)
    {
        if (a == 1) return 1;
        else
        {
            a *= factorial(a - 1);
            return a;
        }
    }

}



Джава в 10 раз медленней чем С#

Java(NetBeans) - 700   milliseconds
C#(MonoDevelop) -  70 milliseconds

Может делаю что то не так?



Автор: Temdegon 3.11.2009, 23:31
Вы тестируете непонятно что. Так можно тестировать какой-нить компилятор паскаля 1985 года или интерпретатор Basic для ПК Ратон, но не языки с динамической компиляцией.
Ваш метод factorial замениться вычисленным в первой итерации значением либо на этапе компиляции, либо уже в процессе выполнения. Когда конкретно это произойдет - зависит от используемого компилятора и виртуальной машины. Теоретически, серверная JVM 1.6 сначала выбросит функцию, т.к. она реально не нужна,  потом и сам цикл признает бесполезным =). Но на какой итерации это произойдет - я не знаю. Так же я не уверен, что клиентская jvm будет это делать.
В общем, читайте  очень познавательную статью на эту тему.
http://www.ibm.com/developerworks/ru/library/j-jtp12214/index.html

Автор: LamerTM 17.11.2009, 13:43
Осилил всю тему. smile 



Тест с факториалом на C++ у меня проходит за 0 ms (на VS2005). Похоже оптимизатор что-то там мудрит.

Поэтому изменил тест следующим образом:

C++:
Код

int FactorialI(int a)
{
    if (a == 1) return 1; else return a * FactorialI(a - 1);
}

double FactorialD(double a)
{
    if (a == 1) return 1; else return a * FactorialD(a - 1);
}


int _tmain(int argc, _TCHAR* argv[])
{
    int st = GetTickCount();
    double f = 1;
    int N = 100000000;
    int t = 5;
    for (int i = 0; i < N; i++)
    {
        if (t == 5) t = 4; else t = 5;
        f += FactorialI(t);
        if (f > 1000000) f = 1;
    }
    st = GetTickCount() - st;
            

    std::cout << "Result=" << f << "\n";
    std::cout << "Time=" << st;
    std::cin >> st;
    return 0;
}


C#:
Код

        public static double FactorialD(double a)
        {
            if (a == 1) return 1; else return a * FactorialD(a - 1);
        }

        public static int FactorialI(int a)
        {
            if (a == 1) return 1; else return a * FactorialI(a - 1);
        }

        private void button22_Click(object sender, EventArgs e)
        {
            int st = Environment.TickCount;
            double f = 1;
            int N = 100000000;
            int t = 5;
            for (int i = 0; i < N; i++)
            {
                if (t == 5) t = 4; else t = 5;
                f += FactorialI(t);
                if (f > 1000000) f = 1;
            }
            st = Environment.TickCount - st;
            richTextBox1.AppendText("Result=" + f.ToString() + " Time=" + st.ToString() + "\n");
        }


Delphi:
Код

function TForm1.FactorialI(a: Integer): Integer;
begin
         if a = 1 then
         begin
           Result := 1;
           Exit;
         end else
         begin
           Result := a * FactorialI(a - 1);
         end;
end;

function TForm1.FactorialD(a: Double): Double;
begin
         if a = 1 then
         begin
           Result := 1;
           Exit;
         end else
         begin
           Result := a * FactorialD(a - 1);
         end;
end;

procedure TForm1.Button16Click(Sender: TObject);
var       st: Cardinal;
          i, N, t: Integer;
          f: Double;
begin
          st := GetTickCount;
          N := 100000000;
          t := 5;
          for i := 0 to N - 1 do
          begin
            if t = 5 then t := 4 else t := 5;
            f := f + FactorialI(t);
            if f > 1000000 then f := 1;
          end;

          st := GetTickCount - st;
          Memo1.Lines.Add('Result='+IntToStr(Trunc(f))+' Time='+IntToStr(st));
end;


Вместо вызова функции FactorialI в теле цикла можно подставить вызов FactorialD (результаты будут разными).


Для FactorialI: 

C++: 2390 ms
C#: 2453 ms
Delphi7: 4156 ms



Для FactorialD:

C++: 4828 ms
C#: 5453 ms
Delphi7: 11156 ms


Java у меня нет.

Автор: Bozo 13.3.2011, 15:18
Цитата
Вот шикарный тест из LZMA SDK и Java и C# и оптимизтрованный C++ и Delphi:

Код
E5620
~~~~~~~~~~~~~~~~~
C++       3979 KB/s    4685 MIPS      37032 KB/s    3733 MIPS
Java 1.7 -server
          2716 KB/s    3198 MIPS      33601 KB/s    3301 MIPS
C#        2523 KB/s    2971 MIPS      26699 KB/s    2691 MIPS
Java 1.7  2388 KB/s    2813 MIPS      22972 KB/s    2257 MIPS
Delphi10F 2283 KB/s    2688 MIPS      22443 KB/s    2205 MIPS
Delphi7   2195 KB/s    2585 MIPS      20844 KB/s    2048 MIPS

Автор: Karadul 26.3.2012, 18:19
http://habrahabr.ru/post/136210/
Надеюсь, не  [:|||:]

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