当前位置: 首页 > 面试题库 >

Android上的Guava Cache性能不佳

高山
2023-03-14
问题内容

我们在Android应用程序中将加载的Google GuavaLoadingCache用于位图。在应用程序中,我正在运行一个绘图线程,该线程将缓存中的位图绘制到画布上。如果特定的位图不在缓存中,则不会绘制该位图,因此不会有任何加载阻塞图线程。

但是,绘画会导致视觉卡顿,每秒帧数并不是我们想要的。我将其固定getIfPresent()在缓存的方法上。仅此一项就占用了应用程序总CPU时间的20%以上。在getIfPresent() LocalCache$Segment.get()需要的时间超过80%:

请记住,这只是对已经存在的位图的查找。永远不会发生负载get()。我认为get()LRU队列会产生簿记开销,该开销决定了该段是否已满时发生哪个逐出。但这至少比a Key-Lookupin LRU-LinkedHashmap.get()给我的速度慢一个数量级。

如果元素在缓存中,我们将使用缓存来进行快速查找;如果查找速度较慢,则对其进行缓存是没有意义的。我也尝试过getAllPresent(a),asMap()但是它给出了相同的性能。

库版本为:guava-11.0.1.jar

LoadingCache的定义如下:

LoadingCache<TileKey, Bitmap> tiles = CacheBuilder.newBuilder().maximumSize(100).build(new CacheLoader<TileKey,Bitmap>() {
            @Override
            public Bitmap load(TileKey tileKey) {
            System.out.println("Loading in " + Thread.currentThread().getName() + " "
                + tileKey.x + "-" + tileKey.y);

            final File[][] tileFiles = surfaceState.mapFile.getBuilding()
                .getFloors().get(tileKey.floorid)
                .getBackground(tileKey.zoomid).getTileFiles();
            String tilePath = tileFiles[tileKey.y][tileKey.x].getAbsolutePath();

            Options options = new BitmapFactory.Options();
            options.inPreferredConfig = Bitmap.Config.RGB_565;

            return BitmapFactory.decodeFile(tilePath, options);
            }
        });

我的问题是:

我会用错吗?
Android的实现无法实现吗?
我错过了配置选项吗?
这是正在处理的缓存的已知问题吗?
更新:

绘制约100帧后,CacheStats为:

I/System.out( 6989): CacheStats{hitCount=11992, missCount=97,
loadSuccessCount=77, loadExceptionCount=0, totalLoadTime=1402984624, evictionCount=0}

之后,missCount基本上与hitCount增量相同。在这种情况下,缓存足够大,无法进行稀疏的加载,但是getIfPresent仍然很慢。


问题答案:

CacheBuilder是为服务器端缓存而设计的,而并发是首要考虑因素。因此,它需要权衡单线程和内存开销,以换取更好的多线程行为。Android开发应该使用LruCache,LinkedHashMap`或类似的地方单线程性能和存储器成为主要关注。将来可能会出现concurrencyLevel = 0,以指示需要轻量级的非并行缓存。



 类似资料:
  • 问题内容: 作为Java开发人员,我已经习惯了在应用程序中使用依赖项注入。但是对于Android,我尤其对性能保持警惕。在Android应用中使用Guice对性能有何影响?我认为会有一些开销,但是是否足够重要,我应该避免使用Guice? 我对它的使用可能只是将一些共享对象注入到各种活动中。 问题答案: 从版本3开始,Guice缓存反射对象以提高性能。至少有一个针对dalvik的错误可以使注解查找更

  • 问题内容: 与* nix机器相比,Windows上的Python通常会慢吗?Python似乎在Mac OS X机器上火起来,而在Window的Vista机器上 似乎 运行慢。这些机器的处理能力相似,而Vista机器则具有1GB以上的内存。 我在Mercurial中特别注意到了这一点,但我认为这可能只是Mercurial在Windows上打包的方式。 问题答案: 我想对此进行跟进,发现了一些我认为是

  • 我不能再建立我的应用程序了。 我今天下午可以做,但今晚它在代号为One的服务器上崩溃了 谢谢!

  • 问题内容: 在* nix上分析C / C ++应用程序的最佳工具是什么? (我希望配置一个服务器,该服务器混合了(阻止)文件IO,用于网络的epoll和fork()/ execv()来进行一些繁重的工作;但是也欢迎一般帮助和更通用的工具。) 您是否可以将RAM,CPU,网络和磁盘的大系统图统统归纳并深入研究? 关于内核之类的东西,在内核列表上有很多话题,但是我还没有在Ubuntu中发现任何东西。

  • 我有一个PL/SQL过程,它对参数执行大量s。我想删除长度限制,所以尝试将其更改为。 工作正常,但性能受到影响,所以我做了一些测试(基于2005年的这些测试)。 更新:我可以用不同的Oracle版本和不同的硬件在几个不同的实例上重现这个过程,总是明显比慢,而且比慢得多。 Bob的结果和上面链接中的测试讲述了一个不同的故事。 有人能解释这一点吗,或者至少重现鲍勃或我的结果吗?谢了! 测试结果:

  • 我们正在从IBMMQ迁移到Amazon MQ,至少我们希望这样做。问题是Amazon MQ在使用JMS生产者将大消息放入队列时,与IBMMQ相比,性能不佳。 关于IBM MQ,所有消息都是持久的,系统是高可用的,而Amazon MQ是多AZ的。 如果我们将这种大小的XML文件放入IBMMQ(2个cpu和8GB RAM HA实例),我们有这样的性能: 如果我们将相同的文件放在Amazon MQ(mq