我是一名Java程序员,最近我开始进行竞争编码(Codechef,Hackerearth等)。
我有一种感觉,当涉及到非常大的输入值时,Java中的位操作非常慢。根据我的经验,相同的C / C ++代码(同样的意思是,如果从具有相同算法,相同策略等的java转换而来,我在从Java转换为C / C ++或反之亦然时不改变我的逻辑< / em>)成功运行所有测试用例,在Java中生成超出时间限制。我知道大多数竞争性编程站点为Java程序提供了2倍的执行时间,但它仍然超过了时间限制。
在像C ++这样的语言中,我们有像__builtin_popcount
这样的函数可以利用非常快的CPU内置函数。这些东西在Java中不可用。某些功能(如java.lang.Integer.bitCount()
)仅适用于32位int
。
那么我们是否应该选择C ++来解决这些问题呢?我们是否应该考虑使用Java解决位操作类型问题?如果没有,那么有没有超快的高效技巧而不是应用我们自己的逻辑?
(还有一个事实是,不同的架构机器将花费不同的时间,但我们忽略它。我的问题是在竞争性编程的背景下)
答案 0 :(得分:3)
Long
也有bitCount,而lowOneBit,numberOfLeadingZeroes,numberOfTrailingZeroes等。
然后有BitSet
,更多用于布尔目的。
由于Just-In-Time编译器没有启动,这些操作在小型短期运行程序中非常慢。
Java不是C,但是为了那些操作而将java程序内部还原为C / C ++,由于JNI开销通常不值得。
直到现在我发现java足以达到类似的性能,即使人们不会期待它。在分配中,java有时可以击败C / C ++。但是没有人在计算级别上击败C,例如n % 12
是如何计算的。