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). Исходные коды прилагаются.

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

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

>>>Байт - по своему происхождению и по логике счётная единица и поэтому обязан адресоваться.

Проадресуйте мне пожалуйста 1 байт на HDD 8)

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

>>>Собственно, походу, серьёзно на асссемблере никто из приравнивающих его машкоду не писал

Я узнаю о себе страшные вещи 8)

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

должен быть SIGSEGV - нет места для завершающего нуля :)

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

> char *message = malloc(strlen(text_1)+strlen(text_2)); strcpy(message, text_1); strcpy((message+strlen(text_1)), text_2);
>
>P.S. набросал код прямо в окно, должен работать)))

Угу - налицо переполнение, работать не будет, забыл про '\0' в конце !

int size1= strlen(in1);
int size=2 strlen(in2);
char *out= malloc(size1+size2+1);

/* длина строк известна, используем более быстрые функции */
memcpy(out+0,in1,size1);
memcpy(out+size1,in2,size2);
out[size1+size2]= '\0';

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

>Проадресуйте мне пожалуйста 1 байт на HDD 8)

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

Запись же внутри сектора - побитовая ещё со времён FDD.

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

> Лучше так: { char* message; int len1 = strlen(text_1), len2 = strlen(text_2); message = malloc((len1 + len2 + 1) * sizeof(char)); if(message) { memcpy(message, text_1, len1 * sizeof(char)); memcpy(message + len1, text_2, len2 * sizeof(char)); } return message; }

Ошибка - забыл '\0' финальный положить в message !

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

> sizeof(char) == 1. Нафиг это писать?

не везде :)
есть машины, где sizeof(char) == 4
sizeof( char[0] ) == 1

то есть отдельный символ кладется с выравниванием в 4 байта
но массив будет по-байтовый :)

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

>>>А на HDD байтов и нет ...

Мдэ? А где ж они есть ? 8) А то придурки с Seagate чёй-то вякают о них - дескать имеются 8) Может хватит нести ахинею ? 8)

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

>Мдэ? А где ж они есть ? 8) А то придурки с Seagate чёй-то вякают

То ли слишком толсто, то ли слишком глупо. В любом случае дальше неинтересно. Так что:

>Может хватит нести ахинею ? 8)

KRoN73 ★★★★★
()

Старая поговорка @самый легкий способ сделать из многозадачной оси однозадачную - запустить jvm@ постепенно дала сбой :) Теперь на java пишут в основном из-за _реализованных_ под неё механизмов сборки мусора и работы с сетевым протоколом.

А тут про работу со строками в Си дискуссия, смешно даже. Ъ си посмеиваются в сторонке :)

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

>Мдэ? А где ж они есть ? 8) А то придурки с Seagate чёй-то вякают о них - дескать имеются 8) Может хватит нести ахинею ? 8)

cat /dev/ass > /dev/head

dmitry_r
()

Бит - 0 или 1
Байт - последовательность битов в общем случае любой длины,
но сейчас обычно подразумевается что байт == 8 бит
Октет - ровно 8 битов

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

> Лучше так: { char* message; int len1 = strlen(text_1), len2 = strlen(text_2); message = malloc((len1 + len2 + 1) * sizeof(char)); if(message) { memcpy(message, text_1, len1 * sizeof(char)); memcpy(message + len1, text_2, len2 * sizeof(char)); } return message; }

еще можно так, если мне не изменяет склероз:

sprintf(res,"%s%s", srt1, str2);

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

Хех - зайдем с другой стороны линия RS-232 8 бит дата (ака byte) - и где адрес ?

P.S. А неинтересно потому что сказать нечего (концепция адресуемости любого байта - бред). Поверьте мне - про устройство HDD я осведомлён э.э.э.э не хуже Вас.

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

>но сейчас обычно подразумевается что байт == 8 бит

Именно так. Обычно и общепринято, но не обязательно. И об этом нужно помнить.

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

>Хех - зайдем с другой стороны линия RS-232 8 бит дата (ака byte) - и где адрес ?

Ну вот, опять... А если 7 бит дата? Тогда что? Никогда не работал с 7N1? Или 9N2?

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

