LINUX.ORG.RU

Почему Java — это не круто


0

0

По мотивам статьи Пола Грэхема "Крутые Хакеры" (http://www.paulgraham.com/gh.html)

Сачин Хеджип выделил основные причины неприязни которую настоящие хакеры испытывают к java. Вот они:
- никаких сюрпризов и хитрых фич в языке
- традиционно считается java тормозит
- большинство swing-приложений ужасно выглядят
- строгая типизация это занудно
- сложно изобрести велосипед (все есть в стандартной библиотеке)
- java популярна, а это не круто
- на java нельзя писать драйверы и другие крутые штуки

Стоит отметить, что крутизна технологии никак не связана с ее практическим применением.

>>> Why People Think Java Un-Cool

★★★

Проверено: ivlad ()
Ответ на: комментарий от vada

Слушай, а тебе, что влом вычитать : stop - start. Что еще и калькулятор под рукой держишь ?

/* Вот вариант с засечкой времени по 3 этапам */

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

int SZ;

int Cmp(const void *p1, const void *p2)
{
  register int i1 = *(int *)p1, i2 = *(int *)p2;

  if(i1 > i2)
    return 1;

  if(i1 < i2)
    return -1;

  return 0;
}

int main(int argc, char *argv[])
{
  int     i;
  int    *a, *rc;
  time_t  tmbgn;

  if(argc < 2)
  {
    printf("Usage : tst <array_sz>\n");
    return 1;
  }

  SZ = atoi(argv[1]);
  if(SZ < 0 || SZ > 100000000)
  {
    printf("BAD SIZE!\n");
    return 1;
  }

  tmbgn = time(NULL);

  printf("SIZE = %d\n", SZ);

  if((a = malloc(sizeof(int) * SZ)) == NULL)
  {
    printf("Out mem!\n");
    return 1;
  }

  for(i = 0; i < SZ; i++)
  {
    a[i] = rand();
  }

  printf("fill array : %lu (sec)\n", time(NULL) - tmbgn);

  tmbgn = time(NULL);
  qsort(a, SZ, sizeof(int), Cmp);
  printf("sort time : %lu (sec)\n", time(NULL) - tmbgn);

  tmbgn = time(NULL);

  for(i = 0; i < SZ; i++)
  {
    rc = bsearch(a + i, a, SZ, sizeof(int), Cmp);

    if(rc == NULL)
    {
      printf("Elem %d not found\n", a[i]);
      break;
    }
  }

  printf("search time : %lu (sec)\n", time(NULL) - tmbgn);

  free(a);
  return 0;
}

Vodkin
()
Ответ на: комментарий от Vodkin

>Она без проблем GCC компилится.

$ ./tst 1000
$ ./tst 10000
$ ./tst 100000
$ ./tst 1000000
$ ./tst 10000000

А кто время печатать будет? С секундомером сидеть? :)

Давай, приводи в порядок.

vada ★★★★★
()
Ответ на: комментарий от Vodkin

=============================
SIZE = 1000
fill array : 0 (sec)
sort time : 0 (sec)
search time : 0 (sec)
=============================
SIZE = 10000
fill array : 0 (sec)
sort time : 0 (sec)
search time : 0 (sec)
============================
SIZE = 100000
fill array : 0 (sec)
sort time : 0 (sec)
search time : 0 (sec)
============================
SIZE = 1000000
fill array : 0 (sec)
sort time : 1 (sec)
search time : 0 (sec)
============================
SIZE = 10000000
fill array : 1 (sec)
sort time : 10 (sec)
search time : 7 (sec)
============================

У меня

1. Fill array size of 10000000
    start : 1093535896395
    stop  : 1093535898494
    Итого :          2099 мсек (2 сек)
2. Sort array
    start : 1093535898496
    stop  : 1093535902901
    Итого :          4405      (4 сек)
3. Binary search
    start : 1093535902904
    stop  : 1093535905629
    Итого :          2725      (3 сек)


По последниму варианту 10000000 (остальные у тебя нули).

Общее время у тебя 18 сек, у мен 9 сек.

Вобщем, о чем я и говорил.

ЗЫ. Саныч! Ты выиграл! С тебя пиво! :)))

vada ★★★★★
()
Ответ на: комментарий от vada

Какой ты шустрый, однако. Я проверю у себя, завтра скажу результат. Но мы договорились 2 варианта проверить. Если все у тебя так быстро, то есть вероятность, что Java при сортировках скомпиленный код зовет. А тогда это не Java уже победила, а в стандартной библиотеке GCC функция сортировки хуже написана.

