LINUX.ORG.RU

Техническая статья Sun «Делаем Java быстрее чем С, используя LRWP»

 , , , , ,


0

0

Начав с технического решения на основе веб-сервера Xitami, имеющего некоторые проблемы с Соларисом (Running a copy in each zone improved performance by more than 100% but still was not the solution to the scalability problem with Xitami), группа инженеров, используя Java и технологию LRWP, добилась производительности на 78% большей, чем у системы на основе Xitami. Xitami назван в статье одним из top10 веб-серверов (one of the top 10 web servers). По отчету Netcraft ( http://survey.netcraft.com/Reports/20... ), на момент написания статьи Xitami имел долю в 0.006% от доли веб-сервера Apache, если считать по количеству сайтов.

>>> Making Java Technology Faster Than C with LRWP

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

> Из вас хоть один программист есть? Или все нубы как в джаве, так и в Си? Я так посмотрю, грамотные специалисты обходят подобные топики стороной - и правильно делают! Учите мат. часть! Да и научиться программировать хотя бы Hello World на парочке-тройке языков не помешало бы.

Т.е. ты тоже нуб во всех языках, раз ты не обошел этот топик стороной??

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

>$ ./test3 >l = 451808768 >9670000 >$ java Test >l = 451808768 >6752328 >l = 451808768 >6724576

Забавно. У меня нет IBM-овской JDK, так бы сравнил. Я на Sun-овской 1.5.0_15 мерял.

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

Вот что выдаёт Mac OS X 10.5.3 Leopard

user@mac:~/1$ ./a.out 
l = 451808768
419
user@mac:~/1$ java -cp . -XX:CompileThreshold=10 -XX:+AggressiveOpts -server  Test
l = 451808768
10464915
l = 451808768
4515586

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

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

> Раличия в конфигурации компов в расчет не принимаются? :D

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

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

>java version "1.6.0_06"

Та же байда на 1.6.0_06 :) Попробуй test(); третий раз вставить. Или на 1.5 запустить. Я хз почему так, если честно.

Вот тебе результат с 1.6:

wfrag@fragentoo ~/1 $ /opt/sun-jdk-1.6.0.06/bin/java -cp . -XX:CompileThreshold=10 -server Test l = 451808768 15280000 l = 451808768 15980000 l = 451808768 5650000

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

$ ~/jdk1.6.0_10/bin/java Test
l = 451808768
11880000
l = 451808768
11840000

$ ~/jdk1.7.0/bin/java Test
l = 451808768
11880000
l = 451808768
11880000

$ ~/jrockit-R27.5.0-jdk1.6.0_03/bin/java Test
l = 451808768
44670000
l = 451808768
10110000

$ /usr/lib/j2sdk1.6-ibm/bin/java Test 
l = 451808768
6739590
l = 451808768
6733177


Честно говоря, сильно удивлен.

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

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

Я думаю, там компайлер тупо заранее все посчитал :) Сравниваться нечем. Вот если параметром вынести, думаю, другой результат будет.

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

Оно мне надо. Возьми, да проверь. Я просто с консоли закопипастил. Вот тебе версии:


wfrag@fragentoo ~/1 $ gcc -v
...skipped...
gcc version 4.1.2 (Gentoo 4.1.2 p1.0.2)


wfrag@fragentoo ~/1 $ java -version
java version "1.5.0_15"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_15-b04)
Java HotSpot(TM) Client VM (build 1.5.0_15-b04, mixed mode)

На 1.6 действительно, только с третьего раза быстро выходит.

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

> Причем тут это? Дядя сказал, что в два раза во второй проход дело происходит. Однако нет. Видимо сейчас над ним просто звезды более благоприятны.

Покажи сишный результат и джавовский вместе.

А маковод пусть покажет вывод java Test без дополнительных опций.

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

>Причем тут это? Дядя сказал, что в два раза во второй проход дело происходит. Однако нет. Видимо сейчас над ним просто звезды более благоприятны.

Примерно так. Это же зависит от параметра -XX:CompileThreshold, который я наобум выставил. Если его в 1 поставить, то по идее, оно быстро откомпилится, но только хер дождешься -- оно тогда все подряд начинает JIT-ить, что дико медленно.

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