>концепция адресуемости любого байта - бред

Да-да. Всё, что не укладывается в рамки твоего куцего мировоззрения - бред, ты прав :D

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

Фууу - и кто-то тут еще говорил про толсто ... Тыкать домашним извольте. И даже в случае 9ти бит - где адрес ? 8)

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

> Хренасе, были. Да почти все ваши мобильники-шмобильники на ARM архитектуре, на которой так и есть. char и все его братья = 32 бита

Ты это сам придумал?

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

> Значит очень жаль, что ты не понял простую истину - инструмент выбирается для решения задачи...

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

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

> Java по факту имеет гарантированую безопасность при работе с массивами

Этот аргумент уже плесенью порос. Напиши себе либу для работы с динамическими массивами, отладь ее, и так же безопасно пользуй скока влезет.

> сборщик мусора

Это ее сильно специфичный костыль в виде расплаты за "безопасность".

> встроеную в язык многопоточность.

Т.е. Типа сама все распараллеливает ?

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

Либо плохо писал либо какие другие обстоятельства. Не верю. Сорцы в студию)

Большинство сервисов Яндекса написаны на C++, вроде как (по крайней мере так утверждает один из их главных программеров). А сервисы, надо сказать, хороши.

Так что главное - откуда руки растут.

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

Just use D! По сабжу было бы действиетельно интересно увидеть его тесты.

Xroft ★★
()
Ответ на: комментарий от kost-bebix

>Большинство сервисов Яндекса написаны на C++, вроде как (по крайней мере так утверждает один из их главных программеров). А сервисы, надо сказать, хороши.

У них достаточно много кода и на Java уже.

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

> JET упал при компиляции на ~90% :(

А как именно упал? Может, тупо памяти не хватило? Прошлые версии компилировались без проблем, даже где-то в форумах рекомендовали такой способ разгона Azureus.

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

> Человек который на С будет писать например вебприложение - не просто >быдлокодер а быдлокодер шизонутый на всю голову.

удивительно, что сами веб-сервера написаны на C.
btw, не знаю ни одного (без якзотики, простейший я и сам на пишу
in 5мин на любом языке) написанного на какоми-нибудь другом
(java, php, даже C++).

и в чем принципиальная разница между языками?
по мне так, PHP - иммитация C, Java - диалект C++

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

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

В этом топике горе-С-шники уже нам продемонстрировали кучу глючного кода, который должен выполнять ПРОСТЕЙШУЮ задачу. В С/C++ слишком много мест, где можно совершенно случайно отстрелить себе ногу - я это знаю на своём опыте, как программист на С++ с девятилетним стажем.

> Это ее сильно специфичный костыль в виде расплаты за "безопасность".

Точно так же, как и умные указатели - расплата за отсутствие этого костыля...

> Т.е. Типа сама все распараллеливает ?

Нет. В Java есть специфицированная модель памяти и примитивы синхронизации. Причём благодаря встроенности синхронизации возможны оптимизации, недоступные в C/C++. Например, lock elision с помощью escape analysis.

В общем, в большинстве случаев сравнительно небольшие тормоза по сравнению с C/C++ стоят тех дополнительных возможностей, которые есть в Java.

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

> char *s; s=malloc(strlen(S1)+strlen(S2)+1); fprintf(s,"%s%s",S1,S2);

пожалуйста, перед тем как писать код на С или на С++ познакомьтесь с описанием используемых вами функций.

похоже, именно в этом стиле пишутся сервисы яндыкса.

вы случайно не один из их мега-крутне-программистов?

- и как такие люди проходят собеседование??? по квоте клуба секс-меньшинств ?

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

> fprintf(s,"%s%s",S1,S2); ...

функция fprintf в первом аргументе ждет FILE* а для вашей затеи подходит лучше sprintf

spigel
()

>char *message = malloc(strlen(text_1)+strlen(text_2)); strcpy(message, text_1); strcpy((message+strlen(text_1)), text_2);

>P.S. набросал код прямо в окно, должен работать)))

м-да, вот это мне нравится - жабники просят сложить 2 строки, а тут такой финт - никакой абстракции))) очевидно, что C и Java - абсолютно разные идеологии.

