2015-04-04 6 views
0

Есть ли какие-либо тесты для сравнения доступа к памяти с кучей памяти в областях Java Unsafe vs. Java и C? Например, библиотека сжатия Java LZ4 (или L4Z?) Заявила, что их порт Java, использующий Unsafe, составляет 66% от скорости реализации нативного C.Java Unsafe Memory Manipulation против Java vs. C

Вопрос: Есть ли что-нибудь, что может дать мне (лучше) оценку?

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

ответ

1

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

Я бы предположил, что автор, «заявив, что их порт Java с использованием Unsafe составляет 66% от скорости реализации нативного C», намерен продать свой продукт, используя любые возможные средства.

Учтите, что в настоящее время нет «родной реализации C», и не будет, вероятно, когда-либо, потому что C был разработан как портативный. Единственное, что «родной» - это машинный код, и даже это иногда вызывает некоторые дебаты. Есть хорошие компиляторы C и плохие компиляторы C. Оба качества формируют «собственный» машинный код. Какой из них использовался в тесте?

Как только вы переводите C или Java в машинный код или байт-код JVM, это уже не C или Java. Это машинный код или байт-код JVM. Это приводит меня к следующему пункту, который я буду выражать в виде вопроса: Если программа в C и программа на Java, которые выполняют одну и ту же задачу, скомпилированы в один байт-код JVM, какая программа быстрее ?

Мы не можем измерить скорость пока мы не приписывание скорости инструкции, кэш-промахов и все это. Хотя их код, возможно, был «66% от скорости реализации нативного C» (что бы это ни значило), они могли бы выполнить некоторые очень искаженные оптимизации, адаптированные к их собственной машине, чтобы получить эти цифры.

Таким образом, тесты, выполненные автором, являются реалистичными, если вы намереваетесь запускать эти тесты на компьютере авторов, что не обязательно является вашим собственным программным обеспечением на вашем собственном компьютере.

+0

Вы правы. Я хотел также добавить, что автор скомпилировал весь источник c вместе с C++, используя свой процессор в качестве целевой платформы, давая gcc шанс сделать обычную оптимизацию, которую можно ожидать. Поэтому я думаю, что он дал ему наилучшую возможность. И да, вы правы. Я не стремлюсь к абсолютным, но относительным цифрам. Возможно, в этом отношении имеется тяжелый алгоритм доступа к памяти или эталонный тест. –

+0

gcc может быть хорошо оптимизированным компилятором (когда используется '-O3') или плохо оптимизированный компилятор (когда используется' -O0'). В любом случае, я фактически склонен к C, потому что все объяснение неопределенного поведения - это оптимизация. В C нет ограничений на проверку, потому что это может привести к дополнительным требованиям времени выполнения. Не говоря уже о сборке мусора на Java. Код GC'd может быть оптимальным, но не GC-кодом Java. Даже при использовании Java Unsafe все еще есть сборщик мусора, пытающийся вернуть объекты в фоновом режиме все, что является одиноким, а не использовать подсказки разработчика. – Sebivor

+0

Это миф о том, что у C нет сборщика мусора. C не требует сборщика мусора, но существует возможность для 'malloc' выделять по доверенности GC и' free' для предоставления подсказок GC. Точно так же C не требует проверки границ, но у clang есть [адрес дезинфицирующее средство] (http://clang.llvm.org/docs/AddressSanitizer.html), который выполняет проверку границ между прочим (по цене). Мне кажется, что любая оптимизация, которую выполняет компилятор Java, может выполняться компиляторами C, но похоже, что компиляторы Java не могут выполнять все оптимизации, которые могут использоваться компиляторами C. – Sebivor