> Я думаю, там компайлер тупо заранее все посчитал :) Сравниваться нечем. Вот если параметром вынести, думаю, другой результат будет.

Тут сравнивать есть что, так как Mac OS X хорошая система и Apple её нехило оптимизирует. Подобный тест это показывает даже на примитивном уровне. Подайте мне пример с вынесенным параметром и я его прогоню.

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

> Та же байда на 1.6.0_06 :) Попробуй test(); третий раз вставить. Или на 1.5 запустить. Я хз почему так, если честно.

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

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

~/tmp> ./a.out
l = 451808768
7280000

~/tmp> java -cp . -XX:CompileThreshold=10 -XX:+AggressiveOpts -server Test
l = 451808768
14450000
l = 451808768
3960000


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

> Ага, а следующая версия выйдет, будет требовать четвертого раза. Что за чушь вы несете, а? Почему бы с первого раза не работать как надо? Или вы думаете, что я буду программу по пять раз запускать, что бы на шестой она нормально заработала? Нет.

Эй, чудилка, результат test.c покажи.

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

>Врать не хорошо, однако.

Кстати, да.

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

>Ага, а следующая версия выйдет, будет требовать четвертого раза. Что за чушь вы несете, а?

Какую чушь? Этот ключик, что я привел, вообще из разряда внутренних ручек. Я его наугад покрутил и получил на 1.5 ускорение на втором запуске, на 1.6, видимо, семантика поменялась. На сервере вообще похер, там хоть с 1000-ого раза, при числе обращений в миллионы, 1000 обращений быстро пролетят.

>Почему бы с первого раза не работать как надо?

Время старта, однако. Хотят и скорость примелемую иметь, и время старта.

>Или вы думаете, что я буду программу по пять раз запускать, что бы на шестой она нормально заработала?

Вообще-то ты один раз ее запускаешь, если чё.

>Нет.

Попробуй, мне просто интересно.

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

>Врать не хорошо, однако.

Если я в чем и наврал, так это в способе замера. Чё-то он странное меряет, хотя советуют именно так :)

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

>Если я в чем и наврал, так это в способе замера. Чё-то он странное меряет, хотя советуют именно так :)

А, понял. Пока оно считает, на фоне второй тред усиленно всякий другой код JIT-ить. Потому общее время (замеренное через System.currentTimeMillis()) на второй запуск все равно 10 сек, но со следующими запусками уменьшается до ~6...

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

> А маковод пусть покажет вывод java Test без дополнительных опций.

Использованы стандартные настройки Mac OS X 10.5.3 Leopard.

user@mac:~/1$ gcc -v
Using built-in specs.
Target: i686-apple-darwin9
Configured with: /var/tmp/gcc/gcc-5465~16/src/configure --disable-checking -enable-werror --prefix=/usr --mandir=/share/man --enable-languages=c,objc,c++,obj-c++ --program-transform-name=/^[cg][^.-]*$/s/$/-4.0/ --with-gxx-include-dir=/include/c++/4.0.0 --with-slibdir=/usr/lib --build=i686-apple-darwin9 --with-arch=apple --with-tune=generic --host=i686-apple-darwin9 --target=i686-apple-darwin9
Thread model: posix
gcc version 4.0.1 (Apple Inc. build 5465)

user@mac:~/1$ gcc -O3 test.c

user@mac:~/1$ ./a.out 
l = 451808768
418

user@mac:~/1$ java -version
java version "1.5.0_13"
Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05-237)
Java HotSpot(TM) Client VM (build 1.5.0_13-119, mixed mode, sharing)

user@mac:~/1$ javac Test.java

user@mac:~/1$ java Test
l = 451808768
23073181
l = 451808768
23491329

user@mac:~/1$ java -cp . -XX:CompileThreshold=10 -XX:+AggressiveOpts -server  Test
l = 451808768
10467618
l = 451808768
4540491

user@mac:~/1$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/bin/java -version
java version "1.6.0_05"
Java(TM) SE Runtime Environment (build 1.6.0_05-b13-120)
Java HotSpot(TM) 64-Bit Server VM (build 1.6.0_05-b13-52, mixed mode)