Vodkin
()
Ответ на: комментарий от vada

/* Сортировка - своя, поиск свой. То же, но на жабе плиз. */

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

#define flip(x, y) tmp = *(x); *(x) = *(y); *(y) = tmp

int SZ;

static void quick_sort(int *base, int num)
{
   register int num_smaller, tmp, *large, *small;

   if ( num < 3 ) 
   {
      if ( num == 2 ) 
      {
	 if ( base[0] > base[1] ) { flip(base, base + 1); }
      }
      return ;
   }

   large =  base + num - 1;
   small =  base + (num >> 1);

   if (*small > *large)
   {
     flip( small, large );
   }

   if(*small > *base)
   {
      flip(small, base);
   }
   else
      if (*base > *large)
      {
	flip( base, large );
      }

   if(num == 3)
   {
      flip(base, small);
      return ;
   }

   small =  base + 1; 

   while (small < large)
   {
      if ( *small < *base )
      {
	 small += 1;
	 continue;
      }

      do
      {
	 if (*base > *large) 
	 {
	    flip( small, large );
	    large -= 1;
	    small += 1;
	    break;
	 }
	 large -= 1;
      } while( small < large );
   }

   if (*small < *base) { flip(small,base); }
   num_smaller = small - base;

   quick_sort( small, num - num_smaller );
   quick_sort( base,        num_smaller );

   return;
}

int * bin_find(int *key, int *base, int nelem)
{
  int  *kmin, *probe;
  int i, j;

  kmin = base;

  while (nelem > 0)
  {
    i = nelem >> 1;
    probe = kmin + i;

    if (*key == *probe)
      return(probe);
    else if (*key < *probe)
      nelem = i;
    else  
    {
      kmin = probe + 1;
      nelem = nelem - i - 1;
    }
  }

  return NULL;
}

int main(int argc, char *argv[])
{
  int     i;
  int    *a, *rc;
  time_t  tmbgn;

  if(argc < 2)
  {
    printf("Usage : tst <array_sz>\n");
    return 1;
  }

  SZ = atoi(argv[1]);
  if(SZ < 0 || SZ > 100000000)
  {
    printf("BAD SIZE!\n");
    return 1;
  }

  tmbgn = time(NULL);

  printf("SIZE = %d\n", SZ);

  if((a = malloc(sizeof(int) * SZ)) == NULL)
  {
    printf("Out mem!\n");
    return 1;
  }

  for(i = 0; i < SZ; i++)
  {
    a[i] = rand();
  }

  printf("fill array : %lu (sec)\n", time(NULL) - tmbgn);

  tmbgn = time(NULL);
  quick_sort(a, SZ);
  printf("sort time : %lu (sec)\n", time(NULL) - tmbgn);

  tmbgn = time(NULL);

  for(i = 0; i < SZ; i++)
  {
    rc = bin_find(a + i, a, SZ);

    if(rc == NULL)
    {
      printf("Elem %d not found\n", a[i]);
      break;
    }
  }

  printf("search time : %lu (sec)\n", time(NULL) - tmbgn);

  free(a);
  return 0;
}

Vodkin
()
Ответ на: комментарий от Vodkin

Ха-ха! А на самом деле этот тест в натуре ни о чем не говорит. Совершенно бестолковый, хотя подверждает то, что ява вовсе не всегда медленней C.

Puzan ★★★★★
()

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

NiKel
()
Ответ на: комментарий от Vodkin

P.S. Intel сделал GCC в 2.5 раза на моей тачке (P4 256M.) в первом варианте программы с библиотечными qsort и bsearch.

Vodkin
()
Ответ на: комментарий от Puzan

>Ха-ха! А на самом деле этот тест в натуре ни о чем не говорит.
>Совершенно бестолковый, хотя подверждает то, что ява вовсе не всегда
>медленней C.

Я именно об этом все время и говорил. Те, кто, понезнанию, утверждают, что JAVA тормоз, на самом деле, просто не в теме. Нетормознее других.

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

vada ★★★★★
()
Ответ на: комментарий от Vodkin

>то есть вероятность, что Java при сортировках скомпиленный код зовет.

Неа. Все в байткоде. Класс Arrays можешь сам в сырцах глянуть.

Да. Я юзал j2sdk1.4.2 от SUN.

vada ★★★★★
()
Ответ на: комментарий от vada

