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

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

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

>Забыл в маллоке единицу для окончания строки выделить.

К стати пример показательный. 2 строки нельзя сложить - уже задача.

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

> К стати пример показательный. 2 строки нельзя сложить - уже задача

сначала читать Джоэля, а потом думать про то что есть с++, где можно писать либо простой код, либо более эфективный

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

> сначала читать Джоэля, а потом думать про то что есть с++, где можно писать либо простой код, либо более эфективный

Та да. Но мы ж не про великую уникальную задачу сложения стрингов говорим правда? Это просто показательный пример. C++ этиз проблем решает только библиотеками которые в себя запрятали этот рак - но если надо будет релизовывать что-то ще - вперед и с песней по всем граблям. Вот тут клиент спросил почему у него запись за пределы выделенной памяти работает. Вот объясни ему - язык такой.

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

>Та да. Но мы ж не про великую уникальную задачу сложения стрингов говорим правда?

Так приведите, пожалуйста, эффективную реализацию конкатенации строк на Java.

Разве StringBuffer, StringBuilder не КОСТЫЛИ?

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

> Неправославно, если a и b имеют размер, превышающий несколько миллионов символов.

И что ты от меня хочешь? Я из астрала должен память для результата взять?

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

>Неправославно, если a и b имеют размер, превышающий несколько миллионов символов.

Какакая разница? Временных строк там не будет. Это компилируется в return new StringBuilder(a).append(b).toString();

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

>a + b - сложение строк на жава.

Весьма неэффективное, надо сказать. При этом выделяется кусок памяти размером a.length()+b.length() и производится посимвольное копирование в него последовательно первой и второй строк. После этой операции ссылки на a и b, если они больше нигде не используются, передаются GC для очистки содержимого памяти от a и b.

Память распределяется крайне неэкономно.

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

>При этом выделяется кусок памяти размером a.length()+b.length() и производится посимвольное копирование в него последовательно первой и второй строк. После этой операции ссылки на a и b, если они больше нигде не используются, передаются GC для очистки содержимого памяти от a и b.

Больше никому об этом не говори. И хоть раз декомпилируй этот код.

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

Ты может быть будешь удивлён, но в С сложение строк происходит точно так же. За исключением того, что память удаляется руками (при необходимости).

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

А чем это отличается по сути от вышепреведенного кода на C? *lol*

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

DemoStrings.java:

public class DemoStrings {
    public static void main(String[] args) {
		String a ="a" + args[0];
		String b = "b" + args[1];
		String c = a + b;
		System.out.print("c=" + c);
		
	}
}

DemoStrings.class: размер 910 байт

Декомпилировал, посмотрел.
Какого, спрашивается, рена среда положила туда:
//Method java/lang/StringBuilder.append
???
Я вроде не заказывал...

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

>>a + b - сложение строк на жава.

>Весьма неэффективное, надо сказать.

javac это меняет на new StringBuffer().append(a).append(b).toString(). Оптимизация по ручной замене стрингов на СтрингБуффера устарела 2 my mind.

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

Для -target 1.2, 1.3, 1.4
используется подмена конкатенации строк (операции "+") на:
//Method java/lang/StringBuffer.append

Удивительно!

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

>Для -target 1.2, 1.3, 1.4 используется подмена конкатенации строк (операции "+") на: //Method java/lang/StringBuffer.append

>Удивительно!

Алгоритмически сложного в такой замене ничего нет.

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

> У меня консоль юникодная - передача аргумента русскими буквами говорит что strlen одного символа - 2 - пересматриваем алгоритм и функции - переходим на следующий этап:))

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

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

> используется подмена конкатенации строк (операции "+") на: //Method java/lang/StringBuffer.append

> Удивительно!

В С++ такие вещи делаются на expression templates для любых типов.

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

Это понятно. Но почему про это не говорят явно, а везде говорят (Джоэл Спольски, например) о ручной оптимизации конкатенации строк, в частности для Java с применением StringBuffer|StringBuilder:
http://russian.joelonsoftware.com/Articles/BacktoBasics.html
"Ладно. Жизнь в стране байтов становится всё сложнее. Правда, хорошо, что вам не надо больше ничего писать на C? В нашем распоряжении есть такие великолепные языки, как Perl, Java, VB и XSLT, которые не заставляют думать ни о чём таком низком, они сами со всем как-то справляются. Вот только иногда трубы вылезают в середине гостиной, и нам приходится думать о том, какой класс использовать -- String или StringBuilder, потому что компилятор всё ещё недостаточно умён, чтобы понять, чего же мы собственно хотим достичь, и помочь нам избежать попадания на алгоритм маляра Шлемиэля."

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

>>> a + b - сложение строк на жава.
>> Весьма неэффективное, надо сказать.
>Вы весьма неправы, надо сказать.

И я это уже понял и, главное, рассказал другим. ;)

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

> К стати пример показательный. 2 строки нельзя сложить - уже задача.

ну если избегать ВСЕ библиотеки, кроме как стандартную библиотеку С, то да, задача. Я конечно понимаю что str + str, хорошо, но + у меня как бы больше с арифметической операцией ассоциируется, но это уже мои личные интимные проблемы :-D

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

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

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

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