LINUX.ORG.RU

Java: как написать быструю программу?


0

0

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

Заранее спасибо.


>как писать быстрые программы на Java

[anshlag]Первым делом берешь С...[/anshlag]

redgremlin ★★★★★
()

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

guest-3484-2009
()
Ответ на: комментарий от a3

Про выделение памяти я знаю. Это у нас на C++ уже давно всё есть. Просто хочется подробней про производительность Java узнать, чтобы знать где и на чём что теряется, а где не теряется.

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

Попробую разъяснить свою позицию. Я понимаю, что на C будет работать быстрее. Я для примера написал два разных варианта умножения разреженной матрицы на вектор и они отличались по скорости раз в сто. Я хочу почитать книгу, чтобы понять эту разницу и выбирать заранее более быструю реализацию. Учитывая выбор реализации я уже буду проектировать классы и программу в целом, и я уже понимаю, что классы будут заметно отличаться от того, что у нас есть на C++.

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

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

Блин! Та реализация что у тебя на С++ быстрей работала, естественно будет быстрей работать и на яве.

>Учитывая выбор реализации я уже буду проектировать классы и программу в целом, и я уже понимаю, что классы будут заметно отличаться от того, что у нас есть на C++.

Особо ничего отличаться не будет, если ты конечно не слишком сильно углублялся в плюснутые извращения:)

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

Интерено, как оно не будет отличаться, если на плюсах я использую std::vector со всеми его достоинствами, а в Java его нету. Приходится использовать простые массивы, а это уже совсем другая песня с точки зрения проектирования классов базовых структур данных и операций с ними.

А так, конечно, for он и в Java for...

P.S. Я углублялся в плюснутые извращения. :-)

yz
() автор топика

Седжвик Роберт «Фундаментальные алгоритмы на JAVA. Части 1-4. Анализ. Структуры даных. Сортировка. Поиск» (пер. с англ.)
Издательство:ДиаСофт
Год издания: 2003 г.
Кол-во страниц: 688 стр.
Переплет: твердый

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

iZEN ★★★★★
()

Принимаешь хорошо тормозящие вещества... Профит!

gotf
()

Алгоритмы от языка не зависят. Теоретически на жабке массивы быстрее, чем коллекции, но из-за отсутствия указателей нет возможности быстро по ним бегать. А в остальном - как в плюсах. Может, и правда лучше _критичные_ алгоритмы в виде небольшой нативной либки сделать?

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

>Может, и правда лучше _критичные_ алгоритмы в виде небольшой нативной либки сделать?

Слишком много гиморроя. Но простой гуглинг по "Java demoscene" показывает что не так уж все и плохо. OpenGL-биндинг там конечно не используется.

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

> Теоретически на жабке массивы быстрее, чем коллекции, но из-за отсутствия указателей нет возможности быстро по ним бегать

arr[i] уже "не быстро"?

no-dashi ★★★★★
()
Ответ на: комментарий от svu

>но из-за отсутствия указателей нет возможности быстро по ним бегать. А в остальном - как в плюсах.

Уверен? Я — нет.
http://www.kano.net/javabench/
— Java уделывает C++ на хэшах и коллекциях. А так же у неё высокая скорость вызова методов и инстанцирования объектов в 4...10 раз.

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

int *pElem = arr;
for (int i=0;i<SIZE;i++) {
  *pElem++ = i;
}
В этом случае нет арифметики для вычисления вида "база + смещение * размер элемента". Что влияет на скорость.

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

> "база + смещение * размер элемента"

Умножение можно заменить сдвигом индекса влево на два (для int[], float[] и Object[]) или три (long[] и double[]) бита.

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

Сделайте:) Для остроты - возьмите не int, а структурку с размером, не являющимся степенью двойки.

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

Да, сдвиг быстрее умножения (хотя для больших структур сдвиг не поможет). Но лучше-то вообще без арифметики.

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

>> Интерено, как оно не будет отличаться, если на плюсах я использую std::vector со всеми его достоинствами, а в Java его нету.

> А это что тогда - http://java.sun.com/j2se/1.4.2/docs/api/java/util/Vector.html ?

А это может хранить только Java объекты и по сравнению с std::vector<double> будет ощутимо тормозить из-за постоянного boxing/unboxing.

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

Интересно, а HotSpot разве не сможет заоптимизировать подобный код на java:

