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

> Отклонение от HotSpot 6 - единицы процентов, в разные стороны на трёх разных машинах (Celeron, Athlon, Core 2 Duo), только вот на первых двух памяти маловато оказалось для 16x16.

Оп-па! Современные технологии в действии - не заметил, что на машине с Core 2 Duo одно ядро уже принялось за ночную сборку. Завтра перемеряю.

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

> Оп-па! Современные технологии в действии - не заметил, что на машине с Core 2 Duo одно ядро уже принялось за ночную сборку. Завтра перемеряю.

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

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

у меня к сожалению нет времени искать так что google вам в помощь -
ищите по ключевым словам terekhov java dcl dci если интересует код, то
вот он 


 class Singleton { 
    private static Singleton theInstance; 

    private static final ThreadLocal perThreadInstance = 
      new ThreadLocal() { 
          // initially (per accessing thread) 
          // called by ThreadLocal.get() below 
          public Object initialValue() { return createInstance(); } 
        }; 

    public static Singleton getInstance() { 
      // 1st check w/o synchronization; inside 
      // ThreadLocal.get(); it calls initialValue() 
      // ONCE PER ACCESSING THREAD (with respect 
      // to its instance of thread local variable 
      // "perThreadInstance" 
      return (Singleton)perThreadInstance.get(); 
    } 

    private static synchronized Singleton createInstance() { 
      // 2nd check; synchronized; guaranteed to occur 
      // ONCE PER ACCESSING THREAD/SINGLETON; that solves 
      // the problem of memory synchronization (w/o use 
      // of explicit read/write memory barriers or 
      // excessive locking) at expense of thread 
      // specific data access overhead. 
      if (theInstance == null) 
        theInstance = new Singleton(); 
      return theInstance; 
    } 

  }

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

> по какому-то странному времени это ядро живет ... вроде день ещё ...

В Сибири тоже читают ЛОР, если что.

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

>Увы, нет ни одного 3D моделлера, музыкального или видео -плеера, браузера, файлового менеджера, графического редактора, текстового процессора хоть сколь-нибудь популярного и написанного на ява.

Есть. Дальше что?

>и кстати, здесь из десктопного софта, кроме специализированного для разработке на ява, собственно почти и не было представлено.

А те 100 програм что я привел?

>Вы голословны.

Нет - я имел опыт.

>На них нет ни одной на ява.

ДУмаешь не правильно. Посчитай список тех коотрые начали свою историю после 2000 года.

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

Что-то мне подсказывает что бессмыслено продолжать беседу с вами. Сколько этих апачей является фронтэндами? Сколько IIS ов является фронтендами для .NET?

Да - томкет не ставят на хостинг для PHP - у него другая цель. Хостинги жабы - есть.

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

> В офтопике есть тенденция небольшие гуевые прилады утилитки писать на шарпе. Я не понимаю смысл здесь спорить с очевидным.

Замечательно. Теперь сделайте очевидный вывод - шарп по скорости та же жаба. По потрохам - та же жаба. ТАк в чем проблема? А в культуре - и все. MS пересадил своих программистов с делфи и С++ на С# - вот и появились прикладки на C#. НА жабу никто не пересаживал десктопных программистов. Но это ничего не говорит о подходимости и неподходимости жабы.

>AWT?

Любой.

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

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

Правильно. Но это не потому что аплеты плохие - просто их рынок - специфический.

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

>Идите и ещё раз внимательно читайте что я писал. Каждый чих разъяснять не буду. Работайте мозгом.

Крон не парься - он не умеет - он на четвертом курсе пока не научился. Что толку обяснять реальный опыт студенту.

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

>И вообще я думал, что в те далекие времена слабых компов жаба своей замечательной JIT-оптимизацией должна была быть единственым спасением и лучом света в темном царстве?

Где ты тут увидел слово десктоп? Я говорил о серверном приложении.

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

>Не приходило в голову, что эти IDE удобны для жавы, причём именно в силу особенностей жавы? Для shell/tcl/perl/pascal/чего_угодно_ещё эти "IDE" будут всего лишь оченб-оченб тормозным редактором с подсветкой синтаксиса.

Нет. Попробуй. Посмотри как идея работает с руби или жабаскриптом - и єто слабо - пока они на язіки не ориентируются - до 8ки. Тут проблема не в невозможности - просто для этих языков нет достаточного рынка для написания аналогичных жабе функций - ниго принципиального нет тут (если не считать С)

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

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

НУ - не обязательно - скорее сложно. Но ты же упоминал тиклишелыпитонорубипрочиехаскелиэрланги. К ним - наура.

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

> Тут проблема не в невозможности - просто для этих языков нет достаточного рынка для написания аналогичных жабе функций - ниго принципиального нет тут (если не считать С)

"Прожевать" автоматически нельзя не только C. Любой язык с инструкцией eval ни одна IDE в полной мере обработать не сможет. В т.и. и JavaScript.

Например, как понять, что в нижеприведённом коде в определении строковой переменной надо делать, к примеру, автокомплит.

