сходил - просмотрел по диагонали.
ни одной цифры не приведено - одни голые умозаключения. возможно что на словах он и докажет что ява в 10 раз быстрее С, но ни одного реального подтверждения так и не приведет.
А слабо написать на C/C++ и на яве одинаковую программу, вычисляющую обратную матрицу, и скормить ей примерчик с рандомными числами размерами этак 10000x10000? И замерить время. А то что-то не убеждает меня эта велеречивость, ну никак. Если есть затруднения - могу дать код на C/C++, ваша задача - сделать аналог на яве. Кто возьмётся? :)
Старые песни оглавном...
Как всегда автор выдергивает отдельные фичи в JVM, которые судя по всему на асемблере писаные, и этим жутко гордится. Но как только касается дело каких-либо фич писаных на самой Java (напр. Swing) мы получаем тормоз редкосной красоты. Как по мне, это вообще глупое занятие - сравнивать языки совершенно разных концепций.
Какая разница кто быстрее, важно, что бы нравилось пользователю (качество, функциональность), а вы могли написать это в с приемлемыми затратами (сроки, ресурсы).
Я раньше думал, что JAVA только for server side
сейчас ситуация изменилась.
Solaris 10 интерфейс GNOME+JAVA (все очень прилично, на соседней машине стоит ;-)
PS
7 лет назад мной знакомый писатель 3d игр смеялся над теми, кто использует для рендоринга C, сейчас его даже C++ не пугает.
Посмотрим, что будет через пару лет.
(поставьте java5 (может работает и на 1.4)) кликните в ссылку откройте при помощи /usr/java/bin/javaws под ляликом, на windows все откроется само ;-)
2d игрушка на java (ala Crimson Land)
http://www.puppygames.net/downloads/alienflux.jnlp
>А слабо написать на C/C++ и на яве одинаковую программу, вычисляющую обратную матрицу, и скормить ей примерчик с рандомными числами размерами этак 10000x10000? И замерить время.
Дай алгоритм, напишу. Самому лень искать/писать :)
>На трех страницах автор доказывает, что Java-программы - не такие медленные, как принято считать
А в Эстонии, говорят, готовятся к проблеме 2000 :)
>А слабо написать на C/C++ и на яве одинаковую программу, вычисляющую обратную матрицу, и скормить ей примерчик с рандомными числами размерами этак 10000x10000? И замерить время. А то что-то не убеждает меня эта велеречивость, ну никак. Если есть затруднения - могу дать код на C/C++, ваша задача - сделать аналог на яве. Кто возьмётся? :)
Давай, я возьмусь. Мне это интересно :) Поскольку я нашёл один частный случай, когда одна и та же чисто вычислительная задача на Java на конкрентной машине считается быстрее, чем на Си :) - http://forums.airbase.ru/index.php?showtopic=32510
>А слабо написать на C/C++ и на яве одинаковую программу
В рамках этого форума уже проводилась писямерка между С и JAVA.
Задача была написать программу генерирующую массив из мульена целых чисел. Потом его отсортировать. Потом произвольную выборку поделать.
Первый вариант обеих программ показал, что JAVA быстрее сишной реализации. После чего, автор сишной программы переписал метод сортировки и, таки, обогнал JAVA. Разница была просто смешной.
вот сейчас тряхнул стариной, вытащил прогу на С - вычисление определителя методом LU разложения, матрица 1000x1000
переписал почти зеркально на Java
резельтат
[dea@filer ch2]$ ./task2
determinant II = 1.45102 time 13980 msec
[dea@filer ch2]$ java LUdet
determinant II = 1.45102 time 8.16700 sec
кому надо - вышлю исходники на мыло
> А давай. Интересно будет посмотреть.
Зачем далеко ходить, зачем какие-то обратные матрицы? Ты перемножение двух матриц проверь сначала :)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main(int argc, char* argv[])
{
double *A=NULL;
double *B=NULL;
double *C=NULL;
int i,j,k,n,m,p;
time_t t0,t1;
n=1000;
m=1000;
p=1000;
t0=time(NULL);
A=(double *)malloc(n*m*sizeof(double));
B=(double *)malloc(m*p*sizeof(double));
C=(double *)malloc(n*p*sizeof(double));
for (i=0;i<n;i++)
for (j=0;j<m;j++)
A[i*m+j]=rand();
for (i=0;i<m;i++)
for (j=0;j<p;j++)
B[i*p+j]=rand();
for (i=0;i<n;i++)
for (j=0;j<p;j++) {
C[i*p+j]=0;
for (k=0;k<m;k++)
C[i*p+j]+=A[i*n+m]*B[m*p+j];
}
t1=time(NULL);
printf("Calculation time: %f\n",difftime(t1,t0));
free(C);
free(B);
free(A);
return 0;
}
Это на C. Попробуй переделать в C++ и Java :)
ЗЫ. Все эти пузомерки есть херня. Язык программирования выбирают под задачу. На жабе числодробилки ни кто писать не будет, т.к. кроме скорости счета, еще есть и скушанные ресурсы (память). А тут у жабы увы...
А! понял где ты меня надул, у Жабы Math.random() гораздо круче сишного rand()
надо drand48 использовать:
[dea@filer m]$ gcc -O2 m.c
[dea@filer m]$ ./a.out
Calculation time: 60.000000
> кстати - секунду вполне мог календарь сожрать. Да и раз от раза колебания в пределах 200 миллисекунд
Не уверен. Просто difftime у меня всегда выдаёт целое число секунд. Так что реально там могла быть и больше, чем ровно 58. Надо попробовать что-нибудь другое.
Я так думаю, что если бы они были нормальные по скорости, не пришлось бы ничего доказывать.
Ну не уровня C программы на java и делалась последняя не для этого, но народ упорно год за годом пытается доказать, что java быстрее всех быстрых, что даже дум можно первый спортировать и на четвертом пне он даже пойдет как и на четверке...
> А слабо написать на C/C++ и на яве одинаковую программу, вычисляющую обратную матрицу, и скормить ей примерчик с рандомными числами размерами этак 10000x10000? И замерить время. А то что-то не убеждает меня эта велеречивость, ну никак. Если есть затруднения - могу дать код на C/C++, ваша задача - сделать аналог на яве. Кто возьмётся? :)
>3d игрушка на java (ala Q3 Arena)
>http://home.halden.net/tombr/squareheads/squareheads.php
Упс :(((
java.lang.IllegalStateException: Mouse must be created before creating cursor objects
at org.lwjgl.input.Cursor.<init>(Cursor.java:90)
at trb.gui.MouseCursor.createCursor(MouseCursor.java:142)
at trb.gui.MouseCursor.enableNativeCursor(MouseCursor.java:92)
at sh.SquareHeads.enableCursor(SquareHeads.java:395)
at sh.SquareHeads.initLwjgl(SquareHeads.java:160)
at sh.SquareHeads.main(SquareHeads.java:1461)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.jav
a:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at com.sun.javaws.Launcher.executeApplication(Launcher.java:837)
at com.sun.javaws.Launcher.executeMainClass(Launcher.java:797)
at com.sun.javaws.Launcher.continueLaunch(Launcher.java:675)
at com.sun.javaws.Launcher.handleApplicationDesc(Launcher.java:390)
at com.sun.javaws.Launcher.handleLaunchFile(Launcher.java:199)
at com.sun.javaws.Launcher.run(Launcher.java:167)
at java.lang.Thread.run(Thread.java:534)
на С
vitus@[]:~/tmp> gcc -O0 1.c && ./a.out
Calculation time: 71.000000
vitus@[]:~/tmp> gcc -O2 1.c && ./a.out
Calculation time: 22.000000
vitus@[]:~/tmp> gcc -O3 1.c && ./a.out
Calculation time: 22.000000
на Java (один в один из С)
Calculation time: 57654 (т.е. 57.5 секунды).
т.е. хуже 2.5 раза чем оптимизированный C, но на 20% быстрее чем не опр. С. Не так уж и плохо. =)
машинка p3 933МГЦ. Памяти хватало =).