LINUX.ORG.RU

C vs. JVM's benchmark

 , ,


1

0

Стэфан Краузе в своём блоге
http://www.stefankrause.net/
опубликовал новые тесты производительности кода, написанного на C и на Java.

В тесте используются компилятор GCC 4.2.3 и различные версии JVM (Sun JDK 6, IBM JDK 6, Excelsior JET, Apache Harmony, BEA JRockit).

Тесты проводились на ноутбуке Dell Insprion 9400 с 2GB RAM и процессором Intel Core 2 2GHz под Ubuntu 8.04 (x86). Исходные коды прилагаются.

>>> Подробности

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

>Это всего лишь две точки спектра, который гораздо шире. CAD-системы, системы компьютерной алгебры... собственно, чего тебе не хватает-то для "широкого спектра"?

<tailgunner_mode> Интерпритатора Паскаля для шел-скриптинга! </tailgunner_mode>

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

> Какой широкий спектр применения однако...

Будучи языком для обучения, на нём писали всё на что способна больная фантазия студентов

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

>>Это всего лишь две точки спектра, который гораздо шире. CAD-системы, системы компьютерной алгебры... собственно, чего тебе не хватает-то для "широкого спектра"?

><tailgunner_mode> Интерпритатора Паскаля для шел-скриптинга! </tailgunner_mode>

Думаю, система UCSD Pascal тебе подойдет :)

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

>Будучи языком для обучения, на нём писали всё на что способна больная фантазия студентов

Вопрос в удобстве. Иначе под определение "ЯП общего назначения" можно подвести любой тьюринг-полный язык. Достаточно написать пару сайтов на Брейнфаке :)

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

> Вопрос в удобстве.

Скорее во вкусе, в нашем отделе один чудак вообще ничего кроме него не признаёт, ну дело своё делает потому и живёт, правда когда последние серваки под виндой заменят туговато ему прийдётся.

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

>Скорее во вкусе, в нашем отделе один чудак вообще ничего кроме него не признаёт, ну дело своё делает потому и живёт, правда когда последние серваки под виндой заменят туговато ему прийдётся.

Это ты про Брейнфак? о_О

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

>> Ну щас, пойду грабить музеи

> Гадом буду корованы лучше %)

Хм... угнать машину времени ЛОР и грабить корованы "в те времена далекие, сейчас - почти былинные"? Это идея.

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

В теме уже ананимус из 2018 года отметился, одолжи у него.

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

> Это ты про Брейнфак? о_О

Неее про паскаль. Если он брейнфак залюбит я его лично укокошу в туалете...

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

> Опередил!

Хотя про музей и могилы было оригинальнее

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

>Если судить по shootout, она медленнее (Java 1.6). Местами - намного.

Какими местами? Вот http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=javaxx&... плюс-минус паритет, только в startup проигрывает в 57 раз. Если бы этот дурацкий тест не включали бы в общий резалт, она бы вообще D обошла

или шо это Java 6 -Xms64m за жаба? Совсем не жаба? А шо тогда?

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

>или шо это Java 6 -Xms64m за жаба? Совсем не жаба? А шо тогда?

Целованая жаба aka принцеса.

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

>> Если судить по shootout, она медленнее (Java 1.6). Местами - намного.

> Какими местами? Вот http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=javaxx&;... плюс-минус паритет, только в startup проигрывает в 57 раз. Если бы этот дурацкий тест не включали бы в общий резалт, она бы вообще D обошла

Ну то есть таки паритет, не "сираны Ди".

> только в startup проигрывает в 57 раз. Если бы этот дурацкий тест не включали бы в общий резалт, она бы вообще D обошла

Был бы тот же плюс-минус паритет.

http://shootout.alioth.debian.org/gp4/benchmark.php?test=all&lang=java&am...

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

>Паскаль доказал это еще до твоего рождения. Си++ - тоже давно.

+1

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

<tailgunner_mode> Интерпритатора Паскаля для шел-скриптинга! </tailgunner_mode>