Последнюю, мою программу запусти, пожалуйста. Она быстрее должна работать. И дело здесь не в Си как таковом, а в погано написанной функции qsort библиотеки glibc. Ее наверно студенты писали недоученные. Даже старый компилятор Watcom по скорости сортировки делает GCC более чем в 2 раза. Я думаю, что моя последняя программа, должна таки сделать жабу раза в 2 хотя бы. Вообще qsort может многократно вызываться некоторыми СУБД, и это будет узким местом в их производительности. Да, не забудь при компиляции врубить оптимизацию.

Vodkin
()
Ответ на: комментарий от vada

Ха-ха! Действительно, сортировка написана pure-java, т.е. без вызова нативного кода.

Puzan ★★★★★
()
Ответ на: комментарий от vada

>Я именно об этом все время и говорил. Те, кто, понезнанию, >утверждают, что JAVA тормоз, на самом деле, просто не в теме. >Нетормознее других.

То есть, ты хочешь сказать, что все перечисленные выше программы от IBM, HP работают быстро и память не жрут вовсе ? И не надо для жаба-программ тачку иметь с 1 гигом мозгов ? А я вот думаю, что прсто этот тест не выявил узких мест в реализации JVM.

Vodkin
()
Ответ на: комментарий от vada

Ну вот поправил я твой цикл, сижу жду, жду, 20 минут уже прошло, а результата никакого нет, что за фигня ?? Может у тебя ошибка какая-то с циклами ??

Vodkin
()
Ответ на: комментарий от Vodkin

Что за хрень, проц. загружен по полной, а все еще висимс. Слушай, у тебя точно все рабатало, массив действительно сортировался ??

Vodkin
()
Ответ на: комментарий от Vodkin

>    private static final int maxSize = 1000000;

>            // Test array size
>            if (sz <= 0 || sz > maxSize) {
>                System.out.println("BAD SIZE!");
>            System.exit (1);
>            }

Вот отрывок твоего кода, я плохо знаю яву, могу ошибаться. Вопрос : как при maxSize = 1 млн. ты сортировал массив размером 10 млн. ??

Vodkin
()
Ответ на: комментарий от vada

>ЗЫ. Саныч! Ты выиграл! С тебя пиво! :)))

Вадик, а я и не сомневался ниразу.

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

деньги сразу отдали.

Sun-ch
()
Ответ на: комментарий от Sun-ch

