LINUX.ORG.RU
ФорумTalks

Братцы! А я Java то оказывается тормоз! :0


0

0

Решил проверить производительность популярных виртуальных машин. Тестировал Microsoft .Net, Mono и Java. Дал им банальнейшую задачу, в которой написал как можно более низкоуровневый код, дабы измерить чистую убыль производительности. Программа сто миллионов раз резервирует память для матрицы 3x3, заполняет ее случайными числами и считает определитель. Вот код на Java (на C# почти тоже самое):

import java.util.Random;

class test
{
public static void main(String [] args)
{
int a[][];
int k,m,j,det;
Random random = new Random();
for(j = 0; j<100000000; j++)
{
a = new int[3][3];
for(k=0; k<3; k++) for(m=0; m<3; m++) {a[k][m] = random.nextInt();}
det = a[0][0]*a[1][1]*a[2][2]+a[0][1]*a[1][2]*a[2][0]+a[0][2]*a[1][0]*a[2][1]*-
a[0][2]*a[1][1]*a[2][0]-a[0][1]*a[1][0]*a[2][2]-a[0][0]*a[1][2]*a[2][1];
}
}
}

Аналогичный код на СИ (выполнялся минуту):

#include <stdlib.h>

int main()
{
int* a;
int k,m,j,det;
for(j = 0; j<100000000; j++)
{
a = (int*) malloc(9*sizeof(int));
for(k=0; k<3; k++) for(m=0; m<3; m++) {*(a+3*k+m) = rand();}
det = (*(a+3*0+0))*(*(a+3*1+1))*(*(a+3*2+2))+(*(a+3*0+1))*(*(a+3*1+2))*(*(a+3*2+0))+(* (a+3*0+2))*(*(a+3*1+0))*(*(a+3*2+1))*-
(*(a+3*0+2))*(*(a+3*1+1))*(*(a+3*2+0))-(*(a+0+3*1))*(*(a+3*1+0))*(*(a+3*2+2))-(* (a+3*0+0))*(*(a+3*1+2))*(*(a+3*2+1));
free(a);
}
return 0;
}

(просьба не бить меня за то, как я работаю с двумерными массивами на Си ;) )

Результаты печальны: первое место.... Microsoft! Всего в полтора раза медленне Си (одна минута, тридцать секунд). Далее жаба - две минуты. И инвалид Mono - 2 мин 45 с. Запуск Явы в с ключем -server не помог. Не хорошо как-то. Может это просто MS жульничает? Все-таки тесная интеграция с ОС... Незнаю... :( Попробуйте кто-нибудь у себя, мож другие цифры будут.

★★

Ща набегут жабофилы, сначала обосрут тебя с ног до головы, а потом наперебой будут предлагать костыли для жабы, чтоб прыг^Wсчитала быстрее :)

Skeptik
()

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

Не учитывай время старта и прогрева JIT-а - прогони тест вхолостую один круг, потом уже измеряй время работы ТОЛЬКО теста.

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

Вообще-то, надо в программу добавить печать времени до начала цикла и после завершения оного. Чтобы выкинуть время на запуск и останов.

svu ★★★★★
()

Кстати, а если делать чистые вычисления, без выделения/освобождения памяти каждый раз?

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

>Хреново время измеряешь - жаба и моно долго стартуют, а framework держит уже закэшированный загруженный рантайм в памяти.

>Не учитывай время старта и прогрева JIT-а - прогони тест вхолостую один круг, потом уже измеряй время работы ТОЛЬКО теста.

Я именно так и делал: ВСЕ старты горячие + я делал вывод фразы "Started" на консоль.

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

А вообще подыми маллок выше цикла и фри убери за цикл - будет еще меньше. У жабки GC не будет чистить память.

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

Да, и делать new/malloc в таком цикле - это сразу убивать всю статистику. Вы фактически тестируете работу garbage collector в жабе. Создайте массив снаружи цикла.

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

>А вообще подыми маллок выше цикла и фри убери за цикл - будет еще меньше. У жабки GC не будет чистить память.