Паскаль был создан как язык для обучения процедурному программированию (хотя, по словам Вирта, язык нельзя считать только учебным, поскольку язык, непригодный для написания реальных программ, для обучения использоваться не должен). Название языку дано в честь выдающегося французского математика, физика, литератора и философа Блеза Паскаля. Один из первых языков, для которых была создана реализация «на самом себе» — компилятор Паскаля был написан на самом Паскале. В начале 1970-х годов для переноса Паскаль-систем на различные аппаратные платформы была создана система Pascal-P, в которой был единый компилятор Паскаля в промежуточный язык (P-код) и для каждой платформы создавался быстрый интерпретатор P-кода. Заимствование этой системы привело к созданию системы UCSD-Pascal в Университете Сан-Диего (Калифорния, США), намного позже её идеи были заимствованы создателями языка Java (байт-код, компиляция в байт-код, интерпретатор байт-кода).

http://ru.wikipedia.org/wiki/%D0%9F%D0%B0%D1%81%D0%BA%D0%B0%D0%BB%D1%8C_(%D1%...)

Кроме того, RemObjects Software: Pascal Script для дельфи позволял использовать паскаль в качестве интерпретируемого языка.

Это конечно частные случаи, но загуглив по словам интерпретатор паскаля, очевидно, что шелл-скриптинг возможен

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

> А меня реально раздражают идиоты, причёсывающие все языки и типы задач под одинаковую, абсолютную(по их мнению) гребёнку.

Да-да, такие тоже )

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

> а можно узнать, что подразумевается под "небесплатностью"?

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

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

> Интуиция мне подсказывает, что такого же набора фишек IDE, как имеется для Java, для C написать невозможно. Как минимум из-за макросов и ifdef-ов.

В плюсах все посложнее, ага. Но макросы, ифдефы, шаблоны ничего принципиально невыполнимого не вносят - иде вполне может их понимать.

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

> Э... Можно узнать, сколько лет ты программировал на Си и сколько - на Java?

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

Если кто-то пишет что он писал на плюсах 10 лет и потом перешел на яву и увеличил свой перфоманс - значит он скорее всего тупил на плюсах 10 лет.

А еще раздражает когда явовские либы начинают портировать на плюсы, вроде лог4спп, cppunit - ужас, убить ап стену.

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

2 KRoN73:

неполенился сделал решение на C задачи о ферзях ... http://slil.ru/25960743

в решении использовалась реализация хеш-таблицы, найденая через гугл http://www.cl.cam.ac.uk/~cwc22/hashtable/

к сожалению результатов пока нет, у меня дома компьютер старенький совсем, Athlon 2 Ггц 768 Мбайт памяти, на 16-ти ферзях все просто встает через некоторое время из-за недостатка памяти ... программа жрет памяти просто неимоверно много ... в пн. попробую на работе на Core 2 Duo 2,6 Ггц 4 Гбайт памяти ...

а пока если хотите попробуйте сами ... транслировал Microsoft Visual Studio 2005 SP1

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

2 KRoN73:

собственно там ещё подоптимизировать кое-что можно, это пока тупо переписывание кода с решения на яве ... ну если количесвто найдены решений хотябы совпадет (т.е. правильно хотябы работает, что вопщем-то совсем не факт, ибо не проверял, ну на 8-ми ферзях вроде правильно), ещё может подоптимизирую ...

да, и запостите решение на форум balancer.ru а то мне там регистрироваться надо ...

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

Дорогой ананимус, очевидно мне следовало помимо тега "tailgunner_mode" использовать еще и тег "humor". Поверьте, я отлично знаком с этим чудо-языком. Просто считаю, что писать на нем скрипты это такое же изврашение как писать на шеле веб-сервер.

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

> Сразу видно - автор просто не смог осилить (может он просто не понял зачем нужны пакеты ??).

Не осилил-то ты - там же ясно написано "into the language". Речь не раздутом API, а о том, что _в сам язык_ продолжают напихивать фичи - после убогих generics туда собрались добавить closures.

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

>А я когда-то активно писал на C++. Как и ты, я избавился от одной из двух вредних привычек:)

М... Я, тогда, выходит, избавился от двух. Ибо бросил курить и бросил писать на Си++ :D

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

>Если кто-то пишет что он писал на плюсах 10 лет и потом перешел на яву и увеличил свой перфоманс - значит он скорее всего тупил на плюсах 10 лет.

Если кто-то пишет, что он 10 лет копал лопатой, а потом пересел на экскаватор и увеличил свой перворманс - значит он скорее всего тупил на лопате 10 лет.

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

>собственно там ещё подоптимизировать кое-что можно, это пока тупо переписывание кода с решения на яве ... ну если количесвто найдены решений хотябы совпадет (т.е. правильно хотябы работает, что вопщем-то совсем не факт, ибо не проверял, ну на 8-ми ферзях вроде правильно)