Чегой то тормозит твой Вадик. У меня его программа ни хрена вообще не работает. Пришлось кильнуть ее на фиг. А мою последнюю программу он так и не скомпилил и результаты не показал. Так, что еще не ясно, кто выиграл. Вот бы независимого эксперта найти, да где там, все в сговоре , на защуты жабы как один вышли :((

Ладно мне уходить пора. Сегодня командировка у меня. Буду только вечером.

Vodkin
()
Ответ на: комментарий от NiKel

>хоть асм прикрутить если скорость нужна.

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

Если хочешь можем пузомерку устроить.

ugoday ★★★★★
()
Ответ на: комментарий от Vodkin

>Вопрос : как при maxSize = 1 млн. ты сортировал массив размером 10 млн. ??

Очень просто. Ты попросил 10 лимонов, я в коде поправил.

Вот твом новые результатаы:
SIZE = 10000000
fill array : 1 (sec)
sort time : 4 (sec)
search time : 4 (sec)

Вот мои результаты (я сортировку не переписывал. лень)
1. Fill array size of 10000000
    start : 1093596619333
    stop  : 1093596621434
    total :          2101
2. Sort array
    start : 1093596621437
    stop  : 1093596625724
    total :          4287
3. Binary search
    start : 1093596625739
    stop  : 1093596628525
    total :          2786

Если сомниваешься, что у меня сортируется, то пжалуста:

1. Fill array size of 100
    start : 1093596887185
    stop  : 1093596887186
    total :          1
2. Sort array
    start : 1093596887189
    stop  : 1093596887192
    total :          3
a[0]=-2111599406
a[1]=-2069543405
a[2]=-2032038148
a[3]=-2031976050
a[4]=-2022986515
a[5]=-2007690959
a[6]=-1945460874
a[7]=-1937900332
a[8]=-1929162988
a[9]=-1866504218
a[10]=-1843837416
a[11]=-1820515551
a[12]=-1820442276
a[13]=-1812038488
a[14]=-1786896641
a[15]=-1779750641
a[16]=-1755335777
a[17]=-1754820398
a[18]=-1739430236
a[19]=-1715306654
a[20]=-1648565432
a[21]=-1629523293
a[22]=-1538196019
a[23]=-1528492485
a[24]=-1527356690
a[25]=-1506256877
a[26]=-1470917501
a[27]=-1468515384
a[28]=-1396733484
a[29]=-1342182883
a[30]=-1238156590
a[31]=-1179950846
a[32]=-1120321371
a[33]=-1101073774
a[34]=-1060389163
a[35]=-1058627450
a[36]=-1052916733
a[37]=-989769244
a[38]=-907573098
a[39]=-890407528
a[40]=-832207321
a[41]=-787175442
a[42]=-748042236
a[43]=-572708201
a[44]=-566204244
a[45]=-536484320
a[46]=-452399322
a[47]=-431718268
a[48]=-404544121
a[49]=-348108885
a[50]=-309701300
a[51]=-220409445
a[52]=-196868093
a[53]=-194012432
a[54]=-137406858
a[55]=-126115113
a[56]=-112576415
a[57]=-95668345
a[58]=-75573937
a[59]=1083895
a[60]=37402774
a[61]=81829755
a[62]=160059553
a[63]=164019117
a[64]=220521548
a[65]=237545053
a[66]=556751899
a[67]=565699794
a[68]=601068540
a[69]=660668956
a[70]=683669536
a[71]=746342829
a[72]=777396456
a[73]=871729834
a[74]=968283502
a[75]=984361632
a[76]=1040159412
a[77]=1107710579
a[78]=1153351491
a[79]=1154968958
a[80]=1158635576
a[81]=1196878357
a[82]=1354244228
a[83]=1384040837
a[84]=1387115327
a[85]=1544213703
a[86]=1574930135
a[87]=1618893473
a[88]=1645240543
a[89]=1707687838
a[90]=1754342706
a[91]=1754954330
a[92]=1773989962
a[93]=1806908838
a[94]=1827886854
a[95]=1844008423
a[96]=1844784250
a[97]=1892381188
a[98]=1926732568
a[99]=1969745353
3. Binary search
    start : 1093596887375
    stop  : 1093596887376
    total :          1

ЗЫ. Не пойму, что у тебя могло так круто зависнуть? :(( У меня все пашет, аж пищит.

vada ★★★★★
()
Ответ на: комментарий от Vodkin

>А мою последнюю программу он так и не скомпилил и результаты не показал. Так, что еще не ясно, кто выиграл.

У меня, типа, других дел хватает. Освободился, сделал. Твою прогу откомпилил. Может что не так сделал? С Си я не спец.

gcc -o tst_s tst_s.c
./tst_s 10000000

bla-bla-bla.


Что ты там такое намутил, что моя зависла???

/usr/java/j2sdk1.4.2/bin/javac Tst.java
/usr/java/j2sdk1.4.2/bin/java Tst 10000000

bla-bla-bla.


vada ★★★★★
()
Ответ на: комментарий от vada

Все действительно работает, только что проверил на другой тачке. Предыдущая загружена была сильно и программа в своп уходила, памяти было мало. Ладно, у меня вопросов нет больше. По времени ничья получилась, да и фиг с ним. Единственно, что для меня не ясно, так это то, что на более слабой тачке cel 1.2 моя последняя программа скомпиленная GCC 2.953, показала в результате 7 сек, у тебя на cel 1.7 - 9. Но это уже мелочи. В общем согласен, не проиграла жаба ни капли. Так, что считаю спор закрытым. :)

Vodkin
()
Ответ на: комментарий от Vodkin

>Может у тебя ошибка какая-то с циклами ??

Может и ошибка. Вот последний вариант.

===================================

import java.util.Arrays;
import java.util.Random;
import java.util.Date;

public class Tst
{
    private static final int maxSize = 10000000;

    public static void main (String argv [])
    {
		int sz;
    long start;
    long stop;

        if (argv.length < 1) {
            System.err.println ("Usage : tst <array_sz>");
            System.exit (1);
        }
				
		try {
            // Get array size
			sz = Integer.valueOf(argv[0]).intValue();

            // Test array size
            if (sz <= 0 || sz > maxSize) {
                System.out.println("BAD SIZE!");
	            System.exit (1);
            }

            // Initial randomize
            Random r = new Random();

            // Fill array
            int[] a = new int[sz];
            System.out.println("1. Fill array size of "+sz);
						start = new Date().getTime();
            System.out.println("    start : "+start);
            int i = 0;
            try {
	            for (i=0; i<sz; i++) {
       				a[i] = r.nextInt();
        	    }
            }
            catch (Exception e) {
                throw new Exception("Fill array error at i="+i+"\n"+e.getMessage());
            }
						stop = new Date().getTime();
            System.out.println("    stop  : "+stop);
            System.out.println("    total :          "+String.valueOf(stop-start));

            // Sort array
            System.out.println("2. Sort array");
						start = new Date().getTime();
            System.out.println("    start : "+start);
            Arrays.sort(a);
						stop = new Date().getTime();
            System.out.println("    stop  : "+stop);
            System.out.println("    total :          "+String.valueOf(stop-start));
//						for (int k=0; k<sz; k++) {
//							System.out.println("a["+k+"]="+a[k]);
//						}

            // Binary search elements
            System.out.println("3. Binary search");
						start = new Date().getTime();
            System.out.println("    start : "+start);
            int j;
            for (i=0; i<sz; i++) {
                j = Arrays.binarySearch(a, a[i]);
                if (j < 0) System.out.println("Element "+a[i]+" i= "+i+" j= "+j+" not found!");
            }
						stop = new Date().getTime();
            System.out.println("    stop  : "+stop);
            System.out.println("    total :          "+String.valueOf(stop-start));
		}
		catch (Exception e) {
           throw new NumberFormatException(e.getMessage());
		}
	}

}

===========================================================

Наслаждайся.

ЗЫ. Уские места java я знаю. А алгоритм теста ты предложил. :) Такчто звиняйте если что не так.

vada ★★★★★
()
Ответ на: комментарий от Vodkin

>P.S. Но все же ты несколько себе подыграл. Оптимизацию при компиляции, так и не включил. :))

