在前一篇文章Java的大内存分页支持,曾经谈及Java矩阵乘法程序效率低下的两个原因,Cache Miss和TLB Miss。在那篇文章中,我们通过使用大内存分页,消除了TLB Miss对性能的影响,性能因而提高了60%以上(76秒 -> 45 秒)。但Cache Miss对性能的影响依旧存在。
CPU的一级数据缓存(L1 Data Cache)通常采用组相联的方式来缓存数据,数据缓存是以Cache Line为单位进行的,即缓存不命中时,相邻的一组数据将被载入Cache Line,而不仅仅是当前数据。Core 2架构处理器L1 Data Cache是8路组相联的缓存,每个Cache Line大小为64字节,总共是32K字节。所以,为减少Cache Miss的出现,每个程序指令读取的数据最好是相邻的。而在传统的矩阵乘法程序中,却恰恰违背了这一点。
for (int i = 0; i < 2048; i++)
for (int j = 0; j < 2048; j++)
for (int k = 0; k < 2048; k++)
res[i][j] += mul1[i][k] * mul2[k][j];
每次乘法运算中,mul1二维数组所取的值都与上一次乘法中所取的值相距8KB(2048*4)之远。显然,几乎每次乘法运算中都将出现一次Cache Miss。通过改进算法,我们可以保证每次取值都相邻,从而大大减少Cache Miss的可能。
for (int i = 0; i < 2048; i++)
for (int k = 0; k < 2048; k++)
for (int j = 0; j < 2048; j++)
res[i][j] += mul1[i][k] * mul2[k][j];
很简单,只需将循环中J和K的位置调换一下,就能够保证所有的数组(res, mul1, mul2)每次取值都与上一次相邻。最终,程序因为Cache Miss的大大减少而效率大增。改进后的程序,运行时间为13秒,性能比使用大内存页的情况还提高了两倍多(45秒 -> 13秒)。实际上,改进后的程序还带来另外一个影响,即由于读取的数据位置相邻,TLB Miss的频率也大为下降。经测试,同样的程序在大内存页(2M)和普通内存页(4K)的情况下,运行性能是一样的,均耗时13秒。
Cache Miss和TLB Miss的解决似乎都很简单,但要如何发现这些问题却不容易,许多Java性能监控工具通常也不能给出相关的分析。接下来的文章,将介绍如何发现这些微妙的Java性能问题。
分享到:
相关推荐
Intersystems提供了适用于Java的JDBC驱动,它允许Java应用程序与Cache进行通信。驱动通常以`.jar`文件的形式提供,需要将其添加到Java项目的类路径中。 2. **连接字符串**:建立连接时,需要一个连接字符串,该字符...
在本实验中,我们使用了两个程序来测试Cache的大小对系统性能的影响。程序1是一个一般的矩阵乘积算法,而程序2是一个基于Cache的矩阵乘积优化算法。我们可以看到,程序2的执行时间远远小于程序1的执行时间,这是因为...
java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例 java 缓存 cache lru 实例
Cache的工作流程主要包括:加载(Load)、命中(Hit)、未命中(Miss)和替换(Eviction)。当CPU请求的数据在Cache中存在时,称为命中;若不存在,则称为未命中。未命中时,需要从主内存中加载数据到Cache,并可能...
Java 本地缓存基于 LoadingCache ...基于 LoadingCache 实现 Java 本地缓存可以提高应用程序的性能,并提供了许多有用的特性。通过设置缓存池大小、缓存项过期时间、缓存项移除监听器等,可以灵活地控制缓存的行为。
CacheClient
7. **日志优化**:日志输出应有控制,避免在生产环境中输出过多的日志,影响程序性能。可以使用日志级别(如DEBUG、INFO、WARN)来控制,并考虑使用异步日志记录,以降低I/O阻塞。 8. **监控与诊断**:使用工具(如...
总结,通过Java实现缓存机制,不仅可以提升应用程序的性能,还能帮助开发者深入理解数据结构和算法,以及它们在实际问题中的应用。无论是随机、FIFO还是LRU,每种策略都有其适用场景,开发者应根据具体需求选择合适...
EHCache 是一个纯 Java 缓存实现,主要用于提高应用程序性能。它通过在内存中缓存数据来减少对数据库或其他外部系统的调用次数,从而加快应用响应速度。EHCache 可以作为一个本地缓存解决方案,也可以作为分布式缓存...
Cache Miss(解决方案).md
Java 缓存是一种提高应用程序性能的关键技术,它通过存储经常访问的数据来减少对数据库或其他慢速资源的调用。在本文中,我们将深入探讨Java缓存的简单应用,并结合给出的资源——“JAVA的缓存应用.ppt”来进行讨论...
J2Cache 是 OSChina 目前正在使用的两级缓存框架(要求至少 Java 8)。第一级缓存使用内存(同时支持 Ehcache 2.x、Ehcache 3.x 和 Caffeine),第二级缓存使用 Redis(推荐)/Memcached 。 由于大量的缓存读取会导致 L2...
"Java虚拟机中的动态锁...Java虚拟机中的动态锁cache优化方法可以作为提高Java程序执行效率的一种重要技术。通过分析Java虚拟机中的编译方法调用规律,可以设计出动态锁cache优化方法,以提高Java虚拟机的执行效率。
**ShiftOne Java Object Cache** 是一种细粒度的对象缓存解决方案,主要针对Java应用程序中的对象管理问题。它作为Java标准库的一部分存在,主要用于解决非持久化对象的状态管理问题。ShiftOne的主要特点是: - **...
ARP Cache Miss(处理方案).md
1. **代码优化**:代码质量直接影响程序的运行效率。优化代码包括避免冗余计算,减少循环内的复杂操作,合理使用数据结构和算法,以及采用更高效的设计模式。例如,避免使用过多的if-else语句,利用Java 8的Stream ...
Java cache 实现是指在 Java 项目中使用缓存机制来存储数据,以提高应用程序的性能和效率。在这里,我们使用 Java 实现了一个简单的缓存系统,使用 HashMap 来存储缓存数据,并提供了获取、设置、删除缓存数据的方法...
JetCache是一款专为Java开发的缓存框架,旨在提高应用程序的性能和响应速度,通过将常用数据存储在内存中,避免频繁地访问数据库或其他慢速数据源。在Java应用程序中,尤其是在高并发、大数据量的场景下,有效的缓存...