Для 16 ферзей 1846955 решений.

Для 12 - 1787.

...

На счёт памяти странно. На Java хватало 2Гб у автора задачи. Сейчас скомпилирую, у себя в time %M погляжу, сколько жрёт... Э... Чёрт, а как для time передать аргументы? Оно пытается их bash'у скармливать:

$ time -f %M ls
bash: -f: команда не найдена

real 0m0.034s
user 0m0.000s
sys 0m0.001s

$ time --format=%M ls
bash: --format=%M: команда не найдена

real 0m0.002s
user 0m0.000s
sys 0m0.002s

...

Кстати, сколько времени переписывание с Java на Си заняло?

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

Во-первых там С++, если я ничего не упустил, и вектора не ввели в стандарт С
void eval_A_times_u(const vector<double> &u, vector<double> &Au)
{
for(int i=0; i<u.size(); i++)
for(int j=0; j<u.size(); j++) Au[i] += eval_A(i,j) * u[j];
}
Я не удивился, гавеная жаба, говном и осталась!

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

total solutions 1846955 in 97 seconds
Правда последние 955 она считает по времени ~столько же, что и предыдущие 1846000. Странно

А на жабе аналогичный бенч где? На балансере?

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

>Если кто-то пишет что он писал на плюсах 10 лет и потом перешел на яву и увеличил свой перфоманс - значит он скорее всего тупил на плюсах 10 лет.

> Если кто-то пишет, что он 10 лет копал лопатой, а потом пересел на экскаватор и увеличил свой перворманс - значит он скорее всего тупил на лопате 10 лет.

Разница между C++ и Java больше напоминает разницу между лопатой и совком. Совок гораздо удобнее держать и меньше возможности заработать мозоли и боль в спине. Куча индусов безо всякой квалификации, вооруживщись совками, могут теоретически обогнать одного рабочего, хорошо владеющего лопатой. Однако производительность лопаты все-таки больше.

Я вообще не очень понимаю людей, списывающих performace программиста на детали языка. Если программист на C++ жалуется на проблемы с памятью - это просто плохой программист. Если на отсутствие либ жалуется - это просто смешно. Либы есть и на все случаи жизни.

В конечном счете все упирается в человека, а не язык. Индус на любом языке выдает одинаковый по качеству код. Он всегда тупо избыточен, никакой оптимизацией не страдает. Люди просто не думают - как оно будет работать, как будет захватывать-освобождать память. А эти операции занимают до трети времени в плохом коде. Я не утрирую - есть реальные проекты, в которых просто упорядочивание работы с памятью приводило к 30% ускорению. А причина одна - Java размягчает мозг, частично убирая необходимость думать о памяти. Но память - то все равно выделяется, и если не думать - тормоза просто гарантированы.

HappySquirrel
()

http://pastebin.com/m1a589684

Компиляция: g++ -Wall -O3 queen.cpp -o queen -DNDEBUG

Я немного улучшил алгоритм поиска. Так же я не стал всё сувать в 64-битный long, ибо запарился биты гонять, а сделал "тупо" через массив.

Сейчас ещё допишу потоки (кстати в программе на Java два потока у меня не дают никакой прибавки).

БОльшую часть времени потратил на рисование алгоритма на бумажке и чтение доки по unordered_set-у (до этого никогда не использовал). С С++ борьбы никакой не было. В этой задаче мне лично было бы всё равно, на каком языке писать - Java или C++. Один раз вылетел за границы массива, valgrind тут же подсказал.

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

Да, использовал некоторые библиотеки из нового стандарта, поэтому нужен относительно нестарый gсс (у меня 4.2.3)

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

> На Java хватало 2Гб у автора задачи

ну у меня тоже наверно 2 Гб хватит ... просто у меня их нету :) ... а своп тормозит ...

> Кстати, сколько времени переписывание с Java на Си заняло?

всего порядка 4-4,5 часа ...

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

>> Если кто-то пишет, что он 10 лет копал лопатой, а потом пересел на экскаватор и увеличил свой перворманс - значит он скорее всего тупил на лопате 10 лет.

>Разница между C++ и Java больше напоминает разницу между лопатой и совком.