Это неспециально. Не в курсах я про особености GCC. Дальше
./configure
make
make install
мои познания не идут :)

vada ★★★★★
()
Ответ на: комментарий от vada

Вот, что интересно, свои, на скорую руку написанные функции сортировки и поиска, ускорили выполнение программы ровно в 2 раза. Все же кто пишет эту чертову glibc. Неуже ли нельзя было за такой срок написать нормальные функции сортировки и поиска. Проигрывать другим компилерам в 2 - 2.5 раза просто ПОЗОР !!

Vodkin
()
Ответ на: комментарий от Vodkin

Это действительно смущает. :((( Может патчик им заслсть?

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

vada ★★★★★
()
Ответ на: комментарий от Vodkin

> Все же кто пишет эту чертову glibc.

Ульрих её пишет. А ты попргобуй dietlibc от Феликса:
http://www.fefe.de/dietlibc/
Много времени не займёт её установить: make; make install, а дальше
собирай свою программу так: diet gcc <остальные аргументы>
Скорость должна повыситься минимум в 3 раза.

annonymous1
()
Ответ на: комментарий от vada

>Я именно об этом все время и говорил. Те, кто, понезнанию, утверждают, что JAVA тормоз, на самом деле, просто не в теме. Нетормознее других.

На самом деле вы сами не понимаете, что меряете. Понятно, что такой код jit-компилируется без труда. Чтобы понять преимущество C++ создайте вектор комплексных чисел, где каждый элемент - это объект типа Complex. Понятно, что все методы в C++ должны быть сделаны встраиваемыми (inline). Или вообще вектор элементов произвольного типа. Вот это и сравнивайте. Если и тут java будет не медленнее - тогда да, я поверю в то, что Java выигрывает здесь у C++

Dmt
()
Ответ на: комментарий от ugoday

Насчет gcc не знаю, но он явно не единственный компилятор C++ в мире. Вообще я к тому, что на C++ можно нормально пользоваться инкапсуляцией без ущерба по скорости - грубо говоря, нормально создавать абстрактные типы данных и оперировать ими. У меня (VC++ 6) разница в скорости между Debug (без оптимизации и инлайнов) и Release версиями за счет инкапсуляции и инлайнга может быть до десяти раз.

Dmt
()
Ответ на: комментарий от Vodkin


>P.S. Но все же ты несколько себе подыграл. Оптимизацию при компиляции, так и не включил. :))

>gcc -O -o tst_s tst_s.

SIZE = 10000000
fill array : 1 (sec)
sort time : 3 (sec)
search time : 2 (sec)

vada ★★★★★
()
Ответ на: комментарий от Dmt

Давайте для сравнения такой код на Jave напишите

#include <vector>
#include <time.h>

template<class T> class Complex
{
public:
Complex() {}
Complex(const Complex<T>& Other): Rl(Other.Rl), Im(Other.Im) {}
Complex(const T& rl, const T& im): Rl(rl), Im(im) {}
Complex& operator += (const Complex<T>& Other)
{ Rl += Other.Rl; Im += Other.Im; return *this; }
protected:
T Rl, Im;
};

int main(int argc, char* argv[])
{
time_t t0 = time(&t0);

size_t Count = 10000000, Index;
std::vector< Complex<double> > points;
points.reserve(Count);
for( Index = 0; Index < Count; Index++ )
points.push_back(Complex<double>((double)(Index % 100),
(double)(Index % 1000)));

time_t t1 = time(&t1);
Complex<double> Sum(0.0, 0.0);
for( Index = 0; Index < Count; Index++ )
Sum += points[Index];

time_t t2 = time(&t2);
printf("init: %d, calc: %d\n", t1 - t0, t2 - t1);
return 0;
}

Без отимизации и инлайнинга такой код выполнялся (VC6, PIII/Celeron ~800-1000 512M - не знаю точно) выполнялся 16/4 сек., с оптимизацией и инлайнингом - 2/0 сек. Интересно было бы на Jave посмотреть.

Dmt
()
Ответ на: комментарий от Dmt

> Без отимизации и инлайнинга такой код выполнялся (VC6, PIII/Celeron
> ~800-1000 512M - не знаю точно) выполнялся 16/4 сек., с  
> оптимизацией и инлайнингом - 2/0 сек. Интересно было бы на Jave посмотреть. 

Ну вобщем понятно что в такой формулировке решение на Java будет проигровать по определению.

Привожу более нейтральный тест:

#include <stddef.h>
#include <sys/time.h> 

#include <vector> 

const int count = 10000000;

class Figure {
public:
	virtual double getArea() = 0;
};

class Rectangle : public Figure {
public:
	Rectangle(double h, double w) : h(h), w(w) {}
	double getArea();

private:
	double h;
	double w;	
};

double Rectangle::getArea() {
	return h * w;
}

class Triangle : public Figure {
public:
	Triangle(double a, double b) : a(a), b(b) {}
	double getArea();

private:
	double a;
	double b;
};

double Triangle::getArea() {
	return 0.5 * a * b;
}

unsigned int milisec(const timeval& x, const timeval& y) {
	return (1000000 * (y.tv_sec - x.tv_sec) + (y.tv_usec - x.tv_usec)) / 1000;
}

int main(int argc, char* argv[]) 
{ 
	timeval t0;
	gettimeofday(&t0, NULL); 
 
	std::vector<Figure *> figures; 
	figures.reserve(count); 
	for(int i = 0; i < count; ++i) {
		figures.push_back(i % 3 == 0 ? (Figure *) new Rectangle(i % 100, i % 99)
			: (Figure *) new Triangle(i % 100, i % 99)); 
	}
 
	timeval t1;
	gettimeofday(&t1, NULL);

	double s = 0.0;
	for (int n = 0; n < 100; ++n) {
		for(int i = 0; i < count; ++i) {
			s += figures[i]->getArea();
		}
	}

	timeval t2;
	gettimeofday(&t2, NULL);
 
	printf("summa: %f\n", s);	
	printf("init: %d, calc: %d\n", milisec(t0, t1), milisec(t1, t2));
 
	return 0; 
}
java:

public class Test {
	private final static int count = 10000000;

	interface Figure {
		double getArea();
	}

	static class Rectangle implements Figure {
		public Rectangle(double h, double w) {
			this.h = h;
			this.w = w;
		}

		public double getArea() {
			return h * w;
		}
	
		private double h;
		private double w;
	}

	static class Triangle implements Figure {
		public Triangle(double a, double b) {
			this.a = a;
			this.b = b;
		}

		public double getArea() {
			return 0.5 * a * b;
		}
	
		private double a;
		private double b;
	}

	public static void main(String[] args) {
		long time0 = System.currentTimeMillis();

		Figure[] figures = new Figure[count];
		for(int i = 0; i < count; ++i) {
			figures[i] = (i % 3 == 0 ? (Figure) new Rectangle(i % 100, i % 99)
				: (Figure) new Triangle(i % 100, i % 99));
		}

		long time1 = System.currentTimeMillis();

		double s = 0.0;
		for (int n = 0; n < 100; ++n) {
			for(int i = 0; i < count; ++i) {
				s += figures[i].getArea();
			}
		}

		long time2 = System.currentTimeMillis();

		System.out.print("summa: ");
		System.out.println(s);

		System.out.print("init: ");		
		System.out.print(time1 - time0);

		System.out.print(", calc: ");		
		System.out.println(time2 - time1);
	}
}

bash-2.05b$ /opt/ibm-jdk-bin-1.4.2/bin/java -version
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2)
Classic VM (build 1.4.2, J2RE 1.4.2 IBM build cxia321420-20040626 (JIT enabled: jitc))
bash-2.05b$ gcc -v
Reading specs from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/specs
Configured with: /var/tmp/portage/gcc-3.3.2-r5/work/gcc-3.3.2/configure --prefix=/usr --bindir=/usr/i686-pc-linux-gnu/gcc-bin/3.3 --includedir=/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include --datadir=/usr/share/gcc-data/i686-pc-linux-gnu/3.3 --mandir=/usr/share/gcc-data/i686-pc-linux-gnu/3.3/man --infodir=/usr/share/gcc-data/i686-pc-linux-gnu/3.3/info --enable-shared --host=i686-pc-linux-gnu --target=i686-pc-linux-gnu --with-system-zlib --enable-languages=c,c++,f77,objc --enable-threads=posix --enable-long-long --disable-checking --enable-cstdio=stdio --enable-clocale=generic --enable-__cxa_atexit --enable-version-specific-runtime-libs --with-gxx-include-dir=/usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.2/include/g++-v3 --with-local-prefix=/usr/local --enable-shared --enable-nls --without-included-gettext --disable-multilib
Thread model: posix
gcc version 3.3.2 20031218 (Gentoo Linux 3.3.2-r5, propolice-3.3-7)