На Си дало 35 секунд.

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

> Вообще-то, надо в программу добавить печать времени до начала цикла и после завершения оного. Чтобы выкинуть время на запуск и останов.

Кстати, да. В C:

clock_t start,end;

start=clock();
...
end=clock();
printf("Time, sec: %f\n",(clock()-start)/(double)CLOCKS_PER_SEC);

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

"(clock()-start)" заменить на "(end-start)" или вообще убрать end за ненадобностью.

Skeptik
()

Млин, ну сколько можно проводить синтетические тесты на производительность??? Ничерта они не дают нормальной картины. Реальная производительность платформы меряется не столько числодробилкой (которой в большинстве современных задач ~1%), сколько скоростью операций ввода/вывода, скростью работы коллекций, скоростью слоя для работы с субд итд. Плюс прибавим сюда производительность фреймворка(ов) используемых при создании приложения. Плюс, в случае серверного приложения, для нормальной картины надо оставить его на достаточно длительное время поработать под нагрузкой, дабы jit мог "разогнаться". И вот тогда уже сравнивать производительность. А в представленном виде это типичное пиписькомерятельство.

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

> Вы фактически тестируете работу garbage collector в жабе.

А как же эро^Wэвристическй анализ неиспользуемых объектов ? Шварц же просил не выёживаться с памятью типа лучше чем мы аллокаторов не придумаете ?

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

Принципиальную разницу между "наш аллокатор самый эффективный аллокатор" и "лучше память вообще выделять всего один раз" примерно представляете?;)

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

> и "лучше память вообще выделять всего один раз" примерно представляете?;)

Я то да, но я честно пытаюсь встать на место жабофила. Шварц сказал - я типа и не дергаюсь.

iBliss
()

А что .NET платформа стала теперь виртуальной машиной? Я что-то пропустил?

И кстати чего ты хотел доказать сравнив рассчетный код на джаве и си? Что си быстрее? Как думаешь тут есть люди которые с этим не согласятся?

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

> Я то да, но я честно пытаюсь встать на место жабофила.

Я как жабофил Вам авторитетно заявляю - Вы честно пытаетесь встать на место какого-то жабоимбецила;)

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

>В смысле индуса ?

Тогда тебе еще придется бейсик и шарп выучить.Для полного вхождения в роль так сказать :)

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

>> Вы честно пытаетесь встать на место какого-то жабоимбецила;)

> В смысле индуса ?

Что ж сегодня Вас на нацпол-то так тянет? На вкус и цвет индусы разные бывают.

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

> Что ж сегодня Вас на нацпол-то так тянет? На вкус и цвет индусы разные бывают.

Говорят, нег^Wафроафриканцы всё же вкуснее :)

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

>> Что ж сегодня Вас на нацпол-то так тянет? На вкус и цвет индусы разные бывают.

> Говорят, нег^Wафроафриканцы всё же вкуснее :)

Вы индусов готовить не умеете.

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

>Да, и делать new/malloc в таком цикле - это сразу убивать всю статистику. Вы фактически тестируете работу garbage collector в жабе. Создайте массив снаружи цикла.

Все. Вынес все операции с памятью из циклов. ИТОГ:

1) Си - 35с 2) .Net = Java = 44 c 3) Mono - 1 мин 54 с

Заметьте, теперь жаба с MS.Net сравнялись. У .Net лучше garbage collector?

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

>У .Net лучше garbage collector?

А чего ты ожидал? .NET работает на одной платформе, джава на многих. Уж одну-то платформу оптимизировать кардинально проще.

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

Это уже ближе к телу.

Хотя правильно тут выше сказали - сугубо искусственный тест, не дающий никакого представления о реальных задачах.

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

> Что ж сегодня Вас на нацпол-то так тянет?

Боже упаси я имел ввиду тадж..[упс] морд....[тоже не то]. Нууу вобщем в переносном смысле. Этнических индусов обижать не хотел.

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

> Заметьте, теперь жаба с MS.Net сравнялись. У .Net лучше garbage collector?