user@mac:~/1$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/bin/javac Test.java

user@mac:~/1$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/bin/java Test
l = 451808768
8864182
l = 451808768
10447265

user@mac:~/1$ /System/Library/Frameworks/JavaVM.framework/Versions/1.6.0/Home/bin/java -cp . -XX:CompileThreshold=10 -XX:+AggressiveOpts -server Test
l = 451808768
10611850
l = 451808768
10452375

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

> Какую чушь? Этот ключик, что я привел, вообще из разряда внутренних ручек. Я его наугад покрутил и получил на 1.5 ускорение на втором запуске, на 1.6, видимо, семантика поменялась. На сервере вообще похер, там хоть с 1000-ого раза, при числе обращений в миллионы, 1000 обращений быстро пролетят.

Т.е. Вы признаете, что место Java там же, где и PHP - сервер, веб. Для десктопа не годиться ну ни как. Тогда вопросов больше не имею.

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

>Т.е. Вы признаете, что место Java там же, где и PHP - сервер, веб. Для десктопа не годиться ну ни как. Тогда вопросов больше не имею.

Да, признаю, но с оговорками. Eclipse-ом я вполне доволен. :)

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

user@mac:~/1$ gcc -O3 test.c

user@mac:~/1$ ./a.out
l = 451808768
418

user@mac:~/1$ javac Test.java

user@mac:~/1$ java Test
l = 451808768
23073181
l = 451808768
23491329


Итого Java тормозит в 55198. В принципе, по ощущением от виденных мной приложений так и есть. Думаю разговор можно закончить.

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

Писькомерка с параметрами:

wfrag@fragentoo ~/1 $ cat test.c 
#include <stdio.h>

int main(int argc, char** argv) {
    int count1 = atoi(argv[1]);
    int count2 = atoi(argv[2]);
    long c = clock();
    int l = 0, i, j;
    for( j = 0; j < count1; ++j ) {
        for( i = 0; i < count2; ++i ) {
            l += i;
        }
    }
    long end = clock(); 
    printf( "l = %d\n", l );
    printf("%ld\n", end - c);
    return 0;
}

wfrag@fragentoo ~/1 $ cat Test.java 
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;


public class Test {
    public static void main(String[] args) {
        int count1 = Integer.parseInt(args[0]);
        int count2 = Integer.parseInt(args[1]);
        while(true) {
            test(count1, count2);
        }
    }

    public static void test(int count1, int count2) {
        ThreadMXBean mx = ManagementFactory.getThreadMXBean();
        long c = mx.getCurrentThreadCpuTime();
        int l = 0, i, j;
        for( j = 0; j < count1; ++j ) {
            for( i = 0; i < count2; ++i ) {
                l += i;
            }
        }
        long end = mx.getCurrentThreadCpuTime(); 
        System.err.println( "l = " + l);
        System.err.println((end - c) / 1000);
    }
}

wfrag@fragentoo ~/1 $ gcc -O3 test.c
wfrag@fragentoo ~/1 $ javac Test.java 
wfrag@fragentoo ~/1 $ ./a.out 10 1000000000
l = 451808768
10390000
wfrag@fragentoo ~/1 $ /opt/sun-jdk-1.6.0.06/bin/java -cp . -XX:CompileThreshold=10 -server  Test 10 1000000000
l = 451808768
15260000
l = 451808768
15080000
l = 451808768
5650000
^C

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

> Вот что выдаёт Mac OS X

Надобно еще С++ супротив Obj-C померить. :)))

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

> >Если я в чем и наврал, так это в способе замера. Чё-то он странное меряет, хотя советуют именно так :)

> А, понял. Пока оно считает, на фоне второй тред усиленно всякий другой код JIT-ить. Потому общее время (замеренное через System.currentTimeMillis()) на второй запуск все равно 10 сек, но со следующими запусками уменьшается до ~6...

Вероятно что-то происходит, как в MS-компиляторах при агрессивной оптимизации. Там цикл for (i=0; i <10000; i++) {} вообще заменяется на i = 10000;

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