bash-2.05b$ /opt/ibm-jdk-bin-1.4.2/bin/java -Xms512m -Xmx512m Test
summa: 1.6087864848E12
init: 828, calc: 18038

bash-2.05b$ g++ -O3 -march=athlon-xp Test.cxx
bash-2.05b$ ./a.out
summa: 1608786484800.000000
init: 1448, calc: 21803

Выводы делайте сами ;-)

ed ★★
()
Ответ на: комментарий от vilfred

2 vilfred:

> привет всем из солнечного Крыма, город Феодосия, вода в море +25

Феодосия ацтой :) Отдыхающие "друг у друга на головах" и ваще толпа и отсутсвие комфорта. В Гаграх круче :)

Dimentiy ★★
()
Ответ на: комментарий от ed

>Ну вобщем понятно что в такой формулировке решение на Java будет проигровать по определению.
>Привожу более нейтральный тест:

Конечно, если писать на C++ как на Java, то разницы не будет. Мне все-таки кажется, что использовать в расчетных задачах virtual и new - несколько нетипично, а вот инлайнинг и абстрактные типы данных - самое то. В общем Ваш тест вообще ничего не показывает, либо показывает именно то, что Вы бы хотели увидеть :)

Dmt
()
Ответ на: комментарий от Dmt

> Конечно, если писать на C++ как на Java, то разницы не будет. 