var s = 'alert()';
setTimer(s, 1000);

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

> Но ты же упоминал тиклишелыпитонорубипрочиехаскелиэрланги. К ним - наура.

Ладно, вот пример на тикле :)

set body "print Hello"
proc printHello {} $body
printHello

Как такое "прожевать"?

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

>Получилось неожиданно показательно :)

Почему неожиданно? вон тут две строки нормально сложить не могут....

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

> set body "print Hello"

s/print/puts/ , но это особой роли не играет

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

>В таких конторах фонт-серверы есть, учитывая наличие маков - стопудово.

Я сказал для примера - если бы я ляпнул что-то типа overprint - тут меня бы поняли две с половиной головы- и ты не из их числа если задаешь такие вопросы.

>При нынешних гигабитных сетевухах ага

А каналы между австралией и англией у тебя тоже гигабитные?

>4-6 ниагар за глаза

Кому - фотографу? Или верстальщику печатной пдфки? Это знаешь такие люди - один фотографируюет, а десяток вторых сидит в подвале и плакаты верстает для ператов карибского моря в румынии. Распечатают то иъх какое нить крупное издательство в Лондоне - но сверстают румыны за 400$ в месяц.

>В жабе ? Нах.

Не мля - на С++. Шутник.

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

>На Си определено и этим пользуются - if (p && strlen(p) > 0) {...}

Вообще-то, так практически на любом языке, имеющим сишный синтаксис, от Java до PHP :)

if($var != NULL && $var->id()) { ...

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

Спасибо, буду знать.

Мне это не кажется простой очевидной вещью, которой пытается быть Java.

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

> 100% автокомплит не нужен, достаточно 99%.

У меня в некоторых местах таких неавтокопмлиятщихся место до 30% бывает.

> Кстати, зачем вообще это нужно? До сих пор не понимаю.

Что: автокомплит или eval?

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

> У меня в некоторых местах таких неавтокопмлиятщихся место до 30% бывает.

Зачем?

> Что: автокомплит или eval?

eval. В том случае обычного замыкания хватило бы.

PS Tk/TCL не знаю, буду благодарен за объяснение на JS.

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

>>На Си определено и этим пользуются - if (p && strlen(p) > 0) {...}

>Вообще-то, так практически на любом языке, имеющим сишный синтаксис, от Java до PHP :)

В плюсах - сишный синтаксис, однако в случае перегрузок && неопределено. Хотя при желании понтануться можно operator&& использовать для пайплайнов типа result r = op1 && op2("xx") && op3("yy").

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

>> У меня в некоторых местах таких неавтокопмлиятщихся место до 30% бывает.

> Зачем?

Потому что так удобнее.

>> Что: автокомплит или eval?

> eval. В том случае обычного замыкания хватило бы.

В том случае - да. Но в тикле замыканий как языковой конструкции нет, ибо есть eval.

> PS Tk/TCL не знаю, буду благодарен за объяснение на JS.

setTimer. Или в JS появились замыкания?

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

Угу, я даже видел библиотеку, где это реализовано. Типа шелла. Там и | и || было, даже перенаправление с похожим синтаксисом было.

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

> Хотя при желании понтануться можно operator&& использовать для пайплайнов типа result r = op1 && op2("xx") && op3("yy").

В этом случае красивее будет перегрузить operator|.

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

>Угу, я даже видел библиотеку, где это реализовано. Типа шелла. Там и | и || было, даже перенаправление с похожим синтаксисом было.

Хз. Я бы такую перегрузку делал с целью сознательного вандализма против с++ - проекта. Кстати, это идея.

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

>Например, как понять, что в нижеприведённом коде в определении строковой переменной надо делать, к примеру, автокомплит.

Это надо понимать так что автокомплит в ней делать - не надо:) Равно как и все строчные евалы (хотя и это можно - посмотри на анализ регеэкпов внутри строк).

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

>> Или в JS появились замыкания?

> А когда их там не было?

Блин, и правда! Спасибо.

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

P.S. А ведь и в жавке в её рефлексией тоже кодоразборщики некорректны. Достаточно сослаться на метод по его строковому имени.

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

> Хз. Я бы такую перегрузку делал с целью сознательного вандализма против с++ - проекта. Кстати, это идея.

У Трупострауса к главе о перегрузках, емнип, есть домашнее задание: попробуйте отстрелить себе яйца с помощью перегрузки и больше так не делайте :)

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

>Как такое "прожевать"?

Либо сложно либо ненужно. Сложно - когда в дереве будет отмечено что переменная эвалюэйтится как код и дальше ссылка помечена как код внутри строки.

По простому - это делать не нужно. Что - eval самая большлая проблема чтоли?

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

> Это надо понимать так что автокомплит в ней делать - не надо:) Равно как и все строчные евалы (хотя и это можно - посмотри на анализ регеэкпов внутри строк). 

Ну вот у меня следующий кусок кода. И я хочу, чтоб под лямбдой у меня был автокомплишен, но вот аргумент этой функции, увы, строка.