int[] array = ...;
for (int i = 0; i < array.length; ++i) {
 array[i] = i;
}

??

на границы можно не проверять, доступ к элементам идет последовательный

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

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

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

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

Жабка не может не проверять границы. Иначе обещание безопасности будет нарушено

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

>А это может хранить только Java объекты и по сравнению с std::vector<double> будет ощутимо тормозить из-за постоянного boxing/unboxing.

А в _твоей_ java есть не java объекты?

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

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

Страуструп писал, что цикл через a[++i] и ++a должен в современных компиляторах исполняться с одинаковой скоростью.

Так что ява тормозит в других местах... интересно, кстати, в каких.

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

Ах да, я забыл - там же не "структуры" (в случае Object), а "массивы указателей на структуры". Значит, нужно время на разыменование.

Да, с lea должно быть быстро. Но вроде в нее не всякую арифметику запихать можно.

svu ★★★★★
()

> Подскажите, пожалуйста, книгу, в которой написано, как писать быстрые программы на Java.

Подозреваю, что могущие и желающие понять такую книгу давно освоили с++, и так же что это понимают все потенциальные авторы и издательства такой книги...

Но вопрос конечно интересный.

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

>Подозреваю, что могущие и желающие понять такую книгу давно освоили с++

И? То что они осилили с++ не значит что они на нём могут/хотят писать.

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

>Cкорость вызова методов в 10 раз быстрее чем в сипипи? чтото сказками попахивает

Скорость вызова _виртуальных_ методов за счёт run-time оптимизации, которая может инлайнить виртуальные функции. Плюсам такое на дано, потому джава может заруливать когда в прогремме сильная косвенность.

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

>Страуструп писал, что цикл через a[++i] и ++a

По крайней мере VS compiler генерит одинаковый ассмблерный код.

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

>нтересно, а HotSpot разве не сможет заоптимизировать подобный код на java:

Учитывая то, что каждый доступ к оперативки ~150 тактов, к 16 следующим закешированным байтам по ~10 такутов, то сложение за 1-2 такта скорее всего не играет никакой роли.

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

> Скорость вызова _виртуальных_ методов за счёт run-time оптимизации, которая может инлайнить виртуальные функции. Плюсам такое на дано, потому джава может заруливать когда в прогремме сильная косвенность.

Реквестирую пример на обоих языках.

(Оптимизатор явы действительно может развиртуализировать методы, но в этом случае на плюсах нормальный человек *уже* написал невиртуальный метод.)

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

> Учитывая то, что каждый доступ к оперативки ~150 тактов, к 16 следующим закешированным байтам по ~10 такутов, то сложение за 1-2 такта скорее всего не играет никакой роли.

Не в какие ворота не лезет. Скорость прокачки памяти в районе 8 GB/s дает в районе 2 Гигаобращений в секунду.

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

>но в этом случае на плюсах нормальный человек *уже* написал невиртуальный метод.)

Если класс вообще кому-то полезен то его рано или поздно кото-то унаследует. А если нужный метод окажется невиртуальным, то будут искать аффтара с монтировкой.

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

>Не в какие ворота не лезет.

Это когда ЖД через DMA пишет. А когда проц обращается разово - то вот так. Можешь почитать спеки интеловские.

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

>Оптимизатор явы действительно может развиртуализировать методы, но в этом случае на плюсах нормальный человек *уже* написал невиртуальный метод

А вот нифига. Это действительно чувствуется в больших системах с высокой косвенностью - например на серверах с IoC и прочей плагинность.

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

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

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

> А вот нифига. Это действительно чувствуется в больших системах с высокой косвенностью - например на серверах с IoC и прочей плагинность.

На серверах на яве? Ява успешно борется с теми трудностями, которых в плюсах нет.

Реквестирую еще раз примеры на обоих языках.

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

>Тут, конечно, можно выкрутиться, сказав

Про банальную высокую летентность

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

> Если класс вообще кому-то полезен то его рано или поздно кото-то унаследует.

Что ты отнаследуешь из класса DateTime? Или он никому не полезен?

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

>Реквестирую еще раз примеры на обоих языках.

На хелловорлдах это будет нагромождением. Посмотрите архитектуру Eclipse. На с++ такое не построить (да, чисто теоретически написать всё можно и на асме, но такие сферические предположения никому не интересны). И уж точно работать быстрее не будет.

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