Не согласнен, virtual - это "основной инструмент абстракции" используемый в подавляющем большенстве программ (что на C++, что на Java, что на C#) имеющих хоть какую нибудь архитектурную сложность. Что значит писать на C++ как на Java, в контексте virtual ? Что Вы предлагаете для C++ ? Заменить на switch/case ;-) Думаете производительность и архитектура программы от этого будут лучше ? Иммено по этому я выбрал virtual для теста, так как тест с ним примерно одинаков для c++ и java, а эффективой замены не существует.

> Мне все-таки кажется, что использовать в расчетных задачах virtual и new -
> несколько нетипично, а вот инлайнинг и абстрактные типы данных - самое то. 

Согласен, но расчетные задачи это скорее фортран + intel MKL, чем С++, по известным причинам, а по поводу расчетных задач и java можете посмотреть это:
http://www.vinci.org/rlv/d/javaperf/docs/lewis/javaCbenchmark.html.

> В общем Ваш тест вообще ничего не показывает, либо показывает именно то, что
> Вы бы хотели увидеть :)

Я увидел что других серьезных причин кроме пямяти (через лет пять тоже будет не критично) писать на C/С++ нет. Я не говорю что java лучшая платформа для всего и не призываю писать только на ней, мне просто не нравится предвзятое отношение к ней. Хочу заметить что современная java, это:
	1) Быстрейший allocator и GC (кто там говорил про большие обьемы и базы данных, посмотрите на Cloudscape)
	2) Run-time оптимизация недоступная обычному компилятору (см. тест выше ;-)).
	3) Огромный выбор open-source библиотек и модулей (в С++ тоже не мало (хотя существенно меньше), но автор каждой второй считает что для его проекта нужно реализовать собственную common библиотеку (string, collections, threads, file io), а про exceptions слышал только 1 из 10 (я имею в виду exception safe код)).
	4) Скорость разработки (следствие 3, плюс все однородно: платформа, внешние библиотеки)
	5) Стабильность (утечек памяти нет, все привыкли кидать exception, а не вызывать exit(-1) (конечно это клинический случай, но бывают) ;-))
	6) Безопасность (постоянно не боишся получить переполнение стыка)

