Java实时性能

我正在使用 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真的是.那里的课堂数量似乎过高.

我已经用Java完成了计算机视觉工作,我可能会低估这个说法,但它完全可以用于计算机视觉和实时的东西,你只需要知道如何使用它.

潜在优化:

如果您需要帮助优化您的代码,我将很乐意为您提供帮助 – 例如,我可以告诉您,通过制作方法可能会提升性能

`public static final int getGrayScale(final int pixelRGB){
    return (0.212671f * ((pixelRGB >> 16) & 0xff) + 0.715160f * ((pixelRGB >> 8) & 0xff) + 0.072169f * ((pixelRGB) & 0xff));
}`

并在你的{pixel}循环中使用这个.通过使用方法调用,JVM可以更大程度上优化此操作,并且可以更好地优化for循环.

如果您有RAM刻录,您可以为所有可能的24位像素像素颜色创建输出灰度字节的静态最终查找表.这将是RAM中的〜16 MB,但是您不必执行任何浮点运算,只需单个数组访问即可.这可能会更快,这取决于您正在使用的JVM,以及是否可以优化数组边界检查.

找到类似的,更快的图像处理代码的地方:

我强烈建议您查看ImageJ图像处理应用程序的代码(由于StackOverflow被阻止,无法链接)&它的库,特别是ij.process.TypeConverter.就像你的代码一样,它依赖于直接数组操作,并且具有最小的数组创建能力. Java2D库(标准JRE的一部分)和Java高级映像(JAI)库(无法链接,因为StackOverflow被延迟)提供了其他方式来直接对图像数据进行图像处理,而无需每次滚动自己的操作时间.对于Java2D,您只需要小心使用哪些功能.

为什么Java2D库是如此间接的:

大多数“类别”是由于支持多种颜色模型和存储格式(I.E.HSB图像,基于浮动的颜色模型,索引颜色模型).间接存在的原因,有时实际上提高性能 – BufferedImage类(例如)直接钩在最近的VM中的图形内存中,使一些操作更快.间接使它能够在很多时候从用户屏蔽它.

相关文章
相关标签/搜索