2016-07-07 2 views
-1

Я программист Java, и я недавно начал конкурентоспособны кодирования (Codechef, Hackerearth, и т.д ..)Эффективная манипуляция бит в Java?

У меня есть ощущение, что немного манипуляции действительно очень медленно в Java, когда речь идет о очень больших входных значений. По моему опыту, тот же код на C/C++ (К тому же я имею в виду, если он был преобразован из java с одним и тем же алгоритмом, с той же стратегией и т. Д. Я не изменяю свою логику при преобразовании с Java на C/C++ или наоборот), который успешно запускает все тестовые примеры, генерирует предел времени в Java. Я знаю, что большинство конкурирующих сайтов программирования обеспечивают 2x времени выполнения для Java-программ, но все же оно пересекает ограничение по времени.

В таких языках, как C++, мы имеем такие функции, как __builtin_popcount, которые могут очень быстро использовать встроенные функции процессора. Такие вещи недоступны на Java. Некоторые функции, такие как java.lang.Integer.bitCount(), будут работать только для 32-битного int.

Так что мы должны предпочесть переходить с C++ для таких проблем? Должны ли мы даже рассматривать проблемы с типом манипуляции с использованием Java? Если нет, то есть ли супер быстрый эффективный трюки, а не применение нашей собственной логики?

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

+1

Почему этот помеченный C++? Рекомендации по языку действительно не основаны на фактах, мы не можем дать ответ, который не только основан на мнениях. –

+2

Бит-манипуляция не медленна в Java, а Java имеет побитовые операторы, похожие на C/C++. Возможно, вы делаете другие вещи, которые замедляют работу, например, бокс/распаковка. Не видя кода Java, мы не можем сказать, что заставляет его замедляться. – Jesper

+1

В C++ нет '__builtin_popcount'. Если ваша программа не работает, это потому, что ваше решение неэффективно, а не из-за Java. Если вам нужно прибегнуть к встроенным скриптам компилятора, чтобы не наступать на C++, вы делаете что-то неправильно. – molbdnilo

ответ

3

Long имеет bitCount тоже, и lowestOneBit, numberOfLeadingZeroes, номерOfTrailingZeroes и прочее.

И вот BitSet, больше для логических целей.

этих операций в небольших коротких запущенных программах ужасно медленно, как компилятор Just-In-Time не пинать в.

Java не C, но возвращаясь внутри Java программы на C/C++ для тех видов операций, часто не заслуживают из-за накладных расходов JNI.

До сих пор я нашел java достаточным для достижения аналогичной производительности, даже если вы этого не ожидали. Это в распределениях, где Java может иногда бить C/C++. Но никто не сравнивает C на расчетном уровне, как рассчитывается n % 12.

+0

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

Смежные вопросы