Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > 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 в нативныи, так что подобная скорость неудивительна ![]() |
Автор: Domestic Cat 20.6.2004, 00:16 | ||||||||||||||
Две программы:
Я использовал си компилятор
и Java
Вот результаты нескольких запусков, 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 практически не отличаются.
|
Автор: Domestic Cat 21.6.2004, 16:47 | ||||||
Повторил тест, только усреднил время по 20 запускам и добавил JavaS обозначает javac Test.java java -server Test Цифры - среднее время выполнения в ms (чем меньше тем лучше)
![]() ![]() ![]() |
Автор: LSD 23.6.2004, 21:18 | ||||
Наконец нашел время заняться этим делом ![]() Прогнал тест 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
Intel Celeron 1300, RAM 256Mb, Windows 2000 Pro SP4
Добавлено @ 21:21 Через пару деньков доделаю програмку жизнь и выложу результаты. |
Автор: LSD 27.6.2004, 22:40 | ||
В коде Domestic Cat есть небольшая ошибка, факториал 100 не поместится в 4-х байтовое целое, исправил ее и заодно скомпилил под Delphi получились очень интерестные результаты:
это усредненные результаты после 10 запусков. Четно говоря столь слильного преимущества Java я не ожидал. Добавлено @ 22:42 Забыл указать: Машина: AMD Athlon XP 2000, RAM 768Mb, Windows XP Pro SP1 Компиляторы: Borland Delphi 5.5 и плюс те же что и ранее. |
Автор: Sardar 27.6.2004, 23:17 |
Результаты впечатляют. По моему у серверной Явы коронка: быстрые вызовы функций(тоже где то в тесте было). Факториал вычисляется рекурсивно, отсюда и столь впечатляющий результат... наверное... ![]() |
Автор: 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 |
Лекции по С++, я прогуливал ![]() |
Автор: Domestic Cat 19.3.2005, 02:40 |
На это дело надо С++ шников брать, иначе обвинят ![]() |
Автор: chipset 19.3.2005, 06:35 | ||
А в чём собссна дело? ![]() ![]() Что, где, когда писать? Добавлено @ 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 |
Дык не ассемблерного, а С++шного, - две большие разницы ![]() 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 кб ![]() |
Автор: Domestic Cat 3.4.2005, 07:31 |
То ж не просто цикл, там ряд мат операций, и т п, в любом случае С++ шный код будет больше. |
Автор: LSD 7.9.2005, 10:03 | ||
После недавней дискусси с Се ля ви, решил поднять некоторые тесты которые мы гоняли на работе и прогнать их еще раз. Сам код представляет собой итерацию по 2-м массивам, вычисление разности и запись результата в третий массив (нам это было необходимо для обработки видеоизображения). На скорость тестировались:
Sun: -Xms50M -Xmx200M -server BEA: -Xms50M -Xmx200M -jrockit Были получены следующие результаты:
Для Sun JVM один раз было полученно время ~20 сек, но так как оно сильно выделяется на фоне остальных запусков и повторить эксперимент не получилось, в расчет я его не брал. Для C++, тоже замечена странная особенность, первый запуск теста выполняется быстрее последующих на ~1.3 сек, в чем проблема я так и не понял, но результат оставил. |
Автор: aquaserpent 7.9.2005, 16:46 | ||||
Исходя из примера в MSDN функция clock() возвращает время в миллисекундах:
Тогда совершенно не понятно, зачем это время умножать на 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 для применения в нашем проекте. Ну и наконец, должен же быть у нас заготовлен "наш ответ Чемберлену" ![]() |
Автор: aquaserpent 7.9.2005, 22:47 |
Не знаю как в остальных тестах, а в первом примере просто неправильно замеряется время в сишном примере. Его нужно просто поделить на 10 (точнее не умножать на 10). И все становится на свои места... |
Автор: Mayk 9.9.2005, 07:27 | ||||||||
Вы не правы. Котъ писал,
Поэтому 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, чтоб она не выбивалась. Давайте проведем масштабное сравнение компилеров, а? Ну пжалуста. ![]() ![]() зы. В следующий раз, прежде чем кричать "*10 - это не правильно" либо проверьте сами, либо подумайте, совпадает насколько ваш clock() совпадает с clock()'ом проверяющего:
|
Автор: Metal_Heart 9.9.2005, 09:16 | ||
Mayk, очень прошу, ненадо жаргона, я в твоем посте нить теряю Чтобы это значило?
|
Автор: aquaserpent 9.9.2005, 10:13 | ||||
Mayk, при чем здесь мелкомягкие? Неужели Вы считаете, что одна и та же СИШНАЯ (а не мелкомягковская) функция будет возвращать разные значения под разными компиляторами? ![]() ![]() А MSDN, в общем-то, является очень даже авторитетным справочником. И прежде чем "кричать" (как Вы заявляете) я ображаюсь к документации. Теперь подтверждени (модифицированный пример).
Засекаем время секундомером. Java - 128 cек. CPP - 85 сек (плюс/минус секунда погоды не делает). Теперь то, ЧТО ВЫДАЕТ ПРОГРАММА. Java - 128032. CPP - 845150. Ничего не смущает??? Так что MSDN в очередной раз оказался на высоте. А доку читать надо. ![]() А мерять время в Debug или умножать реальное время на 10 ![]() |
Автор: Domestic Cat 9.9.2005, 11:14 | ||||
На какой оси засекалось?
Ага, прям так щас. С каких это пор МСДН имеет хоть какое-то отношение к Макинтошу? Кстати, доки действительно надо читать. На маздае 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 | ||
Не согласен. Ты вообще ничего не указал, ни ключей запуска, ни версию JVM, ни конфигурацию машины, ни компилятора. Да и противоречие с теми тестами что я гонял разительное, вообщем [i]не верю[b]. |
Автор: aquaserpent 9.9.2005, 13:49 | ||||
Ну, верить или не верить, это дело личное. Не верите - проверьте. Я компилировал VS6.0 (Release, естесственно). Никаких дополнительных настроек не ставил, т.е. все по умолчанию. Java - jdk1.5.0_01. Компилировал с теми же параметрами, что и в самом первом примере. Машина - PIV-2400, 512Mb. Хотя это все и не имеет значения. |
Автор: LSD 9.9.2005, 13:55 | ||
Без дополнительных сведений не проверишь ![]() |
Автор: Mayk 9.9.2005, 14:02 | ||||||||||
VS2003. - запускаем новый сишный проект под vs2003. Дебаг: 11016ms - время выполнение(11016ms) выведенное на экран в режиме Debug(а не Release) и запущенное через Start а не через Start without debugging. Если сделать Start without debugging, то время измениться не значительно. Что-то около плюс-минус 100 мс. 11 СЕКУНД НАФИГ. 11 секунд жизни Mayk'а потрачены зря ![]() 11 секунд явно длятся больше секунды - это не ошибка вывода на экран, прошло действительно 11 секунд (*10 убрано) - в коде (t2-t1)*10 убрано умножение на 10, чтобы результат соответствовал действительности. Я уж думал, повисла - мат по поводу тормознутости кода. Релиз: - в конфигурации Release. 0ms - время, выведенное на экран. (!!!) - удивился Фтопку. - еще один мат, по поводу оптимизации кода(шибко умная) Фигня какая-то - так нельзя тестировать и сравнивать. Очевидно, factorial() был выкинут из цикла. Надеюсь понятно объяснил ![]()
Смущает то, что код для мака был запущен на винде.
http://www.opengroup.org/onlinepubs/009695399/functions/clock.html авторитетам врознь-
Согласен. |
Автор: Metal_Heart 9.9.2005, 14:26 |
![]() |
Автор: aquaserpent 9.9.2005, 17:05 |
А что? Секундомер (обычные часики) при запуске на маке по-другому работает и Java-программа начинает работать быстрее сишной? ![]() А тестить на скорость дебаг-версию... Это ж надо так себя не уважать... |
Автор: Coocky 9.9.2005, 17:40 |
Да не, мужики, ну не верю, что "виртуальная" java быстрее "неуправляемого" С++ работала ![]() Хоть тестите,хоть не тестите. |
Автор: AntonSaburov 9.9.2005, 18:00 | ||
Да сколько раз можно рассказывать, что JIT на лету генерит нативный код для метода. И когда ты вызываешь этот метод снова, то он уже фактически в двоичном коде. На конференции разработчики говорили, что они сделали так, что даже научились переключаться при работе метода с байт-кода на нативный. Т.е. раньше JIT работал только при выходе из метода. А первый раз сидишь под байт-кодом. Так вот теперь JAVA будет переключаться даже без выхода из метода. И код оптимизирован может быть под процессор. Т.е. под конкретную можель. А exe уже не оптимизируешь. Какой код есть, такой будет на любой машине. Добавлено @ 18:02 Понятно, что время на JIT теряется. На первое время. Но после него получаем фактически двоичный код. Нет уже никакого байт-кода. Забудь. А если учитывать, что такого рода приложения крутятся круглосуточно, то понятно, что большая часть кода уже нативная. На конференции вообще говорили про разработку Real Time Java. |
Автор: LSD 9.9.2005, 19:15 | ||
Это уже прям религия какая-то получается ![]() Верую ибо С++... |
Автор: Domestic Cat 9.9.2005, 21:46 | ||||
По тестам получалось, что Java быстрее си после неоптимизированной компиляции, и медленнее оптимизированной компиляции. Да это и на глаз было видно при большом количестве итераций. О чем тут спорить непонятно.
Сейчас все виртуальные машины используют JIT. Потому верить тут нечему - это тот же си. А там все зависит от того, насколько компилер умный. |
Автор: batigoal 9.9.2005, 22:20 | ||
Ты вчера был, да? Я не смог. |
Автор: Се ля ви 24.9.2005, 18:19 | ||||
LSD, ну ты б ещё с JVM 1.0 95-го года сравнил! ![]() Ну если уж пятёрку sun`овскую берёшь - бери и соответственно пятёрку BEA JRockit! Естественно, что с выходом новых версий кучу всего оптимизируют и сравнивать разные версии, IMHO, просто некорректно. Если у тебя нет - можешь выложить исходник этого теста, я у себя прогоню-посмотрю. P.S. Вообще же серверную JVM и клиентскую не очень хорошо сравнивать ещё и по вот какой причине - к серверной машине гораздо выше требования надёжности и долговечности. Например, sun`овская считается клиентской и не рассчитана на то, что треды живут очень долго. Если тред крутится уже целый месяц, он может взять и умереть. Если запускаешь программы и работаешь в них, то это не критично, а вот когда у тебя крутится на корпоративном сервере какая-нибудь зверская система автоматизации типа 24/7 - это очень даже критично! |
Автор: LSD 24.9.2005, 18:37 | ||||||||
А это что по твоему??? Это JRockit 5.0 взято http://commerce.bea.com/products/weblogicjrockit/5.0/jr_50.jsp, последний релиз.
В том посте есть аттачмент, угадай что там ![]()
Считается кем? И вообще откуда такая информация насчет тредов?
Вообщем это конечно да, но гонять тесты непрерывно хотя бы месяц, нет возможности ни у меня, ни у тебя. |
Автор: Се ля ви 24.9.2005, 19:53 | ||||||
Сорри, чего-то я туплю, мне покзалось, что у тебя четвёрка была... ![]() ![]()
Это мне препод из "Ланита" рассказывал, когда я ему соответствующий вопрос задал. С его слов информация.
Ну вобщем, да... |
Автор: Бонифаций 28.9.2005, 15:22 |
было бы интересно еще с gcj сравнить. |
Автор: LSD 28.9.2005, 15:27 | ||
Займись, а я может повторю твой тест ![]() И кстати почему только GCJ? |
Автор: Бонифаций 28.9.2005, 15:54 | ||||
потому что gcc и gcj это два frontend для одного backend. Так что по результатам проще было бы оценить влияние именно языка. |
Автор: Guest 28.9.2005, 21:09 | ||||
ну вот. Попробовал. В качестве теста взял решето Эратосфена. Код для жабы:
Для С
Результаты - количество итераций за 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 | ||
машина пентиум 4, 2.4GHz 512M, linux slackware 10. |
Автор: AntonSaburov 29.9.2005, 16:40 | ||
Даже если так - то все рвано разница составляет порядка 10%. А это вообщем-то вполне допустимый разброс. И вполне приличная скорость. |
Автор: LSD 29.9.2005, 16:43 | ||
Давай. Напиши сишную часть. Бонифаций Все в тесте хорошо, кроме одного момента, ты на каждой итерации вызываешь функцию полученя времени. Корректно ли это? Ведь в Java эта функция требует преобразования из системного времени во внутренний формат Java и неизвестно сколько это занимает времени. Попробуй просто сделать фиксированное количество итераций, подбери их чтобы время было порядка 15-30 секунд. И сравнивать уже время выполнения. |
Автор: Coocky 29.9.2005, 16:47 | ||||
LSD
Ок..Какую(сортировку) будем использовать? Только я не пойму условия-от меня текстовый код, что ли? Тогда на каком С++ компиляторе будем тестить? Добавлено @ 16:52 Быстрая сортировка..
выполняет соpтиpовку части массива, огpаниченной индексами L (слева) и R (спpава); для соpтиpовки всего массива необходимо сделать вызов QuickSort(A, 1, n); глубина pекуpсии <= log n |
Автор: LSD 29.9.2005, 16:56 | ||||||
Без разницы, мы ведь не алгоритмы сравниваем. Главное чтобы код был простым (его ведь еще на Java надо перевести).
Да. (посмотри примеры выше, как там народ делал)
Да на всех GCC, GCJ, VC++, Intel C++ Compiller, у кого что есть |
Автор: Бонифаций 29.9.2005, 18:10 | ||||
Если делать выводы, то я бы сказал, что
|
Автор: Coocky 30.9.2005, 12:23 |
Вот, сравните( у меня JAVA нет), осторожно-много памяти ![]() Настройки по умолчанию.. VC 2003 |
Автор: Coocky 30.9.2005, 12:53 | ||
У кого нет VC, вот исполняемый файл. Программа сортирует массив из 39999996 случайных элементов в диапазоне 999 до 32766*1000-1 На WinXP ОЗУ256, Celeron 1200MHz-сортировка с настройками компилятора по умолчанию 20.7400 секунд
|
Автор: maxim1000 30.9.2005, 13:34 | ||
я бы советовал использовать одинаковые массивы для обоих версий дело в том, что у быстрой сортировки есть не очень приятное свойство: ее вычислительная сложность зависит от "удачного" выбора разделяющего элемента если все время не будет везти (крайний случай), ее сложность пропорциональна N^2... |
Автор: Coocky 30.9.2005, 13:55 | ||
Согласен и знал об этом, но как же заполнить? ![]() |
Автор: maxim1000 30.9.2005, 14:09 | ||
случайно ![]() а потом записать в файл перед запуском функции сортировки обе программы читают массив в память измерение времени начинать после чтения (а то получится, что измеряются две скорости - чтение с диска и алгоритмическая, а мешать разные измерения вместе - не очень хорошо...) если же не хочется добавлять сюда операции с диском, можно поступить иначе: реализуем генератор случайных чисел, инициализируем его одним и тем же числом запускаем кучу раз - получаем одну и ту же последовательность... генератор можно взять простейший - типа x=(x*a+b)%m (у нас же не криптография, в конце концов) конечно, можно было бы использовать встроенные генераторы, но я бы не советовал: неизвестно, какой из них работает быстрее даже если известно, то возможно, что он работает быстрее не из-за языка, а из-за пониженных требований к качеству случайных последовательностей (кто его знает, вдруг в Java встроен качественный генератор случайных чисел и это даст неоправданное преимущество для C++?) |
Автор: LSD 30.9.2005, 14:15 |
Лучше файл ![]() |
Автор: Coocky 30.9.2005, 14:16 |
Ну ладно, пусть сами исправят.. У меня все равно JAva нет, мне пофиг генератор...Не с чем сравнивать ![]() |
Автор: maxim1000 30.9.2005, 14:16 |
параметры для генератора можно посмотреть в этой теме: http://forum.vingrad.ru/index.php?showtopic=7465&view=all |
Автор: LSD 30.9.2005, 14:19 | ||
Ты Сишную часть исправь и перекомпили, а то у меня VS нет. |
Автор: Coocky 30.9.2005, 14:20 |
Ну кто нить сравнивал? Че молчите? Или до сих пор прога на Java работает? ![]() Добавлено @ 14:22 LSD А че исправить-то генератор случайных чисел, или в файл записать "родной генератор"? |
Автор: LSD 30.9.2005, 15:12 | ||
Сделай заполнение массива из файла. |
Автор: Coocky 30.9.2005, 15:34 | ||
Давай полное имя файла....который нужно считать..(я ж должен в коде его "открыть") |
Автор: Coocky 30.9.2005, 15:51 |
LSD Ну у меня все готово! имя файла давай! |
Автор: LSD 30.9.2005, 15:59 | ||
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 | ||||
Вот файл. Положи файл радом с прогой и задай относительный путь. Думаю считывать будет долго. Следуй инструкциям на экране ![]() Для тех, кто шарит в С++
Добавлено @ 16:37
Не понял.. Считываю в массив, начиная с индекса 0 по 39999995, считываю построчно, вроде ![]() |
Автор: 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[99999] вылетает прога в дебаг! ![]() Добавлено @ 16:59
Это случайная переменная. Она там ненужна. Это когда тестил-для дебагера использовал Ребята, кто считает где ошибка-подправтеи выложите снова! Я давно в консоли не писал.Извините...Сишники ![]() ![]() |
Автор: LSD 1.10.2005, 22:32 | ||||
Программу Coocky на Java я перевел:
А вот генератор тестовых данных:
Теперь о тестах. Первый раунд Java выиграла нокаутом на первой секунде матча ![]() Coocky ты чего там намудрил с загрузкой из файла? Запускаю программу и она у меня на этапе загрузки данных Please wait! Open your file!!! висит 5 минут, загрузка ядра по диспетчеру задач 100%? З.Ы. Java загружает данные за 0,9690 секунды ![]() |
Автор: Coocky 4.10.2005, 15:56 | ||
Интересно, а какой у тебя размер файла, в котором записано 39999996 элементов по 4 байта? ![]() |
Автор: Бонифаций 4.10.2005, 16:50 |
примерно 156 мегабайт |
Автор: LSD 4.10.2005, 17:03 | ||
Если верить Windows: размер 159 999 984 bytes, на диске 160 002 048 bytes ![]() Это время конечно не после первого запуска, данные сидят в кеше (столько данных, за такое время, диск не в состоянии прочитать). Но попробую сделать это после перезагрузки. |
Автор: Бонифаций 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 | ||
Я переделал С++ программу так, как мне кажется правильным. (приаттачено) Скажу сразу, я юниксовый житель и писал (и пробовал) под юниксы. 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 | ||
Тогда приводи конкретные данные - на какой машине что и как тормозит. Потому что с P2 Java программы с гуем довольно трудно отличить от нативных. |
Автор: Zandr 27.12.2005, 10:50 |
Domestic Cat, согласен |
Автор: хочу работать с Java 12.1.2006, 23:50 |
Господа, хотелось бы услышать мнения о работе в Java с плавающей точкой. На рсдн, в тестах, приводятся просто потрясающие результаты Java по этому направлению - Java ставят в один ряд с VB. Неужели всё так плохо? |
Автор: jer1 16.1.2006, 15:54 | ||||||
взял программу Коть и запустил у себя Вот программы которые я использовал:
компьютер 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 |
Другими словами С получился в тысячи раз медленнее? ![]() |
Автор: 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 мб. Как-то это отталкивает, что ли.. Скажите как справиться? Срочно требуется идеологическая поддержка ![]() P.S. я тут первый раз заглянул, надеюсь никаких традиций древних постом не нарушу |
Автор: batigoal 20.3.2006, 16:30 |
Да, это нормально. Ведь запуском java ... порождается новый процесс, и так для каждого приложения. Если не ошибаюсь, есть возможность запустить несколько десктопных приложений и под одной виртуальной машиной, но как это сделать - не знаю. |
Автор: Nobody 21.3.2006, 14:34 |
Lamer George, Написать свой запускатор, который будет жить в явамашине и дёргать main-методы? ![]() |
Автор: batigoal 21.3.2006, 15:14 | ||
А Бог его знает, почему бы и нет. ![]() Кстати, вот только что наткнулся в мануале Анта на опцию fork таска java. Она как раз отвечает за запуск приложения в рамках той же JVM, что и Ant, или во внешней. По умолчанию - в одной. |
Автор: beartamer 21.3.2006, 15:40 |
Так всё таки насколько это просто и естественно - запустить пару-тройку приложений разделяющих виртуальную машину и библиотеки классов? А то получается что писать простые пользовательские приложения на Java просто смысла нет - памяти не напасешься... ![]() |
Автор: kkorsakoff 21.3.2006, 15:49 |
Блин был какой-то продукт. Не могу вспомнить название. Суть в том, что он стартовал при запуске системы. При запуске java-приложения не создается новая виртуальная машина, а оно запускается внутри той единственной. Получаем большой выигрыш в скорости загрузки. Постараюсь вспомнить. |
Автор: batigoal 21.3.2006, 16:18 | ||
В общем-то, так и есть, если нет необходимости в кросс-платформенности. |
Автор: 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 | ||
Ну во первых такую мысль культивируют ребята из BEA, противопоставля ей свою JRockit. По чистой производительности в вычислительных тестах, она проиграла Sun-овской JVM, а гонять стресс тесты длительностью в недели у меня нет возможности. Во вторых есть действительно специфичные JVM, например Aurora от Oracle, там специфика в тесной интеграции с сервером. |
Автор: powerOn 14.7.2006, 19:08 | ||||
Хм... стало жутко интересно, и я накатал тестик, смысл которого скорость создания объекта + вызов метода. Код С++ писал под Windows, с использованием MS Visual Studio 6.0 (поскольку другой не имею). На идеальность тест не претендует, поправьте меня если что нет так. С++:
Java:
С++: 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++ будет ![]() |
Автор: Void 14.7.2006, 19:42 |
MoonCat, то что при частом создании маленьких объектов GC рулит по сравнению с кучей, было известно давно ![]() |
Автор: Alexandr87 14.7.2006, 19:44 | ||
Слабо вериться. Скорее всего java при компиляции высчитывает значение которое получиться (почему-то мне кажется, что именно так).
и просто его выводит, или каким-то подобным макаром. Предлагаю сделать значение 11 случайным и посмотреть, что получиться, в сравнении с с++. |
Автор: powerOn 14.7.2006, 20:50 | ||||||||
Да я, вообще, еще тот любилеть Америки открывать. ![]()
Хорошо..., правим код: Java
C++:
Время выполнения (миллисекунды): C++ (release) ~ 1453 Java (client) ~ 937 Java (server) ~ 531 Может я в коде где ошибся? Но Java все равно быстрее... |
Автор: JUncle 17.7.2006, 20:19 | ||||||
Есть разумный компромисс - Eclipse SWT. Нативные графические библиотеки. Собственно, GUI Eclipse на нем сделан. В Java 6.0 Mustang обещали увеличить производительность GUI до уровня нативных приложений без всяких копромиссов в стиле SWT.
Ну раз против не имеете, и такие разумные доводы за приводите, что же жалуемся? Это как в пилотировании самолета - размен скорости на высоту (C - > Java) либо наоборот. Ничего из ничего не получается. И ничто никуда не пропадает. Вряд ли ошиблись. Все дело в технологии HotSpot. "Узкие места" компилируются в машинный код и оптимизируются по адаптивному алгоритму, включая оптимизацию под конкретно ВАШУ архитектуру процессора (note: если он известен на момент выхода JDK). (А под какие процессоры может оптимизировать VS 6.0? - ритор. вопрос). Так что ничего удивительного тут нет. Кстати, попробуйте еще на VS 7.0 прогнать. |
Автор: Void 17.7.2006, 23:54 | ||
HotSpot, JIT и прочие радости управляемых сред здесь не при чем. Единственное узкое место в C++ коде здесь — это создание и удаление объекта. В Java это буквально пара инструкций, в C++ — проход по chunck'ам кучи. В этом легко убедиться, заменив calculate в варианте на Java на статический метод, а в C++ — на свободную функцию. В этом случае VC 7.1 примерно равен Java, а Intel C++ 9.0 обгоняет процентов на 15–20. Добавлено @ 23:57
Странно, чего это межконтинентальные лайнеры забираются в стратосферу, а кукурзники летают в пределах 3–4 тыс. м ![]() |
Автор: JUncle 18.7.2006, 07:45 | ||
Не хочу оффтопить, но это утверждение верно при пилотировании одного конкретного самолета. ![]() Это размен кинетической энергии на потенциальную и наоборот. На этом весь пилотаж и основан, в принципе. |
Автор: $tatic 16.11.2006, 12:00 | ||
Прогнал тест powerOn (без ГСЧ) на Sun Java 1.5.0_06-b05, VC++ 8.0 и .NET 2.0:
Результаты: 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 | ||
Там разное поведение: для серверной ставится задача максимальной производительности, а для клиентской быстрый старт и минимизация потребления памяти. Например серверная JVM не отдает полученую память вообще, а клиентская отдаст когда в куче будет большой процент свободной памяти. |
Автор: unkis 3.12.2006, 15:25 |
а говорят что java 6 будет только серверной? Правда ли это? |
Автор: powerOn 3.12.2006, 15:46 | ||
Нет.
![]() |
Автор: unkis 3.12.2006, 15:55 | ||
Спасибо теперь все ясно.![]() Извиняюсь за оффтоп. но питаюсь запустить в серверном режиме мою программу а мне тут вот такую ошибку.
Проверил действительно такой папки с файлом там нет. Хотя установил JDK 1.6 RC. Что же тогда устанавливать надо чтобы оно заработало в серверном режиме? |
Автор: powerOn 3.12.2006, 17:06 |
Ты запуск делаешь на 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
У меня получилось 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 |
А что Вы считаете что JVM объекты вообще не удаляет? У неё что безграничное пространство для действий без ограничений? |
Автор: VOS 9.3.2007, 22:58 |
Я подозреваю, что объекты будут когда-нибудь удалены. Ключевой момент когда. Но очень сомневаюсь, что это происходит в момент замера теста. Я буду Вам благодарен, если Вы расскажите мне в какой момент происходит реальное удаление объектов в Java и как я могу это контролировать. Замечу также, что показанный здесь способ создания объектов является самым медленным в С++. Обычно, когда Вам нужны часто создаваемые/уничтожаемые небольшие объекты их создают с помощью конструкции А a(i); a.calculate(...); В этом случае скорость вырастет на порядки, т.к. чтобы создать/уничтожить объект достаточно передвинуть указатель по стеку и все. Понимаете, даже если поверить, что JIT компилятор неимоверно крут в Java или там в .Net, есть еще некоторые особенности этих языков. Например массивы. И Java и там C# при каждом обращении к какому-нибудь элементу по любому будут проверять на допустимые границы и т.д. Я ни в коем случае не говорю, что это плохо в общем смысле. Но это не добавляет производительности в частности. Но именно из-за общего смысла, для мобил я пишу на Java ![]() |
Автор: batigoal 10.3.2007, 10:14 | ||
Благодарности мы не дождёмся - это процесс непредсказуемый ![]() |
Автор: maxim1000 10.3.2007, 12:03 |
Зато можно с увереностью отодвинуть процесс удаления ![]() можно изменить тест так: в C++ только создавать объекты в Java создавать объекты и использовать их потом (чтобы сборщик мусора не удалил их сразу) и замерить только время создания в обеих программах... Добавлено @ 12:05 а вот время удаления, скорее всего и не получится сравнить из-за этой самой непредсказуемости (хотя яслышал, что можно принудительно вызывать сборщик, но ведь он может начать собирать и другие какие-то вещи) |
Автор: batigoal 10.3.2007, 12:12 | ||
Можно попробовать, но без гарантий, что он действительно вызовется. |
Автор: VOS 10.3.2007, 14:49 |
Еще несколько слов по поводу тестов. Мне кажется сам подход, который пытаются здесь применить - неверен. Вы сначала пишете тест на Java, а потом просто копируете его как код C++. Не выполнив даже элементарные "косметические" действия как в примере с __fastcall Это в корне неверный подход. Хотите получить реальные тесты по производительности, пригласите специалиста в C++. Поставьте ему задачу и пусть он ее сделает любыми доступными ему средствами в C++, а Вы выполните ее любыми доступными средствами в Java. Естественно исходники должны быть открыты и доступны всем участникам. Возможно даже Вы сможете заинтересовать смежный форум по С++ и получится даже некое межфорумное соревнование ![]() Итогом могут получиться уже заслуживающие внимания результаты, которые пригодятся в реальной жизни при выборе средства разработки для той или иной задачи. |
Автор: LSD 10.3.2007, 17:49 | ||
Уже приглашали: Coocky и Chipset-а, до конца так и не довели. Если есть охота займись. А вообще есть раздел "Наши тесты" там и тема соответсвующая есть. |
Автор: $tatic 18.3.2007, 22:36 |
Вы уже, наверное, видели мою тему в тестах о бенчмарке OpenGL на Java и C++. Сейчас уже есть один человек, который согласился написать код на C++. Правда он копирует мой весьма неоптимизированный (в плане графики, да и обхода дерева мешей) код на Java. Если кто-то хочет присоединиться - пожалуйста. Правда лично мне кажется, что производительность реальных графических приложений будет примерно одинакова - графика сейчас больше видеокартой обсчитывается, а не процессором. Да и еще, есть такие игры как ИЛ2-Штурмовик, Chrome, Xtreme Rally (неплохой автосимулятор кстати, даже на небыстром компе летал), Закон и порядок. В них логика (все кроме графики) делалась на яве, а графический движок на C++. И ничего, геймеры не заметили в принципе. ;) |
Автор: SaDFromSpb 19.3.2007, 03:53 | ||
Вот удивил, так удивил!... Это достоверная инфа? VOS, +1. Действительно, многие сравнения не честны. В серверной джаве наверняка политика менеджера памяти сильно отличается от С++сных реализаций. Там, например, память вполне может выделяться большими блоками, которые по-тихоньку заполняются, к тому же удаляется это все дело фиг знает кода. В си, во-первых у тебя есть выбор, какую память выделять, во-вторых есть замечательная возможность с легкостью создать собственный менеджер памяти (или просто взять альтернативный, например, из библиотеки <locki> ), который будет несоизмеримо эффективнее по сравнению со стандартной операцией new для маленьких объектов. Так же есть возможность явно рекомендовать компилятору хранить определенную переменную в регистре и т.д. и т.п. (хотя это уже тонкий напильник....) В яве всех этих возможностей нет, скажем так, по определению. Так что, абсолютно уверен, что при небольшом желании на сях можно обогнать серверную джаву в любой задаче, если руки растут откуда надо. |
Автор: SaDFromSpb 19.3.2007, 07:55 |
Ну может быть, еще компилятор для с++ половчее поискать прийдется для этого ![]() |
Автор: LSD 19.3.2007, 15:12 | ||
А при определенных усилиях на асме можно обогнать любой Си ![]() Вот только в больших проектах возможности вылизывать каждую строчку кода - нет. |
Автор: Бонифаций 19.3.2007, 15:16 | ||
Я не согласен с таким определением честности. Если ява действует разумнее при распределении памяти, это ее достоинство. Так что если мы пишем один и тот-же алгоритм на C++/java и java обгоняет - то в этом тесте она победила. независимо от того, кто как управляет своими ресурсами. |
Автор: SaDFromSpb 19.3.2007, 15:31 | ||||
Как тут уже сказали, проблема в том, что во многих примерах код явы просто скопировали на с++ и изменили, чтоб скомпилиось. Именно это не честно, потому что если бы человек изначально "думал" на си++, он бы реализовал решение по другому. Эту мысль высказал VOS, а я с ней согласился и добавил свою догадку об одной из причин обгона джавой сей в случае этих примеров.
Чем ты профессиональнее в конкретном языке, тем ты лучше пользуешся его естестественными возможностями. Поэтому у профессионалов опереденная "вылизанность" получается автоматически. |
Автор: LSD 19.3.2007, 15:41 | ||
Особенно использование сторонних менеджеров памяти ![]() |
Автор: $tatic 19.3.2007, 19:57 |
Это достоверная инфа, правда игру Закон и порядок я к сожалению "не щупал". Но Chrome и Xtreme Rally сделаны одной фирмой на одном и том же движке. А Chrome выиграл даже конкурс от Sun Microsystems. |
Автор: JUncle 19.3.2007, 23:29 | ||
А особенно при использовании agile методологий, где предпочтительнее прозрачный код чем мифическое ускорение на три наносекунды ![]() |
Автор: SaDFromSpb 20.3.2007, 03:44 | ||
Если прийдешь к осознанию, что это нужно, то это дело пяти минут (если, конечно, не самому писать).
Прозрачность никуда не денется, если использовать язык естественным образом. Тут у нас религиозная война не начинается, случаем? ![]() |
Автор: VOS 20.3.2007, 10:23 | ||||
В связи с тем, что дискуссия продолжилась, я все же решил переписать тест на создание большого кол-ва небольших объектов. Времени особо раздумывать нет, поэтому вариант вряд ли самый быстрый. Итак первоначальный тест:
Первый тест - 6781 мс Второй - 421 мс Комп - P4 2,4 Ггц 512 МБ На нем запущен CBuilder, NOD, MS SQL, Oracle, Firebird и т.д. (лень выгружать было) |
Автор: LSD 20.3.2007, 12:05 |
Это сферический конь в вакуме. Смысл имеют только относительные результаты. Что же касается кода, то второй пример ни разу не эквивалентен первому. Т.к. во втором случае мы не можем освобождать память по мере необходимости, и если из 10 000 000 объектов нам нужен будет только один, то мы будем держать всю память занятой. P.S. Не верю я что на машине с 512 Мб памяти и такой толпой запущенных программ: можно комфортно работать. Те же MS SQL и Oracle, памяти жрут немерянно. |
Автор: VOS 20.3.2007, 14:52 | ||||||
Изволите за ЦСКА болеть? Согласен конечно. Но относительные результаты думаю очевидны.
Я не претендую на это. Всего лишь показал как решить конкретную задачу - быстро создать в куче много небольших объектов. Реализация механизма, о котором я упомянул во втором примере, позволит и удалять отдельные объекты, но его реализовывать только ради теста у меня нет времени.
Это если их активно юзать. Если только хранимки править, то не особо напрягает. А вот когда еще среда разработки для Java запускается, вот тогда не сладко ![]() |
Автор: alexsolo 5.4.2007, 19:32 | ||||
Вот шикарный тест из LZMA SDK и Java и C# и оптимизтрованный C++ и Delphi: http://www.mycoolfotos.com/lzma/lzma443_test.zip Данные прогона на моих компах ![]()
|
Автор: 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 ![]() |
Автор: _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:
JRockit 5
Sun JDK 5:
А Sun JDK 6 почему-то вообще с ошибкой свалилась:
Сейчас, разберусь с 6-й JDK - ещё напишу... |
Автор: LSD 20.4.2007, 21:55 |
Как лицензируется JRockit? |
Автор: Се ля ви 20.4.2007, 23:28 | ||||||||||
Дома тоже эта ошибка наблюдалась. Переставил - вроде пошло. Но машина другая (P4 3GHz, 2Gb RAM), так что - всё по-новой: Sun JDK 6:
Sun JDK 5:
BEA JRockit 6:
BEA JRockit 5:
Тоесть у пятёрочки JRockit при избытке памяти производительность даже возросла... http://bea.com/framework.jsp?CNT=index.htm&FP=/content/products/jrockit/ сопровождается текстом:
Завтра покопаюсь боле пристально в лицензионном соглашении, может быть и найду что-то интересное... Я думаю, дело в том, что к JRockit идут дополнительные инструменты для диагностики memory leak`ов и тюнинга - вот их использование уже вроде бы платно, хотя их тоже можно и скачивать и юзать - но уже в права на них я не вникал... |
Автор: Се ля ви 21.4.2007, 02:22 | ||
Вот по поводу Tools`овин информация:
|
Автор: w1nd 22.4.2007, 21:21 | ||
Не считая одной малости: по словам ведущего системного инженера BEA Systems (Мачей Грушка), JRockit стоит использовать только при наличии глубоких знаний о её внутреннем устройстве и способах её настройки. Я могу прокомментировать: эта jmv может на совершенно ровном месте упасть не пискнув или намертво зависнуть, причём частота таких падений/зависаний удручает. Короче, господа, есть только одна jvm и делают её в sun ;) |
Автор: Се ля ви 23.4.2007, 10:20 | ||||
В следующий раз, когда он приедет в Москву, я его расспрошу об этом по-подробней.
Ну, бывало несколько раз такое дело... Сервак на прошлой работе падал в среднем раз в 2-3 месяца без записей в логах и прочих следов и совершенно независимо от нагрузки. Но это не так уж часто... А ты уверен, что Sun`овская не упадёт, активно работая в режиме 24/7 через 2-3 месяца без перерыва? IBM`овская есть ещё, к примеру... |
Автор: w1nd 23.4.2007, 21:20 | ||
На моей памяти не падала. Не поминай всуе, а то ышшо явится ![]() ![]() |
Автор: alexsolo 25.4.2007, 00:35 | ||||
Возвращаясь к бенчмаркам. Сегодня тестируется следующий код:
Результаты забегов:
Исходники + бинарники: http://www.mycoolfotos.com/lzma/repeat_goto.zip (371 KB) |
Автор: nornad 25.4.2007, 01:55 |
Не понял, к чему это? то должны показать эти результаты? То, что мобильный проц медленнее? И так понятно. То, что одноядерный АМД 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 | ||
Честно говоря, не осилил. Что вы хотели сказать? |
Автор: nornad 28.10.2007, 05:54 |
Platon, не надо нас переманивать с Java на другие платформы. ![]() GUI даже на 1.4 можно было нарисовать так, чтобы он особенно не тормозил. Просто, большинство программистов знало, как что-то реализовать в принципе, но не знало, как именно это лучше сделать, чтобы не добавлять лишних тормозов. |
Автор: Platon 28.10.2007, 12:21 | ||
w1nd, другими словами хочу сказать, что проще программировать на C++ с помощью Qt, иметь абсолютно родное приложение, при этом написать код один раз и скомпилировать его посредством разных компиляторов. nornad, в поисках истины прибегаю и к критике. Не могу сказать, что переманиваю, скорее сказать, прошу, чтоб успокоили и переубедили.
На это могу сказать так, что даже если ты плохо программируешь, в родном приложении тормозов можно не заметить, но на Java у тебя постоянная необходимость в том, чтобы весь код был максимально оптимизирован. Это изречение безусловно двояко, можно сказать, что код и так должен быть оптимизированным, НО и можно сказать, что GUI приложения завоевали себе неважную славу. ЗЫ: Используя метод от противного. Если принять за истину, что GUI-приложения на Java работают быстро, то нет необходимости в разработке родных GUI-библиотек, что противоречит действительности. => GUI-приложения медленные. ЧТД |
Автор: nornad 28.10.2007, 16:21 | ||
А ты в курсе, сколько стоит Qt? ![]() Малость абстрактно и притянуто за уши, но я скорее согласен, чем нет. ![]() |
Автор: Platon 28.10.2007, 16:26 |
В курсе, но там есть некоммерческие релизы + мы же в России живем ))) Можно узнать в каком месте притянуто? |
Автор: nornad 28.10.2007, 19:03 | ||
Как-то глядел у них на сайте и не видел некоммерческого. Хотя, мог и проглядеть. А подстрекать к нарушению прав на интеллектуальную собственность не стоит. ![]() Работать же приходится нередко и с зарубежными партнёрами. Ну и ещё. Если твоя программа написана с использованием украденного Qt (или чего другого), то на рынок США, например, соваться с нею проблематично - если будет установлен факт нарушения прав, это грозит кучей неприятностей и штрафов. Конечно, если пишешь под себя (блин, классная фраза получилась - можно не только ходить под себя, но и писАть ![]() Можно. Ты сознательно не учёл многие факторы. А эти факторы в определённых условиях могут повлиять на итог. |
Автор: w1nd 28.10.2007, 19:48 | ||||||
Platon, если бы на C++ было бы проще программировать, то не было бы ни java, ни .net, ни delphi. Если бы Qt предоставляла бы больше возможностей, чем java runtime, то они не делали бы jambi.
Неверно с обоих сторон. Во-первых, многие нативные приложения потормознее будут, во-вторых, на java достаточно не совершать грубых ошибок. Точнее, одной грубой ошибки - исполнения кода в гуёвом потоке.
А необходимости в альтернативных гуях действительно нет. Попробуйте провести тесты - вы удивитесь ;) [hr] В любом случае, будущее не за компилируемым кодом. |
Автор: Platon 28.10.2007, 20:09 | ||
w1nd, действительно на C++ сложнее программировать, поэтому вечеринки устраиваю в форуме Java ^_^ но, думаю, если бы java производил родное приложение, то все бы занимались этим... И без этого тормозов хватает, исключая пожалуй 1.6, интересно 1.7. совсем выйдет на скорость родных приложений? Добавлено через 9 минут и 51 секунду
Вспомним понятие "теория игр", где оба игрока играют максимально оптимально. |
Автор: Platon 28.10.2007, 21:43 | ||
Факт коверкается. jambi сделан как раз для того, чтобы была возможность писать по возможности более родные приложения, так же как и SWT. Ах, да, у Java же есть такой прекрасный механизм, как сборка мусора, и перед этим стоит преклонить колено ^_^ |
Автор: powerOn 28.10.2007, 23:20 |
Понятия "быстро" и "медленно" весьма относительны. ![]() Ну вот, допустим, выполняется отрисовка на С++ за 0,001 секунды, а на Java за 0,003. И работает Java (допустим) в 3 раза медленнее.... Ну и что? Пользователю то оно без разницы, он все равно этого не заметит... Этой скорости достаточно (при определенной "прямости рук" программиста), что бы реализовать отзывчивый пользовательский интерфейс. Плюс еще развитие железа идет полным ходом, что серьезно сглажвает разницу. Что касается игрушек, так тут конечно дело за OpenGL и т.п. P.S.: Раньше-то (а может и сейчас) частенько на ассемблере куски кода писали, считали, что код после С++ компиляции медленно работал... тоже наверное воевали, что мол С++ сакс, а Asm рулез... ![]() |
Автор: Platon 28.10.2007, 23:38 | ||
Несложно подсчитать, что программисту C++ можно быть в 3 раза криворукей чем Java программисту ^_^ Ну, тут тоже надо разделять понятия "необходимый" и "достаточный" В общем, ждем семерки с ее improved code, а там можно и поговорить далее. |
Автор: nornad 29.10.2007, 05:03 | ||||
Ну, если программисту пофигу, что за Г он выдаёт - да, можно. Только вот хорошие программисты обычно стараются писать хороший код. ![]()
Раньше бывали случаи, когда было просто необходимо делать вставки на асме. Компилятор С/С++ вставлял кучу лишних действий, что сильно замедляло код. Плюс, мощности машин были ниже. Сейчас компиляторы стали поумнее, а мощности выросли. Поэтому сейчас вставки на асме делают намного реже. Потому как необходимости нет. |
Автор: Platon 29.10.2007, 09:41 |
Не люблю я экстенсивный способ развития ![]() Тогда поставим вопрос так: почему Java не может включить в стандартную поставку одну из родных библиотек? |
Автор: powerOn 29.10.2007, 10:11 | ||
В каком смысле "родных"? Если в смысле "нативных", то она поставляет... поищите в подпапках JRE по маске *.dll |
Автор: w1nd 29.10.2007, 12:23 | ||||
Использование jvm приносит бенефиции, недостижимые для родных приложений.
Да ну? А не для того, чтобы приобрести новых пользователей? Приложения QT ничуть не роднее приложений на java для любой из систем. |
Автор: Platon 12.1.2008, 12:17 | ||||
Подкину дров: http://en.wikipedia.org/wiki/Javolution
Какого черта это имеет место быть?!
Совсем недавно, значит вещь актуальная. Если бы java не была такой нерасторопной, никаких real time specifications выдумывать не нужно было бы, я так думаю. Сразу приношу извинения, если в чем-то ошибаюсь, я провожу расследование по этому вопросу, в том числе поделился с местным населением. |
Автор: batigoal 12.1.2008, 12:25 |
Platon, real-time системы - это не более быстрые системы, это более предсказуемые системы. Возможно, речь идёт именно об этом? Хотя Сановцы уже сделали свою реализацию Java Real-Time, так что не знаю. Добавлено через 6 минут Да, похоже так и есть. Плюс ещё какие-то оптимизации. |
Автор: LSD 12.1.2008, 17:47 | ||
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 действительно невыгодна в соотношении (усилия на разработку)/(расход аппаратных ресурсов), потому как усилия приблизительно равны, а расход ресурсов нет. Но когда сложность софта велика и достигает промышленного уровня -- необходим переход на следующий уровень абстракции, чтобы мозги программистов могли охватить систему и при этом не перегореть ![]() Так что не так все и печально. В названых факторах не упомянута финансовая составляющая, а ведь она тоже участвует в этом уравнении, причем на первом месте. Стоимость разработки понижается при использовании высокоуровневых средств, и понижается значительно быстрее, чем растут аппаратные запросы софта. |
Автор: Platon 17.2.2008, 14:20 |
Вот, это мне больше всего не нравится. Т.е. Java + десктоп маст дай? |
Автор: LSD 17.2.2008, 14:36 | ||
50 экземпляров qip бывает нужно крайне редко ![]() |
Автор: 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 | ||
![]()
![]() ![]() ![]() |
Автор: 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 | ||
Хм... а что есть десктоп? Машина/железо или среда окружения? Если второе, то в качестве примера можно рассмотреть явно десктопное приложение IntelliJ IDEA. Я пока не видел другого настолько же удобного редактора. Особенно это касается C++/Object Pascal. Навороченных - уйма. Удобных - не видел. Эклипс мне не нравится - мне он неудобен. Но у него тоже есть немало поклонников именно в плане удобства. Но давай вспомним, что и он писан на Java. И что же нам остаётся? Остаётся признать, что эти предложения достаточно сложны, чтобы перейти упомянутый порог. Теоретически написать их можно на любом языке (ну, со своей спецификой, конечно). Но почему-то IDEA и Eclipse уже существуют несколько лет, а подобного для того же С++ до сих пор не появилось. Visual C++?.. Не... она на порядок-два отстаёт по добству. ![]()
а) 4 Гб на телефонах (или чём-то, что будет выполнять их функции) будет и явно ещё при нашей жизни б) все программы гугль на джаве под андроид писать не будет точно. Андроид - линукс, а значит часть программ будет на С. Потому что так оно лучше/проще/удобнее/надёжнее. Большинство - да, на джаве. Потому что сторонним разработчикам-одиночкам это удобнее. Но пока что джава-приложения на телефонах приживаются плохо. В первую очередь из-за того, что разные производители делают свои реализации свинга под телефоны, из-за чего становится неудобно делать приложение, которое работает везде - оно либо убогое, либо тянет кучу лишнего кода. И я бы попросил высказываться попроще, без резких наездов. Платон мне друг, но истина дороже. Его я знаю более или менее, а вы, уважаемый, здесь только появились. В общем, не стоит начинать знакомство с резкости. Kangaroo - одобрямс. ![]() |
Автор: Platon 18.2.2008, 09:11 | ||||
Могу связать это лишь с тем, что код C++ тянется с давних времен, уровень ОО мышления был не так остр как сейчас, и на железки смотрели по-другому, и видимо разработчикам лень менять ядро программы. Приведу доругой пример софта Компании-разработчика IDEA: JetBrains Omea Pro 2.2. Выполнена на ЯВУ(предположительно C++) вещь радует своей гибкостью - работать удобно и быстро. Бесспорно на стороне Java программиста явное удобство синтаксиса и правил языка, которые ускоряют разработку продукта. Сам же не забываю, что Java - язык не привязанный к конкретному типу компилятора и благо, для Java есть даже native компиляторы. сомнений эффективности технологии.
Гениальный шовинистический аргумент. |
Автор: Bozo 18.2.2008, 20:54 | ||
Она на C#. В нее они вложили опыт, накопленный с Resharper и IDEA. На остальное отвечать - нарываться на замечания и бан. ![]() |
Автор: LSD 19.2.2008, 12:44 | ||
Крайнеспорный аргумент. |
Автор: nornad 19.2.2008, 18:05 |
Аргумент - да, спорный. Но часть программ на сях точно там будет. Большей частью тех, где сложность не слишком высока (хотя, откуда сегодня на сотке очень сложные программы?). |
Автор: Bozo 19.2.2008, 21:13 | ||||
|
Автор: LSD 20.2.2008, 12:18 |
Android еще не вышел, и пока нет гарантий что выйдет. Google свою ОС тоже хотел сделать, хотел-хотел - да передумал. |
Автор: batigoal 20.2.2008, 16:09 |
Девайсы уже демонстрировались. |
Автор: LSD 20.2.2008, 16:37 |
Так и ОС существует (и продолжает развиваться до сих пор), но проект-то они забросили. Тем более, что они просят не ассоциировать андроид с брендом гугла. |
Автор: 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 |
Сенк, андроид я в курсе. Гугловскую десктопную ось имел в виду. Спасиб. |
Автор: w1nd 7.3.2008, 01:57 | ||||
Всё не доходят руки самому поразбираться:
В приложении бинарники варианта на C++, собранные GCC и VS2005. Примеры на C++ выполняются в среднем на порядок быстрее. |
Автор: Platon 7.3.2008, 10:02 |
А вот мне интересно, на сколько ускорится ваш пример на Java если его скомпилировать с помощью gcj? |
Автор: w1nd 7.3.2008, 12:38 | ||
Нет, это как раз совсем не интересно ![]() |
Автор: w1nd 9.3.2008, 14:28 | ||||
Немного поковырялся с реализацией BitSet; в java для хранения бит в нём используются long'и, в c++ - unsigned long, ЕМНИП, в c++ это 32 бита, а не 64. Замена стандартного BitSet на свой (реализация аналогичная) даёт увеличение производительности java-примера в два раза.
А замена деления на более простые операции даёт почти ту же, что для примеров c++ скорость:
Не так давно я кому-то говорил, что использование битовых операций вместо сложения/вычитания/деления по модулю не даст никакого прироста. И это должно быть так. Но, как видите, замена деления даёт огромный прирост производительности даже на современных процессорах. Печально, но факт - не наблюдается более чем уместной оптимизации ещё на стадии компиляции. |
Автор: Platon 9.3.2008, 14:35 |
http://forum.vingrad.ru/index.php?showtopic=189783&view=findpost&p=1368269 Не эта ли темка? Надо заметить, что вы не только о сложении/вычитании говорили. |
Автор: w1nd 9.3.2008, 14:40 | ||
![]() Самое смешное, что перед как раз перед
я производил некоторые тесты, в которых мне не удалось выявить пользу подобной оптимизации. Вероятно, я не учёл ещё каких-то факторов... Добавлено через 1 минуту и 46 секунд Да; исправил сообщение. Добавлено через 5 минут В любом случае, я не откажусь от ранее сделанных выводов о вреде оптимизации java-кода под конкретные типы процессоров. Но очень печалит пренебрежение оптимизациями разработчиков jre... JIT на этом примере точно успевает отработать, поэтому странно видеть такой плачевный результат... |
Автор: Platon 9.3.2008, 21:48 |
А меня в Java расстраивает только GUI. Видимо придется брать на вооружение Jambi. |
Автор: w1nd 9.3.2008, 21:52 | ||
Уж где-где, а в гуях по мне всё нормально. Посмотрите на 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 10.3.2008, 08:28 |
Чисто визуальные ощущения, причем вполне объективные. Не буду же я, любя и уважая Java, подсуживать другим. |
Автор: Platon 10.3.2008, 10:20 | ||||
Вот был пример из туториала Qt Jambi
Вот недоделанный аналог на SWING
Терпения не хватило работать с 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 |
1. Замечание верное, но в свете принципа 10/90 этот эффект можно нивелировать. 2. Есть такой момент, но приведение вниз можно делать без того алгоритма который том описан. Да и пользы от проверки явно больше. 3. Согласен с тем что больше, но вот насчет свопа он загнул. Из реальных приложений пожалуй только IDE могут сожрать столько памяти. 4. Общие рассуждения без конкретики. 5. Пусть для начала покаже компилятор C++ который сможет провести такую оптимизацию. |
Автор: Bozo 21.3.2008, 22:46 | ||
Последнее изменение страницы было 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 | ||
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 - пусть вас не смущает аббревиатура ![]() Идея в том, что можно создать аппаратную 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 приложениях ![]() Прожорливость и тормоза будем сравнивать относительно Qt4 на довольно простом http://doc.trolltech.com/4.4/layouts-basiclayouts.html. Смысл сравнения именно с Qt4 состоит в том, что и Qt4 и Java/Swing полностью сами отрисовывают интерфейс внутри окна без использования каких-либо нативных компонент (нативное только главное окно). Был написан аналогичный код на Java с использованием Swing (код см. ниже). Получилось вот так: ![]() Насчет Look&Feel: сразу можно записать в минус Java неправильный default шрифт в JTextArea и неправильную отрисовку меню в неактивном окне. Но самое интересное происходит при ресайзе этих окошек: Qt все делает просто моментально и плавно, а в Java все происходит рывками и с заметным шлейфом от перерисовки рамки окна: ![]() Очевидно, что Java тормозит и явно не успевает перерисовывать содержимое окна при изменении его размеров. В Qt4 таких проблем не наблюдается, рамка окна сразу следует за мышкой и интерфейс внутри окна всегда успевает отрисовываться. Также интересно посмотреть на потребление памяти для такого простого окошка: ![]() Результаты поразительные: Java прожорливее почти в 10 раз чем Qt4, и для отображения этого окна и изменения его размеров позволила себе отожрать больше 100Мб! Неужели это можно назвать разумным потреблением памяти? А вот мой код на Java (возможно я что-то делаю не правильно, укажите на это):
|
Автор: 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 | ||||
Конечно, цифры говорят именно о том, сколько у системы было забрано ресурсов. Также как и в случае с Qt4, память учтена с ее довольно толстыми загруженными библиотеками. И какая разница сколько потребляет сама JVM, а сколько именно Java программа? В итоге получается какой-то дикий overhead на JVM. Причем для Metal LAF потребление за пределы 35Мб не выходит (это уже нормально при изначальных 30Мб при старте программы).
Конечно, содержимое окна при перетаскивании должно быть включено. И, конечно, с оформлением "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 | ||||||||
А какая разница, исходники же одни? Использовалась OpenSource Qt 4.4 собранная MSVC 2008 Express.
Потому что 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 | ||||||||
Я к тому, что если писать под Windows - то уж лучше .NET. А если сравнивать Qt и Swing приложения, то уж тогда на всех платформах.
Очень жаль... У меня возможности сейчас посмотреть нету... Но если так дела обстоят, то плохо... ![]()
От Apple.
Да, есть такое... Спору нет. |
Автор: 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 10.2.2009, 17:27 | ||||
Как черновой вариант (на С++):
Пример in.txt:
Если кто сделает что-то подобное на 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 | ||||||
Почему же неправильно то? Сравнивал именно скорость отрисовки для простого окна, а также то насколько хорошо поддерживается System Look And Feel (в моем случае это Windows XP LAF). Кстати, вот еще сравнивал скорость Java2D и Qt: http://trac-hg.assembla.com/jgears В принципе Java2D не так уж и сильно тормозит, правда не поддерживает полноценное hardware acceleration.
Ну вот при запуске того самого окошка, Java взяла примерно 30Мб памяти, это нормально. А вот то, что при ресайзе окошка она постоянно аллоцирует новые объекты (похоже что картинки для кэширования) и потребление памяти за 100Мб переваливает (при этом еще и сборщик мусора постоянно подчищает эти объекты и все еще больше тормозит) - не нормально. Хотя к скорости и потреблению памяти для Metal LAF у меня претензий нет, все работает достаточно быстро и не жрет память. Но зато есть претензии в виду самого Metal LAF...
Eclipse побыстрее работает (именно в плане интерфейса вроде прокрутки окна с кодом), хотя на современной машинке это почти и не заметно. А на счет LAF - в IDEA по умолчанию Alloy LAF, и он половину шрифтов не сглаживает в интерфейсе почему-то. |
Автор: EJack 11.2.2009, 06:49 | ||||||
Потому что платформа потребляет всегда больше ресурсов по определению. Есть такая вещь как мета данные - их много, под них нужна память.
Тут конечно стоит вопрос реализации самого L&F, кроме того сборщик работает не постоянно - а только когда решает что пора. Например зачем чистить 50 метров, если в системе еще свободно 2 гига, поэтому память и растет.
Вот не очень то я уверен что в эклипсе прокрутка быстрее - спорить не буду. На згляд у всех по разному будет, у меня вообще на поймешь (машинка зверь), но вот отчего я с эклипса перелез на НетБинс а теперь и идею осваиваю (покупать собрался) так это по стабильности работы. Да и 8 версия вообще лапочка ![]() |
Автор: LSD 11.2.2009, 12:46 |
Формат записи числа? Как разделяются отдельные числа? Множество комплексных чисел неупорядоченное. Как сортируем? Формат такой же как и во входном файле? |
Автор: Kallikanzarid 11.2.2009, 13:20 | ||||||
Числа записываются как два числа в скобках через запятую или одно число в скобках, если мнимая часть равна нулю: (1) (0, 1), (0.000001, 3414) Числа разделены пробелом.
Сорри ![]() ![]()
Да. |
Автор: Kallikanzarid 11.2.2009, 14:46 | ||||
Немного переделал:
Добавлено через 10 минут и 53 секунды Протестировал на файле из 10000 чисел (~10 мб):
Машина - Pentium D 2.80, 1024 MB, Windows Vista. |
Автор: Kallikanzarid 12.2.2009, 19:27 |
Люди, ау ![]() |
Автор: Temdegon 13.2.2009, 00:34 |
У меня такой вопрос. Есть к примеру сервер вооруженный 4-мя двухъядерными процами. Если запустить на этом сервере Java-приложение, которое будет что-то длительное время делать, будут ли использоваться все процессоры или система ограничится одним? Приложение на Cи, решающее эту задачу (Автоматическое составление расписания для студентов) выполняется около 40 минут, но при этом используется только один процессор. Переписать эту программу так, что бы она использовала остальные процесоры никто не может по многим причинам. Вот у меня и возник этот вопрос, есть ли с этим делом какие-то сложности у Java? Насколько она эффективна на многопроцессорных системах? Должен ли сам код быть многопоточным для этого? Есть ли какие-то тонкости в установке и насторойке jre на многопроцессорных серверах? Есть ли особенности в написании кода для таких систем? |
Автор: v2v 13.2.2009, 00:52 | ||||
Переделать приложение в многопоточное. В вашем случае будет достаточным разделить нагрузку между 4мя паралельными потоками, и производительность возростёт ровно в 4 раза. Добавлено через 2 минуты и 47 секунд
нет, реализовать многопоточность будет достаточно, об остальном позаботится ОС. Добавлено через 4 минуты и 29 секунд Можете проследить за загрузкой ЦПУ на разных ядрах при выполнении следующего врагмента кода.
|
Автор: Cr@$h 13.2.2009, 08:57 | ||||||||
![]()
Операционная система ничем не ограничится и ничем не расширится. Сколько потоков есть, столько и будет.
Одной из причин являются невозможностью распараллелить сам алгоритм?
Распараллеливаешь в ручную, используя потоки. Такая программа будет написана только на N-ядерные/процессорные платформы. Каждый раз придётся переписывать для нового числа ядер. Управляемый код уже содержит в себе многопоточность, но лишь служебного характера.
Так говорить нельзя. За такое можно сразу банить. ![]() |
Автор: v2v 13.2.2009, 09:40 |
в данном контексте, когда речь идёт о сложном алгоритме , который на протяжении длительного времени полностью занимает всё процессорное время одного из ядер, можно... тем более я сказал не потоки разделить на 4 , а нагрузку разделить на 4 потока... |
Автор: batigoal 13.2.2009, 10:27 | ||
Ммм. Почему? Достаточно сделать число потоков конфигурируемым, насколько я понимаю. |
Автор: Neox_GeForce 3.7.2009, 11:10 | ||||||||||||
код на шарпе
Результаты(3 запуска): 1071 ms 1068 ms 1068 ms Потом скомпилил в среде Dev-C++ с найлутшей оптимизацией
Результаты: 5620 ms 5620 ms 5460 ms Машина: Intel core 2 duo 1.86 . RAM 1GB. |
Автор: kamre 3.7.2009, 16:12 | ||||||
Для начала неплохо перемерять с корректным подсчетом времени:
И использовать современный компилятор (MSVC9/IntelCPP11/GCC4), а не престарелый MinGW из Dev-C++. |
Автор: LSD 3.7.2009, 17:09 |
1. Этот тест меряет в первую очередь затраты на вызов метода. И в том что C# в это тесте быстрее C++ нет ничего удивительного. 2. Этот топик все таки посвящен Java, а не C# vs C++, так что не увлекайтесь. ![]() |
Автор: 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) приведены ниже:
В забеге участвовали след. компиляторы/интерпретаторы: • 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 Вот результаты проведенного тестирования: В каждой из таблиц приведено время, затраченное на выполнение умножения матриц. Классический алгоритм: ![]() Оптимизированный алгоритм: ![]() Блочный алгоритм: ![]() Лучшие результаты для каждого компилятора я вынес в гистограммы производительности: ![]() ![]() ![]() Итак, как и ожидалось, самый быстрый код создают компиляторы от Интел. Пока им нет равных. Особенно это заметно на классическом варианте умножения матриц. В этом алгоритме изначально порядок следования циклов далеко не оптимальный. Это скорее всего улавливают компиляторы от Интел и располагает его нужным образом, а также задействуют векторизацию и др. оптимизации. Всё это позволяет "нихрена не делая" сделать почти безнадежный классический алгоритм очень эффективным. Другие компиляторы этого пока не могут. Поэтому приходится оптимизировать алгоритмы вручную. Блочный и ikj-алгоритмы за счет более эффективной работы с кэш памятью процессора позволяют несколько приблизится к результатам, полученным интелом. Что же касается Java, то серверная JVM от Sun на некоторых тестах выглядит достаточно достойно, почти на уровне MSVS C++ и GNU G++. Клиентская версия конечно ещё сильно отстает от своих конкурентов. Компиляторы из Java напямую в машинный код не везде так быстры как ожидалось. Того же касается и GNU Fortran. От него я ожидал большего. Вывод: Если нет времени на оптимизацию программы то стоит взять компилятор от Интел, включив по возможности высокий уровень оптимизации (ключи /O3 /fast). Если результат не удовлетворителен или если есть время, то стоит повозится с оптимизацией циклов. Можно применить след. способы оптимизации: блокирование циклов, разворот самого внутреннего цикла, если он короткий, заюзать векторизацию и регистры. Кстати говоря благодяря последним двум мне удалось обогнать компилятор от Интел, но здесь уже нужно писать на ASM-е. Было бы не плохо узнать какие результаты получатся на процессоре Intel. |
Автор: Xaker88 3.11.2009, 16:11 | ||||
Джава в 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 | ||||||
Осилил всю тему. ![]() Тест с факториалом на C++ у меня проходит за 0 ms (на VS2005). Похоже оптимизатор что-то там мудрит. Поэтому изменил тест следующим образом: C++:
C#:
Delphi:
Вместо вызова функции 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 | ||||
|
Автор: Karadul 26.3.2012, 18:19 |
http://habrahabr.ru/post/136210/ Надеюсь, не [:|||:] |