anonymous
()

Порадовала фраза

"I’m not too sorry for IBM - I neither enjoyed using their VM on an appserver (guess which one…) " (с)

:)))))

Ждем комментов от IBM_DW. :)))

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

> В этом топике горе-С-шники уже нам продемонстрировали кучу глючного кода, который должен выполнять ПРОСТЕЙШУЮ задачу

Простейшую задачу выполняет функция strcat - для конкатенации однооктентых строк и wcscat для юникодных и нехрен городить непортабельный велосипед.

> В С/C++ слишком много мест, где можно совершенно случайно отстрелить себе ногу

За С++ говорить не буду, cам язык "типа знаю", но не пишу и с подводными камнями не знаком. На C да. Только и оперативный простор побольше. К тому же если делать проект поэтапно, отладив все тонкие места (снизу вверх), не так уж он и опасен.

> В общем, в большинстве случаев сравнительно небольшие тормоза по сравнению с C/C++ стоят тех дополнительных возможностей

Тогда, просто ради интереса. Покажите нечто хорошо написанное на жабе. А то в продакшене она всем сливает со страшной силой, а от ее сторонников аргументов кроме "хреновые программисты писали" больше ничего.

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

> C - мрачно-страшный инструмент для реализации чего-либо более сложного чем прослойка между железкой и собственно программой.

>> для всяких быдлокодеров - да

читай по буквам( может несколько раз - если с первого не доходит ), может хватит уже троллить, а?

lester ★★★★
()
Ответ на: комментарий от kost-bebix

Чему не веришь? Тому, что не умение выбирать инструменты работы приводит к затратам на порядки выше вменяемых?

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

>Нет. В Java есть специфицированная модель памяти и примитивы >синхронизации. Причём благодаря встроенности синхронизации возможны >оптимизации, недоступные в C/C++. Например, lock elision с помощью >escape analysis.

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

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

>и в чем принципиальная разница между языками? по мне так, PHP - иммитация C, Java - диалект C++

Лол, а эсперанто - диалект английского. Буквы-то одинквовые!

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

> char *message = malloc(strlen(text_1)+strlen(text_2)); strcpy(message, text_1); strcpy((message+strlen(text_1)), text_2);

Lisaac (быстрее С++, прототипное ОО, generics, динамическое наследование, first-class блоки кода):

+ message : STRING; message := text1 + text2;

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

> Лол, а эсперанто - диалект английского. Буквы-то одинквовые!

различия "C++ vs Java" - на уровне "русский vs украинский"
я б сказал Java упрощенный C++. Новичкам рекомендую изучать C++
по учебникам Java.

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

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

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

> char *message = malloc(strlen(text_1)+strlen(text_2)); strcpy(message, text_1); strcpy((message+strlen(text_1)), text_2);

мой легкомысленный анонимный брат. работать то, что вы написали конечно не будет, ибо сделана неправильная аллокация в начале. правильно: char *message = calloc(strlen(text_1)+strlen(text_2)+1, sizeof(char)); strcpy(message, text_1); strcpy((message+strlen(text_1)), text_2);

PS. капча linker как бы говорит о том, что всё взаимосвязано.

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

> эрланг

за эрланг - зачот. интерейсный зверь, но сам лично не знаю/не пробовал.
Хотя вот стоит задачка - обернуть матрицу размером 10^6 x 10^6
на 8и-корном проце (еще лучше на GPUах). Где Ваши erlangи и Java?

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

> удивительно, что сами веб-сервера написаны на C. > btw, не знаю ни одного (без якзотики, простейший я и сам на пишу in 5мин на любом языке) написанного на какоми-нибудь другом (java, php, даже C++).

Apache Tomcat. Написан на Java. :P

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

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

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

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

> > Да и на счет простоты и изящества ты загнул. А ну сложи 2 стринга переданных в качестве параметров:)?

> char *message = malloc(strlen(text_1)+strlen(text_2)); strcpy(message, text_1); strcpy((message+strlen(text_1)), text_2);

Тут уже не помочь! man 3 strcat.

return strcat(str1,str2);

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