Неа, просто жаба и все остальные сосут, а Си - рулит. Очевидно, пора сие делать аксиомой и заносить в ЛОР-фак.

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

> Вы индусов готовить не умеете.

Да рецепт их приготовления Sun так и не открыл... а если и откроет то предварительно все запатентует... и прийдется всему миру чалится на простых безработных рэпперах и драгдилерах...

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

>И кстати чего ты хотел доказать сравнив рассчетный код на джаве и си? Что си быстрее? Как думаешь тут есть люди которые с этим не согласятся?

Си здесь выступает как абсолютная единица измерения производительности VM.

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

>Си здесь выступает как абсолютная единица измерения производительности VM.

В попугаях короче :)

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

> Неа, просто жаба и все остальные сосут, а Си - рулит

Пляшем-камлаем, функциональщиков вызываем?

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

> Пляшем-камлаем, функциональщиков вызываем?

/me бьет себя по голове "как мы могли забыть ...."

ЛИИИИИИСПЕЕЕЕЕРЫЫЫЫЫ

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

>Исходники .net содраны с исходников жабы (благо у MS они давно есть)?

.net (как платформа) мало похожа на жабу. с# похож синтаксисом языка да garbage-коллектором.

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

А чего нас вызывать, мы и так знаем, что tagged unions эффективнее всего прочего, вместе взятого, так что меряться эффективностью memory management с маленькими и слабыми (java, .net) мы не станем, это не спортивно.

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

>Запостите кому не лень опрос про жабу аналогично тому, что сейчас про Mono.

А зачем? Напишите скрипт, который заменит "mono" на "жаба". Результаты-то будут одинаковыми

anonymous
()

CL-USER> (defun test(i)
           (cond ((>= i 100000000) nil)
                 (t (progn (setq a (fill-random (make-matrix))) (det a) (test (+ i 1))))))

CL-USER> (time (test 0))
Evaluation took:
  856.972 seconds of real time
  685.32684 seconds of user run time
  41.234577 seconds of system run time
  0 page faults and
  18,400,069,280 bytes consed.


:)

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

> Рубим и жжём, лисперов ждём ;)

Гарик, ты не внимательно читаешь комменты. В последнем мини-флейме про Лисп было показано, что он не является функциональным языком, а есть императивный. Поэтому лисперы не придут :)

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

> Гарик, ты не внимательно читаешь комменты. В последнем мини-флейме про Лисп было показано, что он не является функциональным языком, а есть императивный. Поэтому лисперы не придут :)

Ну так чего теперь, опять нажраться и в бордель "Девочки фюрера" пойти с горя?

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

>Это заведение существует ? Это то о чем я думаю ?

Нет,это всего лишь название одной порнушки 80х. И это не то о чем ты сейчас думаешь )

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

> И это не то о чем ты сейчас думаешь )

Блин а я уж думал реально погудеть где нить в антураже Мэрлиновского m'obscene... Но вот вставляют меня девки в кителях на босу ногу...

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

>Блин а я уж думал реально погудеть где нить в антураже Мэрлиновского m'obscene... Но вот вставляют меня девки в кителях на босу ногу...

Дык вызови да китель из военного музея на каждую натяни. Щас же за деньги даже в мавзолее с ильичом загудеть можно.Причем он еще и тосты поднимать будет )

signal
()

Братцы! А оказывается, xTERM не умеет мерять время выполнения теста без учета запуска виртуальной машины!

А что, если переписать тест, не выделяя память сто миллионов миллиардов раз? Может быть, стоит напрячь ум и понять, что можно сто миллионов раз инициализировать один и тот же массив? И вменяемые программисты, такие как Пол Грэм, так и делают, поэтому они и зарабатывают по $20M за один сайт а не сочиняют заведомо неправильные тесты?

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

> Это заведение существует ? Это то о чем я думаю ?

Реальная контора, располагается то ли в Буэнос-Айресе, то ли в Рио (зело много мы тогда объездили за какие-то пару месяцев). А совпадение с фильмецом, что товарищ выше помянул - только в тему.

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