А мне разница между Java и С++ напоминает разницу между экскаватором и культ-карго экскаватором сделанным туземцами из хвороста и обмазанным глиной, перед которым тузецы копают яму лопатами (Си) в надежде эту конструкцию оживить.

>Индус на любом языке выдает одинаковый по качеству код.

Почитай про рекламации которые Индия выдает по продукции Росвооружения.

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

> Кстати, сколько времени переписывание с Java на Си заняло?

ну я там какие-то эксперименты проводил ещё, не сразу стал hashtable делать ... думаю если сразу бы стал делать hashtable время было бы меньше на час ...

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

> Кстати, сколько времени переписывание с Java на Си заняло?

ну я там какие-то эксперименты проводил ещё, не сразу стал hashtable делать ... думаю если сразу бы стал делать hashtable время было бы меньше на час ...

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

> total solutions 1846955 in 97 seconds

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

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

>Почитай про рекламации которые Индия выдает по продукции Росвооружения.

Они же секретные

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

> total solutions 1846955 in 97 seconds 

А на каком процессоре?

$ time ./queens
14772512 1846955
76.66user 0.80system 1:24.76elapsed 91%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+144356minor)pagefaults 0swaps

$ cat /proc/cpuinfo 
processor       : 0
vendor_id       : AuthenticAMD
cpu family      : 15
model           : 47
model name      : AMD Athlon(tm) 64 Processor 3200+
stepping        : 2
cpu MHz         : 2018.228
cache size      : 512 KB
fdiv_bug        : no
hlt_bug         : no
f00f_bug        : no
coma_bug        : no
fpu             : yes
fpu_exception   : yes
cpuid level     : 1
wp              : yes
flags           : fpu vme de pse tsc msr pae mce cx8 apic sep mtrr
pge mca cmov pat pse36 clflush mmx fxsr sse sse2 syscall nx mmxext
fxsr_opt lm 3dnowext 3dnow up pni lahf_lm ts fid vid ttp tm stc
bogomips        : 4039.04
clflush size    : 64

Ы?

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

> наверно больше всего влияет объем и быстродействие оперативной памяти ...

Полгига в пике даже без сборки мусора.

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

>неплхой результат я бы сказал, по сравнению с Java...

Где взять java-вариант теста? По ссылке http://balancer.ru/2008/02/06/post-1421087.html интересное обсуждение на 10 страниц, но читать некогда.

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

Проц C2D E8400 3000MHz. 4Gb оперы, aqueens жрет 900Мб в пике.

>76.66user 0.80system 1:24.76elapsed 91%CPU (0avgtext+0avgdata 0maxresident)k 0inputs+0outputs (0major+144356minor)pagefaults 0swaps

А где тут время? Это меньше 97 сек?

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

> А где тут время?

76.66

> Это меньше 97 сек?

Очевидно. Причем, частота в полтора раза меньше, памяти вообще гиг, но софтина жрет всего полгига. Причем, я еще и мусор не собираю.

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

>Очевидно. Причем, частота в полтора раза меньше, памяти вообще гиг, но софтина жрет всего полгига. Причем, я еще и мусор не собираю.

Так ты не aqueens.exe считал? Тогда нет смысле сравнивать. А вообще Athlon с памятью быстрее работает, чем интел, задержки около 40ns, а у интела от 60ns и больше.

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

> Так ты не aqueens.exe считал? Тогда нет смысле сравнивать.

Факт, что Яву все-равно сделали. А вот с Хаскелем не получилось -- меньше 1000 секунд пока не получается. Хотя, на двух ядрах, да по 3ГГц, думаю, он бы с Явой тоже сравнялся при том, что код чище.

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

>Я, тогда, выходит, избавился от двух. Ибо бросил курить и бросил писать на Си++ :D

Ты не избавился от привычки "С++-подобный синтаксис". Т.е. ты не "бросил курить", а перешёл на "лёгкие сигареты":)

Led ★★★☆☆
()

Вариант с использованием нескольких потоков. Он раза в полтора медленнее предыдущего варианта из за того, что размер доски указывается в рантайме. В предыдущем варианте размер доски указывался в константе и gcc разворачивал кучу циклов.

http://pastebin.com/m3a69f8a6

На моей машине он в среднем в три раза быстрее Java.

Для компиляции нужен буст 1.34.1 (-dev пакеты).

g++ -Wall -O3 -DNDEBUG queen.cpp -o queen -lboost_thread

./queen -s SIZE -c THREADS

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