list -text [ mc "Move up" ] -command [ lambda {w} {
                        set item [ $w focus ]
                        if { $item == "" } return
                        set parent [ $w parent $item ]
                        set childs [ $w children $parent ]
                        set pos [ lsearch -exact $childs $item ]
                        if { $pos > 0 } {
                            lset childs $pos [ lindex $childs [ expr $pos - 1 ] ]
                            lset childs [ expr $pos - 1 ] $item
                            $w children $parent $childs
                        }
                    } $v ]

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

>PS Tk/TCL не знаю, буду благодарен за объяснение на JS.

Эээээ ну что-то типа:

var body = "alert('hello')";

function hello() { return eval(body); }

hello();

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

>Или в JS появились замыкания?

Таки всегда были.

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

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

Теперь подходящий метод выфетчивают по runtime-аннотации в основном.

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

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

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

> По простому - это делать не нужно.

Что там наш keeg говорил про "не нужно"? :)

> Что - eval самая большлая проблема чтоли?

Да. Потому что без разбора eval-а любую утилиту для мегарефакторинга кода, например, на tcl можно будет использовать только с некоторым его подмножеством, заведомо не совпадающим с самим языком.

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

> Теперь подходящий метод выфетчивают по runtime-аннотации в основном.

Ну так старый вариант не отменили. Что ломает всю красивость и всеприменимость утилит для работы с кодом.

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

> Эээээ ну что-то типа:

> var body = "alert('hello')";

> function hello() { return eval(body); }

> hello();

Это я знаю, зачем это надо? Почему не

function hello() { return alert('hello'); }

hello();

Может я чего то не понимаю? Я на JS писал не очень много, но считаю, что язык более-менее почувствовал, и ни разу не было необходимости использовать eval.

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

Угу, меняешь имя метода и оно крошится. Да и рефакторинг не в 100% случаев работает корректно.

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

>И я хочу, чтоб под лямбдой у меня был автокомплишен, но вот аргумент этой функции, увы, строка.

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

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

>> Хз. Я бы такую перегрузку делал с целью сознательного вандализма против с++ - проекта. Кстати, это идея.

>У Трупострауса к главе о перегрузках, емнип, есть домашнее задание: попробуйте отстрелить себе яйца с помощью перегрузки и больше так не делайте :)

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

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

> Я на JS писал не очень много, но считаю, что язык более-менее почувствовал, и ни разу не было необходимости использовать eval.

Значит просто не сталкивался с такими задачами. И неудивительно, ведь js редко используется для чего-то масштабного(в основном из-за зоопарка браузеров с различной степенью его поддержки).

А вообще, автоматические утилиты для javascript сломает и стандартный примём document.getElementById("image_"+i);

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

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

Проблема не столько в комплишене, сколько в умении выделять контексты. И наличие eval-а сломает не только автокомплишен, но и автоматическое переименование, call hierarchy, дебаггер, измерение coverage...

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

Наверное. Собственно писал я Firefox-овый addon и с несовместимостью, по понятным причинам, дела не имел :)

К тому же один мой знакомый замыслил написать такую штуку: из EcmaScript-а генерировать версии для конкретных браузеров и автоматически разруливать как можно больше несовместимостей. Т.е. программист пишет один текст, а потом транслятор делает из него n копий для популярных браузеров (или в apache можно встроить). И eval тут, по понятным причинам, портит всю малину.

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

>> Теперь подходящий метод выфетчивают по runtime-аннотации в основном.

>Ну так старый вариант не отменили. Что ломает всю красивость и всеприменимость утилит для работы с кодом.

Старый вариант со строчными именами функций использовался либо для мэйтенансных библиотек вроде как в JUnit либо для xml-маппингов вроде как в Hibernate или Axis либо для отвратительного быдлокодинга никому не нужного быдлокода.

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

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

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

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

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

Ты сам говоришь что в жабе есть рефлекшен что ставит аналогичную eval проблему. Еще в жабе есть всякие фреймворки которые делают ссылки на классы в виде строковых литералов - .properties файлы, xml-конфиги, ссылки в строках. Из этого проистекает что эффективного рефакторинга под жабу не существует? Таки вот он - есть.

Это достигается:

1. слушателями рефакторингов которые умеют хедлись специфику (например есть плугин для junit которы двигает и переименовывает TestCase к классу при переименовании того или другого) и понимают что вот в этом xml - ссылка на класс.

2. статический анализ - clazz.getMethod("myMethod") - известная конструкция - так можно обработать рефлекшен

3. поиск по строкам и распознавание как "очевиджных совпадений - полное квалифицированное имя) и возможных совпадений - и предложение пользователю.

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

Это в любом случае _лучше_ чем ничего и это покрывает 95%. И это реализуемо вразумных пределах для всех этих языков кроме С где нужно писать макропроцессор.

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

>Может я чего то не понимаю?

Синтетический пример демонстрирующий код как строковый литерал.

> Я на JS писал не очень много, но считаю, что язык более-менее почувствовал, и ни разу не было необходимости использовать eval.

В js такое редко.

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