有没有人能假设使用NDK的C代码与Java代码在相同计算中的速度有多快?(如果有的话)
假设我在Java代码中用Y秒钟进行X个计算(相同的计算)。
通过NDK中的C代码,我可以在相同的Y秒钟内完成多少X计算?
1.2?
2.7?
任意猜测数字?
假设计算公式是B=L/A +C/D(对于所有X个计算都相同)。
编辑:
为什么我要问这个问题?
因为我考虑将我的Java处理摄像头帧移动到C代码中,以获得更大的分辨率机会。
有没有人能假设使用NDK的C代码与Java代码在相同计算中的速度有多快?(如果有的话)
假设我在Java代码中用Y秒钟进行X个计算(相同的计算)。
通过NDK中的C代码,我可以在相同的Y秒钟内完成多少X计算?
1.2?
2.7?
任意猜测数字?
假设计算公式是B=L/A +C/D(对于所有X个计算都相同)。
编辑:
为什么我要问这个问题?
因为我考虑将我的Java处理摄像头帧移动到C代码中,以获得更大的分辨率机会。
鉴于没有其他人愿意涉及这个话题,因为认为回答它不太严肃,我来试试:
区别在于多了一个额外的编译步骤,理论上Java应该比C编译器做得更好,原因如下:
然而,Java带来了一些权衡:
GC复制存活对象并扔掉所有死亡对象,由于GC只需处理活着的对象而无需处理死亡对象,理论上比正常的malloc/free循环快。
但是,大多数Java支持者忘记了一件事,那就是在编写C时,并不意味着你必须为每个对象实例都malloc/free。您可以重用内存,可以malloc整个内存块并释放包含数千个临时对象的内存块。
在Java的大堆上,GC时间会增加,添加停顿时间。在某些软件中,当GC清理周期发生时,在定义的毫秒数内使您的软件响应,您将会看到我在说什么。
在一些极端情况下,JIT还可能选择根本不JIT代码。当JIT方法过大时(如果我记得正确,为8K),就会发生这种情况。非JIT方法在运行时的惩罚范围内为20000%(即慢200倍,至少在我们客户那里是这样)。当JVM的CodeCache开始变满时(如果不断地将新类加载到JVM中,这种情况也会发生,也会在客户现场发生),JIT也会关闭。
有一次,JIT统计数据还将一台128核机器的并发性能降到了基本上单核性能。
在Java中,JIT有一定的时间将字节码编译为本机代码,但不可以花费所有的CPU资源用于JIT,因为它与执行程序实际工作的代码并行运行。而在C语言中,编译器可以尽可能长地运行,以生成它认为最优化的代码。这对执行时间没有影响,而在Java中则会有。我的意思是:
所以回答你的问题:
如果只使用预分配缓冲区进行简单的数学计算,那么Java和C编译器应该会生成大致相同的代码。