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

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

★★★★★

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

>Ну давайте уже финальный вариант, господа сишники, в нормальном оформлении.

Если кому-то поупражняться интересно - вот вызов есть: http://balancer.ru/tech/forum/2008/02/t60021--CHto,gospoda-surovye-S-plus-plu...

4 месяца прошло, желающих решить задачу на Си/Си++ не нашлось. Не смотря на относительно невысокую сложность и опубликованные решения на Java и даже Python :)

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

> Ну давайте уже финальный вариант, господа сишники, в нормальном оформлении.

#include <QString>

int main(int argc, char **argv){

QString result = QString("blah") + QString("blah");

return 0;

}

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

Сиплюсплюсников не звали :) На glib-е круче.

PS а в Qt, насколько я помню, malloc = 0 тоже не обрабатывался (точнее Q_ASSERT-ом проверяется). Не круто.

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

и чо ты будешь делать при malloc() = 0 ?

"У тя кончилась память, балбес! Сходи в магаз и купи еще планку"

имхо ассерт там норм

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

:))) и где гарантия что вызов free_mega_super_cache() вызовется - если память закончилась, на вызов функции может и не хватить.

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

С чего это? Стека то хватит, кончается динамически распределяемая память.

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

> Ну давайте уже финальный вариант, господа сишники,
> в нормальном оформлении.

мой вариант:

cat > string.c << _EOF_
#include <stdio.h>
#include <glib.h>

int main()
{
   gchar *message = g_strconcat("Проверка", ", ", "Проверка!", NULL);
   printf("%s\n", message);
   free(message);
   return 0;
}
_EOF_

gcc -o string `pkg-config --cflags --libs glib-2.0` string.c

ЗЫ терминал у меня UTF8

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

>Или запущу самописный GC. И вообще это моё дело.

Не флейма ради: а что этот ГЦ в С-коде должен делать? По идее он должен утилизировать участки памяти на которые больше не указывает ни один поинтер. В С это мемори лик и в правельно написаной программе такого быть не должно вроде как.

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

>Не флейма ради: а что этот ГЦ в С-коде должен делать? По идее он должен утилизировать участки памяти на которые больше не указывает ни один поинтер. В С это мемори лик и в правельно написаной программе такого быть не должно вроде как.

В Inkscape в зависимостях я узрел какой-то gc дя Си. Что это за чудо правда я пока не смотрел.

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

>В Inkscape в зависимостях я узрел какой-то gc дя Си. Что это за чудо правда я пока не смотрел.

Если ГЦ работает постоянно, то все впринципе нормально. Я не понял смысла "активировать" ГЦ, когда в программе с ручным управлением памятью вдруг закончилось место на хипе.

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

> Не флейма ради: а что этот ГЦ в С-коде должен делать?

Освобождать неиспользуемую память. Для этого придётся ручками инкрементить-декрементить счётчики и сообщать ему, что по такой ссылке лежить память, в которой по таким то адресам записаны другие указатели. Я такого не видел, но представить могу. Или обычный консервативный GC вроде Boehm GC.

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

>Освобождать неиспользуемую память. Для этого придётся ручками инкрементить-декрементить счётчики и сообщать ему, что по такой ссылке лежить память, в которой по таким то адресам записаны другие указатели.

Зачем ручками декрементить счетчики и потом "натравливать" на эти куски ГЦ, если можно просто освободить эту память с помощью фри?

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

Чтобы за жизненным циклом объектов следил не программист а компьютер.

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

А почему тогда спрашиваешь, зачем запускать GC при нехватке памяти? Памяти не хватает, запустили GC, освободили неиспользуемую память, памяти стало хватать, работаем дальше.

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

>А почему тогда спрашиваешь, зачем запускать GC при нехватке памяти? Памяти не хватает, запустили GC, освободили неиспользуемую память, памяти стало хватать, работаем дальше.

Я просто неасили сакральный смысл декрементить вручную каунтеры ссылок и запускать ГЦ, в программе с ручной сборкой мусора, где можно просто сделать фри. Идея ГЦ вроде как в том, что он считает ссылки за тебя(да, я в курсе что современные ГЦ работают сложнее, чем просто банальный подсчет ссылок). Вобщем забей, не думаю что это к теме обсуждения относится...

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

Ну как бы суть GC в том, что он может просмотреть все глобальные переменные и стек, и оттуда уже начать граф используемых объектов строить. В C портабельно это нельзя сделать, поэтому нужно руками говорить, когда мы указатель начали использовать и когда закончили. Тогда можно во-первых удалять все объекты со счётчиком равным нулю, во-вторых находить замкнутые графы объектов, на которые извне никто не ссылается и их тоже удалять. Вообще это был поток мыслей, в реальности это будет очень неудобно использовать (хотя если в С++ поколдовать, то можно чего-нибудь юзабельное придумать). Чаще используют пулы - выделяем память в пуле, освобождать не обязательно, а потом по истечение какой-нибудь операции освобождаем весь пул разом.

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

>Зачем ручками декрементить счетчики и потом "натравливать" на эти куски ГЦ, если можно просто освободить эту память с помощью фри?

ГЦ нужен из-за того, что счётчики ссылок на практике постоянно текут из-за кольцевых ссылок. И их не всегда просто избежать. С другими схемами ручного управления памяти тоже свои проблемы.

Поэтому все, кто говорят "зачем нужен ГЦ, если можно сделать free?" идут в лес, как полные кретины.

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

>Эти "кретины" написали ядро линуха, не забывай.

Те кто пишет ядро, знают что "просто free" - это далеко не всё, что нужно.

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

>Поэтому все, кто говорят "зачем нужен ГЦ, если можно сделать free?" идут в лес, как полные кретины.

Анимус ты дибил. Вопрос был "зачем нужен ГЦ _В ПРОГРАММЕ С РУЧНЫМ УПРАВЛЕНИЕМ ПАМЯТЬЮ_ на Ц".

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

Там без поворотов. Подобное решение я сам писал на сборах в 10 классе за 8 минут, если не ошибаюсь :) Было у нас там такое соревнование :) Впрочем я уже нашёл, там поиск этих поворотов и отражений тупой в лоб. Я думал, там что то хитрое.

Я так понял, можно потоки использовать? Это радует :) Задача хорошо параллелится.

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