wfrag@fragentoo ~/1 $ cat test2.c 
#include <stdio.h>

long ack(long n, long m) {
    if (n==0)return m+1;
    else if (m== 0)return ack(n-1,1);
    else return ack(n-1,ack(n,m-1));
}


int main(int argc, char** argv) {
    int count1 = atoi(argv[1]);
    int count2 = atoi(argv[2]);
    long c = clock();
    long l = ack(count1, count2);
    long end = clock(); 
    printf( "l = %d\n", l );
    printf("%ld\n", end - c);
    return 0;
}

wfrag@fragentoo ~/1 $ cat Test2.java 
import java.lang.management.ManagementFactory;
import java.lang.management.ThreadMXBean;


public class Test2 {
    public static void main(String[] args) {
        int count1 = Integer.parseInt(args[0]);
        int count2 = Integer.parseInt(args[1]);

        while(true) {
            ThreadMXBean mx = ManagementFactory.getThreadMXBean();
            long c = mx.getCurrentThreadCpuTime();
            long l = ack(count1, count2);
            long end = mx.getCurrentThreadCpuTime(); 
            System.err.println( "l = " + l);
            System.err.println((end - c) / 1000);
        }
    }

    private static long ack(long n, long m) {
        if (n==0)return m+1;
        else if (m== 0)return ack(n-1,1);
        else return ack(n-1,ack(n,m-1));
    }
}

wfrag@fragentoo ~/1 $ gcc -O3 test2.c 
wfrag@fragentoo ~/1 $ javac Test2.java 
wfrag@fragentoo ~/1 $ ./a.out 3 13
l = 65533
12100000
wfrag@fragentoo ~/1 $ /opt/sun-jdk-1.6.0.06/bin/java -cp . -Xss16m -XX:CompileThreshold=10 -server  Test2 3 13
l = 65533
19120000
l = 65533
19120000

C в 1.6 раз обошёл. Наверное, дело в том, что Java обязательно отслеживает вызовы функций для работы механизма исключений и Java security. 

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

Могу предложить рекрусивный фильтр (вроде нижней частоты).
Но к сожалению, есть код лишь под Octave/Matlab:

---
L = 9999;
x = rand(1, L);

% Параметры фильтра
A1 = [-1.72459153 -1.35117838 -1.27978953 -1.58003706 -1.37615848];
A2 = [0.937520598 0.904986279 0.733337455 0.802245328 0.680082978];
B0 = [1 1 1 1 1];
B1 = [-1.14362884 -1.85988031 -0.730070683 -1.91673272 0];
B2 = [1 1 1 1 -1];

M = [0.033898292 2.9900372 0.25212086 0.59369428 0.18298915];
%

N = length(A1);

W = 0;
W1 = zeros(1, N);
W2 = zeros(1, N);

y = zeros(1, L);

tic;

% каноническая форма реализации
for i=1:L,
	X = x(i);

	%
	% обработка фильтром
	%
	for J=1:N,
		W = M(J)*X - A1(J)*W1(J) - A2(J)*W2(J);
		Y = B0(J)*W + B1(J)*W1(J) + B2(J)*W2(J);
		W2(J) = W1(J);
		W1(J) = W;
		X = Y;
	end;

	y(i) = Y;
end;

toc;
---


octave:7> rdf
Elapsed time is 9.43132 seconds.

Коэффициенты можно сделать целыми, домножив.
Я думаю вообще можно лишь целыми оперировать - цель не
сигнал фильтровать, а пресечь жулье.

Замерять только циклы.

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

Не, всё, чат с заказчиком окончен, пойду чё-нить полезное делать...

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

> недавно на ЛОРе я показывал, что банальный пузырёк на Си выполняется в 2 раза быстрее, чем на яве. (а может и более - у меня шина памяти медленная - ддр2 200/400)

а давно на ЛОРе же я показывал что чуть менее банальное LU-разложение выполняется на 20-30% быстрее чем на С

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

>>Т.е. Вы признаете, что место Java там же, где и PHP - сервер, веб. Для десктопа не годиться ну ни как. Тогда вопросов больше не имею.

>Да, признаю, но с оговорками. Eclipse-ом я вполне доволен. :)

