通过JNI访问C中的缓存

时间:2011-04-04 23:53:26

标签: java c java-native-interface

在C / C ++中构建LRU类型缓存并让Java通过JNI访问它是否有助于提高性能?

4 个答案:

答案 0 :(得分:6)

<强>疑

JVM目前做得相当不错,特别是考虑到任何需要缓存的应用程序可能会长时间保持足够长的时间让JVM对其进行优化。无论你的缓存代码通过避免使用JVM都能获得什么速度,你可能会失去通过JNI来回推送对象。

与Java相比,更不用说C ++代码的固有开发,维护和部署难度。或者通过推出自己的缓存重新发明轮子的危险 - 必须有一些你可以使用的东西,而不是自己推出。

答案 1 :(得分:4)

你几乎肯定不会在这里优化正确的事情。缓存实现很少在大型系统中需要优化的内容。 Java有很多优秀而快速的实现。在本机实现中,你不太可能获得更多好处。即使你可以,你确定真的需要吗?

通常你在缓存周围所做的一切实际上都很重要。数据库查询,阻塞操作和CPU密集型任务。您当然应该分析您的应用程序并仅优化需要它的区域。如果你正在优化只占整体时间5%的东西,那么你只会在最好的情况下获得5%的提升(即如果你的速度非常快)。

我已经处理过具有大缓存的大型系统,并且缓存实现的开销非常低,最多只有一位数百分比。你应该确保你把时间花在正确的事情上。我不是说你可能不需要,我只是说这是值得怀疑的,你应该先验证。您没有表明这种或那种方式,所以我假设您对现有缓存实现没有已知问题。

答案 2 :(得分:1)

JIT编译器非常快。它可以与编译的代码相媲美。

您最好的选择是在最容易开发的任何内容中实现它,然后对其进行分析以识别性能问题。然后,看看你能从那里做些什么。

答案 3 :(得分:1)

不太可能。

缓存适用于堆中的对象。 C ++中的堆内存分配和释放并不比Java更好。实际上,在短期运行的测试中,由于推迟了GC(C ++必须明确地立即释放内存),Java缓存甚至可能会获胜。

由于JIT,其他操作(put,find)预计与C ++相同(这些是热点,很快就会编译成本机代码)。

注意:与性能一样,最终答案只能通过测试获得。