我正在使用
Java项目,需要非常高级的图像操作.事实上,我正在使用OpenCV进行大部分操作,我正在使用JNI来包装我需要的OpenCV函数.我对OpenCV的表现非常满意,编写OpenCV代码的人们对代码的值得信赖.与我使用Java开发人员编写的代码形成鲜明对比.
我开始乐观选择我的编程语言,我的第一个工作重复的项目工作正常,但其性能无法实时(每2秒约1帧).我做了一些优化的MY代码和它帮了很多我已经能够将帧速率推高到每秒10-20帧,这是非常好的,但是我发现,要做任何进一步的优化,我必须重写Java代码来做同样的事情,但10 -20倍更高效.
我对Java的开发人员非常关注性能感到震惊,特别是在为Media相关课程编写课程时.我下载了OpenJDK,我正在探索我使用的功能.例如,在Raster类下有一个名为getPixels(…)的函数,并获取图像的像素.我期待这个功能在源代码中是一个高度优化的功能,多次调用System.arrayCopy来进一步优化性能.相反,我发现是非常“Classy”代码,他们正在调用5-6个不同的类和10-20个不同的方法,只是为了完成我可以做的一行:
for (int i =0; i < n; i++) {
long p = rawFrame[i];
p = (p << 32) >>> 32;
byte red = (byte) ((p >> 16) & 0xff);
byte green = (byte) ((p >> 8) & 0xff);
byte blue = (byte) ((p) & 0xff);
byte val = (byte)(0.212671f * red + 0.715160f * green + 0.072169f * blue);
data[i] = val;
grayFrameData[i] = (val & 0x80) + (val & (0x7f));
}
上面的代码将图像转换为灰度,并获取浮动像素数据,大约为1-10ms.如果我想用Java内置函数做同样的事情,那么转换为灰度本身就需要200-300ms,然后抓取浮点像素大约需要50-100ms.这是不可接受的实时性能.要注意加快速度,我大量使用按位运算符,哪些Java开发人员害怕远离.
我明白,他们需要处理一般情况,但即使如此,他们至少不能提供优化选项,或至少提供一个警告这个代码可能执行的速度.
我的问题是,在这个发展的这个晚点(我已经有了我的第一次迭代,不是我在第二次执行更多的实时工作),我应该咬住子弹,并切换到C/C++,我可以罚款或者我应该坚持使用Java,希望事情变得更加实时,这样我就不必重新编写已经实现的Java代码来加快速度.
我真的开始厌恶如何“优雅”和慢Java真的是.那里的课堂数量似乎过高.