+100 в такой нише которую обслуживает eclipse ни С ни С++ даже не сунутся

anonymous
()

Читаю коменты некотрых (тех кто хвалит С и пинает Java и наоборот). Ну как дети. Язык это иструмент ,у каждого языка есть свои преймущества и недостатки, и это надо использовать (Пасатижами тоже можно гвоздь забить, но лучьше использовать молоток).

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

Даже на старенькой "шапке" это не так

$ java -cp . -XX:CompileThreshold=10 -XX:+AggressiveOpts -server Pmer
l = 451808768
13610000
l = 451808768
23270000
$ ./pmer
l = 451808768
10630000
$ uname -r
2.4.27
$ cat /etc/redhat-release
Red Hat Linux release 9 (Shrike)
$ java -version
java version "1.6.0_01"
Java(TM) SE Runtime Environment (build 1.6.0_01-b06)
Java HotSpot(TM) Server VM (build 1.6.0_01-b06, mixed mode)
$ gcc --version
gcc (GCC) 3.2.2 20030222 (Red Hat Linux 3.2.2-5)

pmer == test  pmer - это П#п#ськ&-мер потому что. :)

Гы!!! :))) Никак не в разы! Ни разу не в разы Бу-га-га!!! :) 

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

> +100 в такой нише которую обслуживает eclipse ни С ни С++ даже не сунутся

И чего? Я, например, тоже в экскременты соваться не хочу.

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

Золотые слова. "Не калибр отпределяет цель, а цель - калибр." (с)

Только пионерам поорать "A == SuXXX, B == RuleZZZ", или наоборот, - просто реализовать свои комплексы, что типа "девочки ботанов-кульхацкеровне любят".

ЗЫ. Сам использую как Java, так и Objective-C.

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

> Читаю коменты некотрых (тех кто хвалит С и пинает Java и наоборот). Ну как дети. Язык это иструмент ,у каждого языка есть свои преймущества и недостатки

Если б жабокодеры сидели тихо и не высовывались - про них бы и слова никто не сказал. Но нет же, им нужно доказать, что их Java быстрее C, что противоречит любой здравой логике.

CtrlAltBs
()

Джава - фтопку !! и Sun- тоже !

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

Доказать свое априори негативное отношение к миру хотите именно Вы. Не знаю, может не оценили Вас.

Найдете себе "чисто реальную работу" прикладного программиста, поймете, что прикладные задачи гораздо безопаснее и продуктивнее делать на системе, поддерживающей строгую типизацию, принудительную обработку пользовательских исключений и обязательный (! - в отличие от того же Obj-C 2.0) сборщик мусора.

Да и API для Java гораздо богаче. Только вот, работая с Джава, приходится все время изучать что-то новое, а не знатока из себя строить. Зато и высокооплачиваемую работу можно далеко и за 40 лет найти.

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

2CtrlAltBs ненадо обобщать тех кто кричит про крутость Java, со всеми кто ей пользуется.

Если присмотреться все существеные оптимизации и приросты скорости это просто смена алгоритма на более ефектифный, а язык реализации второстепенно.

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

> wfrag@fragentoo ~/1 $ cat test2.c
> ...
> wfrag@fragentoo ~/1 $ cat Test2.java
>...

Ну что ж с параметрами так с параметрами, тоже самое на Маке, Java 1.5 (конфигурация описана выше).

user@mac:~/1$ gcc -O3 test2.c
user@mac:~/1$ ./a.out 3 13
l = 65533
878

user@mac:~/1$ javac Test2.java
user@mac:~/1$ java -cp . -Xss16m -XX:CompileThreshold=10 -server  Test2 3 13
l = 65533
16153499
l = 65533
16155330
l = 65533
16241257

Дружно хороним Java и выбираем Mac. Вы думаете я зря после 3 лет с Линуксом выбрал Мак ОС Х?

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

>Дружно хороним Java и выбираем Mac. Вы думаете я зря после 3 лет с Линуксом выбрал Мак ОС Х?

Крайне странный результат. Выкладывай бинарник, я погляжу.

WFrag ★★★★
()

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

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