Если кто думает что в ближайшем будущем java-у вытестнет dotNET c С#, то это вряд ли, дело не в фичах языка или платформы, а в сообществе  разработчиков которые выберают dotNET, в большенстве я бы не стал ждать от них хороших open-source библиотек (хотя несколько  имеются). Соответственно разработка всего что вылазит за границы стандартной библиотеки заведомо проигрывает java.

ed ★★
()
Ответ на: комментарий от ed

Вообще-то разговор шел как раз о расчетах, если Вы помните :)

Понимаете, я не противник явы. Я просто пытаюсь показать ее больное, с моей точки зрения, место, а именно отсутствие средств для создания небольших быстрых классов. Т.е. либо громоздкие наследники Object - "моделирующие предметную область", либо непонятно что. Но ведь в реальных сложных приложениях таких "моделирующих" объектов как правило значительно меньше, чем небольших вспомогательных. В итоге: невозможность создать свою инфраструктуру/архитектуру приложения, если это действительно нужно. В этом же заключается и плюс явы - фиксированная инфраструктура, заточенная под создание бизнес-приложений и, как следствие, большая стандартная библиотека и множество легко-интегрируемых сторонних. А как язык ява - не фонтан imho.
Поэтому же, мне кажется, так мало "коробочных" приложений уровня Photoshop или Office, написанных на яве - там разработчикам и так и так приходится вырабатывать свою инфраструктуру с нуля, а тут ява далеко не помошник.

Dmt
()
Ответ на: комментарий от ed

> bash-2.05b$ /opt/ibm-jdk-bin-1.4.2/bin/java -Xms512m -Xmx512m Test

-Xms512m ? Дык это ж допинг ;) Не по-олимпийски как-то.

$ uname -a
Linux earth 2.6.7 #1 Mon Aug 9 16:17:07 MSD 2004 i686 AMD Athlon(tm) XP 1500+ AuthenticAMD GNU/Linux

$ gcc -v
Reading specs from /usr/lib/gcc-lib/i686-pc-linux-gnu/3.3.4/specs
Configured with: (...)
Thread model: posix
gcc version 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)

$ /opt/ibm-jdk-bin-1.4.2/bin/java -version
java version "1.4.2"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.4.2)
Classic VM (build 1.4.2, J2RE 1.4.2 IBM build cxia321420-20040626 (JIT enabled: jitc))

$ ./test_cpp
summa: 1608786484800.000000
init: 997, calc: 34592

$ /opt/ibm-jdk-bin-1.4.2/bin/java -Xmx512m -Xms512m Test
summa: 1.6087864848E12
init: 2725, calc: 71202

Небольшой прикольчик: ;)
$ /opt/ibm-jdk-bin-1.4.2/bin/java -Xmx512m -Xms2m Test
summa: 1.6087864848E12
init: 8536, calc: 70826

Вот такой допинг применен для С++:
size_t memSize = sizeof(Rectangle) * count/3 + sizeof(Triangle) * (count - count / 3);
void* mem = reinterpret_cast<Rectangle *>(operator new(memSize));
Rectangle *rectMem = reinterpret_cast<Rectangle *>(mem);

for (int i = 0; i < count; i+=3) {
figures[i] = new (rectMem++) Rectangle(i % 100, i % 99);
}

Triangle *triMem = reinterpret_cast<Triangle *>(rectMem);
for (int i = 1; i < count; i+=3) {
figures[i] = new (triMem++) Triangle(i % 100, i % 99);
figures[i+1] = new (triMem++) Triangle(i % 100, i % 99);
}


Выводы делайте сами... ;)

dewd
()
Ответ на: комментарий от Sun-ch

>>Ява - тормозное гамно, элита не пишет на яве. А на чем пишет Элита? (VB ?):))

CrazyArt
()
Ответ на: комментарий от Sun-ch

>>Ява - тормозное гамно, элита не пишет на яве. А на чем пишет Элита? (VB ?):)) судя по таким смелым заявлениям ты, пацан, еше ни на чем толком писать не умеешь, поэтоме пофильтруйся, и набирайся опыта...

CrazyArt
()
Ответ на: комментарий от dewd

-Xms512m -Xmx512m - это нормально, т.к. применимо к любой java программе без ее изменения.

Попробуйте своим способом ускорить OpenOffice ;-), у него как раз тормоза при запуске по этому поводу.

А ваш допиг на C++, изменяет порядок объектов, хотя на результат в данной задаче это не влияет, но это уже попахивает дисквалификацией ;-)

34592 vs 71202
А куда же у нас делся virtual ? Кючики gcc и результат gcc -S слабо привести ?

ed ★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.