【发布时间】:2012-02-01 19:27:18
【问题描述】:
我是计算机视觉领域的新手,最近我使用 OpenCV 和 Java 实现了一些示例。我对该领域的潜力印象深刻,并希望继续学习更多。
我了解到 OpenCV 是用 C++ 编写的,而 Java 有一个包装器 (JavaCV),我知道 Java 中的应用程序比 C++ 慢,而且大多数企业应用程序都是用 C++ 编写的。
我的问题是:我有几年的 Java 经验,我觉得用它编写任何应用程序都很舒服;转向 C++ 学习 CV 是否明智,或者我应该坚持使用 Java 并使用它的包装器。
【问题讨论】:
-
Java 并不比 C++ 慢很多。从迁移到 C++ 所带来的性能提升肯定不够大,以至于值得你为此放弃多年的 Java 经验。我会使用 Java 包装器,然后 如果 你发现你需要额外的性能提升,你可以考虑用 C++ 重写,但可能你会发现 Java 版本就可以了。
-
似乎任何 API 的“包装器”都有固有的开销。这是否会产生明显的差异取决于开销的性质以及被调用的功能。例如。如果单个方法调用在本机代码中导致 1/20 亿 CPU 操作,则包装器的开销可能可以忽略不计。我会说最好写一些简单的测试用例应用程序。并针对典型用法对它们进行概要分析。
-
如果 JavaCV 封装了 OpenCV 并且做得很好,它应该同样快。包装库往往会变得更快,因为它们更粗粒度;当使用更快的语言完成更多循环时。
-
Java 实际上可以比 C++ 更快(反之亦然),但总的来说它是一个洗牌(除了语言规范限制 Java 的某些领域 - 以及 JVM 甚至比 C++ 编译器更弱的向量化) . @Andrew 如果我们使用相同的语言(应该内联),一个典型的包装器应该没有任何开销。 JNI 调用是这里的问题,因为它确实有一些固有的开销,并且在某些情况下可能需要大量编组 - 不过取决于 API。
-
@AndrewThompson C++ 的包装器存在一些非常可怕的陷阱,它们会降低性能并且难以避免。但基本上你是对的。 OP:如果您没有 C++ 经验,那么您的 C++ 代码很有可能会比 Java 代码慢。学习 C++ 的开销也是不可忽略的。
标签: java c++ opencv computer-vision