Есть ли какие-либо тесты для сравнения доступа к памяти с кучей памяти в областях Java Unsafe vs. Java и C? Например, библиотека сжатия Java LZ4 (или L4Z?) Заявила, что их порт Java, использующий Unsafe, составляет 66% от скорости реализации нативного C.Java Unsafe Memory Manipulation против Java vs. C
Вопрос: Есть ли что-нибудь, что может дать мне (лучше) оценку?
Интересно, стоит ли искать решение C для определенной библиотеки, если у вас есть Unsafe и какие части я должен порвать. Использование памяти кучи или памяти кучи с большими массивами (мегабайт) может быть не такой большой сберегательной. Единственное, о чем стоит упомянуть, это то, что использование небезопасных я могу использовать то, что когда-либо гранулярность я хочу, читая целые числа при любом смещении вместо байтов и так далее. Это значительно улучшит алгоритм для одной проблемы, которую я пытаюсь ускорить.
Вы правы. Я хотел также добавить, что автор скомпилировал весь источник c вместе с C++, используя свой процессор в качестве целевой платформы, давая gcc шанс сделать обычную оптимизацию, которую можно ожидать. Поэтому я думаю, что он дал ему наилучшую возможность. И да, вы правы. Я не стремлюсь к абсолютным, но относительным цифрам. Возможно, в этом отношении имеется тяжелый алгоритм доступа к памяти или эталонный тест. –
gcc может быть хорошо оптимизированным компилятором (когда используется '-O3') или плохо оптимизированный компилятор (когда используется' -O0'). В любом случае, я фактически склонен к C, потому что все объяснение неопределенного поведения - это оптимизация. В C нет ограничений на проверку, потому что это может привести к дополнительным требованиям времени выполнения. Не говоря уже о сборке мусора на Java. Код GC'd может быть оптимальным, но не GC-кодом Java. Даже при использовании Java Unsafe все еще есть сборщик мусора, пытающийся вернуть объекты в фоновом режиме все, что является одиноким, а не использовать подсказки разработчика. – Sebivor
Это миф о том, что у C нет сборщика мусора. C не требует сборщика мусора, но существует возможность для 'malloc' выделять по доверенности GC и' free' для предоставления подсказок GC. Точно так же C не требует проверки границ, но у clang есть [адрес дезинфицирующее средство] (http://clang.llvm.org/docs/AddressSanitizer.html), который выполняет проверку границ между прочим (по цене). Мне кажется, что любая оптимизация, которую выполняет компилятор Java, может выполняться компиляторами C, но похоже, что компиляторы Java не могут выполнять все оптимизации, которые могут использоваться компиляторами C. – Sebivor